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.

CC1101: 可变包长的发送与接收

Part Number: CC1101

环境:esp32+cc1101,spi接口,433MHz,38.4kbps, 2-FSK, fredev 50kHz

其它设置:包长可变,GDO0为IRQ,配置0x6,上升沿触发,Asserts when sync word has been sent/received, de-asserts at end of packet

遇到问题:

1)在发送函数中,先进入idle(确定已进入),装填TXFIFO,延时30us,再进入tx状态(也确定已进入),GDO0的中断即触发,在线程里处理该中断(下半文),每50us读取MARCSTATE的状态,显示为几个连续的tx状态,然后是连续的TXFIFO_UNDERFLOW, 如:19, 19, 19, 19, 19, 19, 22, 22, 22, 22, 22。。。十进制,即 idle->tx->txfifo_underflow。

从进入TX状态到触发冲断,log时间戳显示3ms左右,而从进入TX状态到TXFIFO_UNDERFLOW,时间戳显示总共7ms左右;在示波器上观察GDO0的高电平持续时间,大概6ms左右。

想问的问题是,如何判断tx发送已完成?正常的状态变化应该是19->20,而实际看到的是19->22,中断触发时表示发送已经完成,但读到的MARCSTATE状态却是tx,即19。

2)数据接收,数据长度常为0,或者一串乱码无法解析。问题,接收到的数据长度该如何获取?

3)用smart rf studio通过cc debuger连接 cc1101,作为一个独立的收发装置辅助调试。它接收不到esp32+cc1101发出来的包,尽管esp32+cc1101显示发送已完成并触发GDO0的中断;反过来它发出去的包,esp32+cc1101也接收不到。换言之,esp32+cc1101的发送和接收,尽管触发了GDO0的中断,实际上smart rf studio没有反应,当然确保了二者在参数配置上一致,如频率速率等。

已排除:spi通信没问题,寄存器能正确读写,burst也可以。

下面是我对寄存器的配置,也试过其它配置,基本差不多:

static const uint8_t preferredSettings433[39][2] =
{
{CC1101_REG_IOCFG2, 0x0D}, // High impedance (3-state)
{CC1101_REG_IOCFG1, 0x2E}, // Asserts when sync word has been sent/received, de-asserts at end of packet
{CC1101_REG_IOCFG0, 0x06}, // Asserts when sync word has been sent/received, de-asserts at end of packet
{CC1101_REG_FIFOTHR, 0x07}, // TX: 33 bytes; RX: 32 bytes
{CC1101_REG_SYNC1, 0xD3}, // Sync word high byte
{CC1101_REG_SYNC0, 0x91}, // Sync word low byte
{CC1101_REG_PKTLEN, 0x3D}, // Packet length 61 bytes
{CC1101_REG_PKTCTRL1, 0x04}, // No address check, append status, CRC autoflush
{CC1101_REG_PKTCTRL0, 0x45}, // Variable length packets, CRC enabled, whitening disabled
{CC1101_REG_ADDR, 0x00}, // Device address (disabled)
{CC1101_REG_CHANNR, 0x00}, // Channel number
{CC1101_REG_FSCTRL1, 0x06}, // Frequency synthesizer control
{CC1101_REG_FSCTRL0, 0x00}, // Frequency synthesizer control
{CC1101_REG_FREQ2, 0x10}, // Frequency: 433 MHz
{CC1101_REG_FREQ1, 0xA7}, // Frequency: 433 MHz
{CC1101_REG_FREQ0, 0x62}, // Frequency: 433 MHz
{CC1101_REG_MDMCFG4, 0xCA}, // Modem configuration
{CC1101_REG_MDMCFG3, 0x83}, // Modem configuration (38.4 kbps)
{CC1101_REG_MDMCFG2, 0x13}, // Modem configuration (2-FSK, no manchester, 16/16 sync word bits detected)
{CC1101_REG_MDMCFG1, 0x22}, // Modem configuration (FEC disabled, 4 preamble bytes)
{CC1101_REG_MDMCFG0, 0xF8}, // Modem configuration (Channel spacing exponent)
{CC1101_REG_DEVIATN, 0x50}, // Deviation setting (50 kHz)
{CC1101_REG_MCSM2, 0x07}, // Main Radio Control State Machine configuration
{CC1101_REG_MCSM1, 0x30}, // Main Radio Control State Machine configuration
{CC1101_REG_MCSM0, 0x18}, // Main Radio Control State Machine configuration
{CC1101_REG_FOCCFG, 0x16}, // Frequency Offset Compensation configuration
{CC1101_REG_BSCFG, 0x6C}, // Bit Synchronization configuration
{CC1101_REG_AGCCTRL2, 0x03}, // AGC control
{CC1101_REG_AGCCTRL1, 0x40}, // AGC control
{CC1101_REG_AGCCTRL0, 0x91}, // AGC control
{CC1101_REG_WOREVT1, 0x87}, // High byte Event 0 timeout
{CC1101_REG_WOREVT0, 0x6B}, // Low byte Event 0 timeout
{CC1101_REG_WORCTRL, 0xF8}, // Wake On Radio control
{CC1101_REG_FREND1, 0xB6}, // Front end RX configuration
{CC1101_REG_FREND0, 0x10}, // Front end RX configuration
{CC1101_REG_FSCAL3, 0xEA}, // Frequency synthesizer calibration
{CC1101_REG_FSCAL2, 0x0A}, // Frequency synthesizer calibration
{CC1101_REG_FSCAL1, 0x00}, // Frequency synthesizer calibration
{CC1101_REG_FSCAL0, 0x11}, // Frequency synthesizer calibration
};

