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?