This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC1200: Compatibility with other RF IC

Part Number: CC1200

Hello,

I'm facing problems trying to achieve compatibility of CC1200 with SI4463.

Some background: my company has thousands of units out on the field, all communicating via SI4463 with
our custom protocol. In our R&D efforts we've come to the conclusion we shall be using the CC1200 in our
new range of products for several reasons, and now it's time to work on compatibility with our previous devices.

Here is the configuration I'm trying to achieve (current config of SI4463):
64kbit
2-GFSK
869.52MHz
Deviation - 90kHz
RBW - 150kHz

Preamble len: 4 bytes
Preamble pattern: 101010...

Sync word len: 3 bytes
Sync word order: SW3 SW2 SW1
(each byte LSB first)
SW3: 0xB4
SW2: 0x2B
SW1: 0xC3

Payload:
Each byte MSB first
All bits inverted

CRC: IBM
x16 + x15 + x2 + 1
Highest byte to lowest byte (MSBYTE first)
Non-inverted bits
CRC only of payload (data)

First, I've generated a configuration via SmartRF Studio:
{CC120X_IOCFG2, 0x06},
{CC120X_SYNC_CFG1, 0xA8},
{CC120X_SYNC_CFG0, 0x23},
{CC120X_DEVIATION_M, 0x27},
{CC120X_MODCFG_DEV_E, 0x0D},
{CC120X_DCFILT_CFG, 0x4B},
{CC120X_PREAMBLE_CFG0, 0x8A},
{CC120X_IQIC, 0xD8},
{CC120X_CHAN_BW, 0x0B},
{CC120X_MDMCFG1, 0x42},
{CC120X_MDMCFG0, 0x05},
{CC120X_SYMBOL_RATE2, 0x9A},
{CC120X_SYMBOL_RATE1, 0x36},
{CC120X_SYMBOL_RATE0, 0xE3},
{CC120X_AGC_REF, 0x2D},
{CC120X_AGC_CS_THR, 0xF6},
{CC120X_AGC_CFG1, 0x12},
{CC120X_AGC_CFG0, 0x80},
{CC120X_FIFO_CFG, 0x00},
{CC120X_FS_CFG, 0x12},
{CC120X_PKT_CFG2, 0x00},
{CC120X_PKT_CFG0, 0x20},
{CC120X_PA_CFG1, 0x77},
{CC120X_PA_CFG0, 0x53},
{CC120X_PKT_LEN, 0xFF},
{CC120X_IF_MIX_CFG, 0x1C},
{CC120X_TOC_CFG, 0x03},
{CC120X_MDMCFG2, 0x02},
{CC120X_FREQ2, 0x56},
{CC120X_FREQ1, 0xF3},
{CC120X_FREQ0, 0xB6},
{CC120X_IF_ADC1, 0xEE},
{CC120X_IF_ADC0, 0x10},
{CC120X_FS_DIG1, 0x07},
{CC120X_FS_DIG0, 0x50},
{CC120X_FS_CAL1, 0x40},
{CC120X_FS_CAL0, 0x0E},
{CC120X_FS_DIVTWO, 0x03},
{CC120X_FS_DSM0, 0x33},
{CC120X_FS_DVC0, 0x17},
{CC120X_FS_PFD, 0x00},
{CC120X_FS_PRE, 0x6E},
{CC120X_FS_REG_DIV_CML, 0x1C},
{CC120X_FS_SPARE, 0xAC},
{CC120X_FS_VCO0, 0xB5},
{CC120X_IFAMP, 0x09},
{CC120X_XOSC5, 0x0E},
{CC120X_XOSC1, 0x03},

And then added a few modifications:

/* Enable collision detector */
uint8_t mdmcfg1_collision = 0x4A;
/* For SI446x: invert data */

mdmcfg1_collision |= (1 << 4);
ok &= write_reg(rf_ic, CC120X_MDMCFG1, &mdmcfg1_collision, 1);

/* For SI446x: 4 bytes preamble */
uint8_t preamble_cfg1 = 0x18;
ok &= write_reg(rf_ic, CC120X_PREAMBLE_CFG1, &preamble_cfg1, 1);

uint8_t sync_cfg1 = 0x88;
ok &= write_reg(rf_ic, CC120X_SYNC_CFG1, &sync_cfg1, 1);

uint8_t sync0 = swap_lsb_msb(0xC3);
ok &= write_reg(rf_ic, CC120X_SYNC0, &sync0, 1);

uint8_t sync1 = swap_lsb_msb(0x2B);
ok &= write_reg(rf_ic, CC120X_SYNC1, &sync1, 1);

uint8_t sync2 = swap_lsb_msb(0xB4);
ok &= write_reg(rf_ic, CC120X_SYNC2, &sync2, 1);

What happens now is: SI4463 successfully detects the preamble and nothing more.

There are still things that are unclear to me and I can't seem to find them in the documentation.

Is the payload transmitted LSB-first or MSB-first? The same question goes for the CRC.
Can I change the way it's transmitted if it doesn't fit my current protocol?

Could you please help me get a hold of this?

  • I will comment on your settings related to the packet format.

    From what I can see, you use the following:

    PREAMBLE_CFG1.NUM_PREAMBLE = 6 (4 bytes preamble)

    SYNC_CFG1.SYNC_MODE = 4 (24 bites sync)

    SYNC2 = 0x2D

    SYNC1 = 0xD4

    SYNC0 = 0xC3

    MDMCFG1.INVERT_DATA_EN = 1

    PKT_CFG0.LENGTH_CONFIG = 1 (Variable packet length mode)

    PKT_CFG1.CRC_CFG = 1 (Enable CRC)

    If you want to transmit the following payload (0x01, 0x02, 0x03), you need to write the following to the TX FIFO:

    0x03, 0x01, 0x02, 0x03

    What is sent on the air is then the following:

    0x55 0x55 0x55 0x55 0x2D 0xD4 0xC3 0xFC 0xFE 0xFD 0xFC 0xCF 0xC5 (MSB first)

    where:

    Preamble: 0x55 0x55 0x55 0x55

    Sync: 0x2D 0xD4 0xC3

    Length: 0xFC (0x03 inverted)

    Payload:  0xFE 0xFD 0xFC (0x01 0x02 0x03 inverted)

    CRC: 0xCF 0xC5 (0x30 0x3A inverted)

    If you set MDMCFG1.INVERT_DATA_EN = 0, and transmit the same packet, it will look like this:

    Preamble: 0x55 0x55 0x55 0x55

    Sync: 0x2D 0xD4 0xC3

    Length: 0x03

    Payload:  0x01 0x02 0x03

    CRC: 0x30 0x3A

    Hope this clarifies how the CC1200 works.

    Siri