Mottek Archive 2015

Si4012 and CC1101

Something completely different for a change: I recently designed a simple sensor network, and wanted to keep the cost of the sensor nodes down while using the 434MHz band for range reasons. The Silicon Labs Si4012 transmitter fit the bill very nicely, but I was already happily using a Texas Instruments CC1101 radio as the receiver.

Below are the settings for the CC1101 and Si4012, the modulation is 2-FSK and the bit rate is 38.4kpbs. First the CC1101 register settings:

static constexpr uint8_t cc110x_default_init_values[][2] = {
        {CC1101_IOCFG0,      0x2F},
        {CC1101_IOCFG1,      0x2F},
        {CC1101_IOCFG2,      0x06},
        {CC1101_FIFOTHR,     0x47}, // RX attenuation 6dB, 33/32 byte threshold
        {CC1101_PKTLEN,      0x3D}, // 62 bytes max packet length
        {CC1101_PKTCTRL1,    0x0C}, // CRC autoflush, status append
        {CC1101_PKTCTRL0,    0x05}, // TX/RX CRC enabled, variable packet length
        {CC1101_FSCTRL1,     0x06}, // 152kHz IF frequency
        {CC1101_FREQ2,       0x10}, // 434 MHz carrier frequency
        {CC1101_FREQ1,       0xB1},
        {CC1101_FREQ0,       0x3B},
        {CC1101_MDMCFG4,     0xFA}, // 135kHz channel bandwidth
        {CC1101_MDMCFG3,     0x83}, // 38.4kbps symbol rate
        {CC1101_MDMCFG2,     0x06}, // 2-FSK, 16/16 sync word detection, carrier sense
        {CC1101_MDMCFG1,     0x42}, // 8 bytes preamble
        {CC1101_DEVIATN,     0x27}, // 11.9kHz FSK deviation
        {CC1101_MCSM1,       0x3c},
        {CC1101_MCSM0,       0x18},
        {CC1101_FOCCFG,      0x16},
        {CC1101_WORCTRL,     0xFB},
        {CC1101_FSCAL3,      0xE9},
        {CC1101_FSCAL2,      0x2A},
        {CC1101_FSCAL1,      0x00},
        {CC1101_FSCAL0,      0x1F},
        {CC1101_TEST2,       0x81},
        {CC1101_TEST1,       0x35},
        {CC1101_TEST0,       0x09},

And this is the Si4012 configuration (these are properties, to be set via the SET_PROPERTY command:

static constexpr uint8_t pa_config[7] = {0x60, 0x01, 0x71, 0x00, 0x19, 0x7d, 0xff};
static constexpr uint8_t tx_freq[5] = {0x40, 0x19, 0xde, 0x7f, 0x60};
static constexpr uint8_t modulation_fskdev[3] = {0x20, 0x01, 0x0b};
static constexpr uint8_t bitrate_config[4] = {0x31, 0x01, 0x80, 0x04};
static constexpr uint8_t chip_config[2] = {0x10, 0x00};

When sending from the Si4012, the preamble (8 x 0xaa), the sync word (0xd391) and the CRC need to be added manually to the packet.

Slightly strange combination

Continuing the praise for the J-Link SWD/JTAG adapter, it works well in even slighly odd situations. The new Intel Quark D1000 is debugged via JTAG, but uses an IO voltage of 1.8V. My old Olimex ARM-USB-TINY-H adapter doesn't go as low, but using the J-Link with OpenOCD worked like a charm!

Things which Just Work

It's about time to praise two tools which I'm using very frequently and which have saved my day time and again: The Saleae Logic Analyzer and the J-Link SWD/JTAG adapter.

Both tools "just work" without any fuzz, and on my development platforms Mac OS X, Linux and Windows. The Saleae comes with very easy to use software, has nicely engineered hardware, extensibility and awesome support (three years warranty!). The J-Link is maybe not as sexy, but it handles the key task of debugging, flashing and interfacing with GDB without hiccups.

For both tools, cheap clones do exist, but it is a no brainer to spend a little more money to reward the excellent work that went into them.

PS: Yes, the Apple Newton also falls into this category, but I don't think that needs to be explicitly pointed out ;)