TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Daniel:

您好

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

,

Alice:

您好,

      根据您显示的设置,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 = falsestatic 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 个字节(有效载荷 + 状态字节)

,

alex chen:

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

赞(0)
未经允许不得转载:TI中文支持网 » CC1101: 可变包长的发送与接收
分享到: 更多 (0)