期望进一步联系,mail: dunfa.chen@outlook.com

  • 您好

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 您好,

          根据您显示设置TXOFF_MODE 设置为 IDLE因此 TX 完成后您将看到正常状态 IDLE MARCSTATE = 1)。

         它将通过 TX_END TX 转到 IDLE但这发生可能无法读取

          如果您遇到TXFIFO_UNDERFLOW则需要修复代码 Blush请记住当您使用可变数据包长度模式您需要长度作为第一个字节写入 TX FIFO

          例如,果要传输的效负载是 0xAA、0xBB、0xCC、0xDD、0xEE 0xFF,应将下内容写TX FIFO:0x06、0xAA、0xBB、0xCC、0xDD、0xEE 0xFF如果您遇到下况,示您有为 TX FIFO 供足够的字节(节数于您写的第一个字节所示的节数 长度字节

    如果您遇到下溢情况,则仅表示您没有为 TX FIFO 提供足够的字节(比您编写的第一个字节所指示的字节数少,即长度字节)

    您使用的是我们的 EM 模块还是制作了自己的硬件?如果是后者,哪个参考。设计 你有没有遵循,你有没有对 ref 设计做过任何更改(组件或布局更改?

    您应该始终使用 Studio 中的推荐设置开始测试。

           

    // Address Config = No address check 
    // Base Frequency = 432.999817 
    // CRC Autoflush = false 
    // CRC Enable = true 
    // Carrier Frequency = 432.999817 
    // Channel Number = 0 
    // Channel Spacing = 199.951172 
    // Data Format = Normal mode 
    // Data Rate = 38.3835 
    // Deviation = 20.629883 
    // Device Address = 0 
    // Manchester Enable = false 
    // Modulated = true 
    // Modulation Format = 2-FSK 
    // PA Ramping = false 
    // Packet Length = 255 
    // Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word 
    // Preamble Count = 4 
    // RX Filter BW = 101.562500 
    // Sync Word Qualifier Mode = 30/32 sync word bits detected 
    // TX Power = 0 
    // Whitening = false 
    
    static const registerSetting_t preferredSettings[]= 
    {
      {CC1101_IOCFG0,      0x06},
      {CC1101_FIFOTHR,     0x47},
      {CC1101_PKTCTRL0,    0x05},
      {CC1101_FSCTRL1,     0x06},
      {CC1101_FREQ2,       0x10},
      {CC1101_FREQ1,       0xA7},
      {CC1101_FREQ0,       0x62},
      {CC1101_MDMCFG4,     0xCA},
      {CC1101_MDMCFG3,     0x83},
      {CC1101_MDMCFG2,     0x03},
      {CC1101_DEVIATN,     0x35},
      {CC1101_MCSM0,       0x18},
      {CC1101_FOCCFG,      0x16},
      {CC1101_AGCCTRL2,    0x43},
      {CC1101_WORCTRL,     0xFB},
      {CC1101_FSCAL3,      0xE9},
      {CC1101_FSCAL2,      0x2A},
      {CC1101_FSCAL1,      0x00},
      {CC1101_FSCAL0,      0x1F},
      {CC1101_TEST2,       0x81},
      {CC1101_TEST1,       0x35},
      {CC1101_TEST0,       0x09},
    };

    不确定为什么要更改 TEST 寄存器、AGC 寄存器和 FERND1寄存器。您应该使用 SmartRF Studio 给您的值。
    此外,您将看到的是,您将从 4 字节更改为 2 字节同步字,您将获得更多的错误同步检测。
    将建议的偏差从 20 kHz 更改为 50 kHz,我没有通过任何数据包,所以不知道为什么你要改变这个。

    如果您首先使用建议的设置进行测试,但无法收到任何内容,这可能表明有下面几种情况:

    硬件:
    你的设计不是很好
    设备因 ESD 等原因而损坏。


    软件:
    您的 SPI 接口出错,因此您没有向 CC1101发送正确的信息(您说 SPI 是正确的,但请分享逻辑分析器图)。另外,您是否检查过上升时间、保持时间等是否符合规格?
    您的代码错误


    对于上述推荐设置,您的 RX 软件应执行以下操作:
    初始化 MCU
    重置 CC1101
    使用上面的寄存器设置初始化 CC1101
    选通 SRX 等待 GDO0 的下降沿中断
    读取 FIFO 中的第一个字节以获得长度 n
    从 FIFO 中读取 n + 2 个字节(有效载荷 + 状态字节)

  • 正解,感谢,问题已解决,是寄存器配置问题。