I wanted to dabble with BLE and learn a bit:
- Can you hack together in your garage an antenna and RF section that will work at 2.4GHz?
- If it works, who good/bad will it be?
- What is hand soldering QFN packages like? Many BLE devices are only available in CSP or QFN48.
If you want to make IoT and Wearable devices that can be controlled from your phone/tablet/whatever, ZigBee is a neat mesh networking technology; but it’s not in any phones. Bluetooth (and more recently) Bluetooth Low Energy is in all of them. It’s easy to write a BLE control app write yourself using the Cocoa frameworks or download one like the excellent LightBlue for iPhone:
Make a Board
So, I broke out Eagle and designed a PCB around the Nordic nRF51822 chip, basing the design on a reference from the Nordic data sheet,
I picked the Nordic device because:
- There aren’t many catalogue BLE devices around yet
- It’s Cortex M0. No need to learn ARC (CSR).
- The CPU is integrated into the SoC (unlike the TI device)
The nRF51822 worked great, but it wasn’t all good. More on that later…
My Eagle board design is on GitHub here.
The most challenging part was the 2.4GHz antenna design. The key decisions were:
- Pi network or balun
- Chip antenna or the “real thing”
Since I wanted some RF experience, I picked both of the harder options i.e. pi network and PCB strip antenna.
This whole project was brought to you by app notes…. the best I found
I used a header board for an STM MEMS evaluation kit in order to take a look at some common MEMS sensors:
- LPS301: Pressure and temperature sensor
- LG3D20: Gyroscope
- LSM303DLHC: Accelerometer and magnetometer
The header was an STEVAL-MKI124V1 which is designed to work with an STM motherboard evaluation system. I took a shortcut and used it with an ARM MBED board featuring an NXP LPC1768 MBED.
Hook-up using I2C was trivial:
The schematic for the evaluation board is here:
The orientation of the sensors on the board is like this:
MBED-based code I write to drive the I2C is on the MBED website here
The code sets up each of the sensors and then provides a continuous output of temperature, pressure and orientation. Rather than optimize for performance or efficiency, the code here is intended to show clearly how to access the sensors.
An interesting twist was to use the linear accelerometer to find the vector of the earth’s gravitational field (i.e. down) and to use that to make a tilt-adjusted compass. Algorithm
I have found that basic example code from MCU suppliers is often too complex. Vendors want to write one example for their entire product range, so you often end up with a spaghetti of code and linker script that weaves in CMSIS, USB, drivers for fancy peripherals and whatever else. Even if you wanted to strip it down to basics, you would have to deal with multiple file dependencies in a web of directories that make the job harder than it should be.
For new board bring up, once I have shown sign of life using low level JTAG (see this post), the next thing I like is the simplest possible software set-up that I can get working.
Nice theory. Where do I download some code? I was surprised at how much I had to search to find anything useful. So this post has a simple example I made for a new STM32F100C8 board. It should work or at least help for many CortexM0 or M3 MCUs.
In the below diagram, the pieces of code we need to supply for this simple approach are in blue:
There are countless
Powering up a new board design or even skiing off-piste with an eval board without vendor-suppled code? This post shows a way to look for first signs of life without depending on working debug toolchain or working target software.
I use a Segger JTAG probe that I covered in a previous post.
Some recent eval boards like the one for Nordic Micro’s nRF51822 ship with an on-board USB debug connection that has a USB-JTAG decoder chip on board. This board uses the same Segger driver as their JTAG box embedded in the decoder, so the below approach should also work.
Segger JLINK application driver has a series of useful commands for examining directly addresses in memory:
- mem Read memory. Syntax: mem , (hex)
- mem8 Read 8-bit items. Syntax: mem8 , (hex)
- mem16 Read 16-bit items. Syntax: mem16 , (hex)
- mem32 Read 32-bit items. Syntax: mem32 , (hex)
Since many MCUs have a factory-programmed ID register, you can use JTAG to read this value and check for signs of life.
To start with, I target a STM32F100C8. This MCU has a register at 1FFFF7E0 hex containing a 16-bit value with the flash size of the MCU. This is covered in the STM32F100 programming manual on