主题中讨论的其他器件: test2.
工具/软件:
您好:
我目前正在为其中一个应用验证 CC1101、该应用涉及一个发射极和一个接收器。
出于验证目的、我将发送器配置为以恒定频率连续发送相同的消息。
GDO2配置为有数值0x06
、用于将微控制器与传入数据同步。
我使用启用了同步字和 CRC 的数据包模式。 大多数消息都已正确接收。 但是、我偶尔会观察到一种奇怪的行为—大约每300条消息就会发生一次、看起来是随机的。
具体情况如下:
-
在预期时间(即与数据包接收保持一致) GDO2置为有效、
-
但是 芯片状态 从 CC1101读取的是
0x00
、 Rx FIFO 大小不一致 更奇怪的是 MARCSTATE 寄存器给出了奇怪的值。
正常情况(预期行为):
-
GDO2置为有效 。
-
读取芯片状态→
1
, RX FIFO→0
, MARCSTATE→0x0D
. -
等待一小段时间、确保至少有3个字节可用(用于解析数据包大小):
→读取芯片状态→1
、RX FIFO→3
、MARCSTATE→0x0D
。 -
读取完整消息(数据包+附加的 STATUS 字节):
10 10 34 12 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 | 40 B3
其中
40 B3
是附加的两个状态字节(CRC OK)。
有问题的情况:
-
GDO2置为有效 (按预期)。
-
读取芯片状态→
0
, RX FIFO→0
, MARCSTATE→0xFD
. -
再等一会、然后:
-
读取芯片状态→
0
, RX FIFO→0
, MARCSTATE→0x1F
.
-
-
再次等待:
-
读取芯片状态→
0
, RX FIFO→6
, MARCSTATE→0xFD
.
-
-
从 RX FIFO 中读取3个字节:
0x00 0x6F 0x00
。
这些字节显然不一致、并且数据包的其余部分丢失。
更令人困惑的是 GDO2保持高电平 、与预期的消息时间保持一致—就像硬件知道传入的数据包、但内部逻辑不同步一样。
μ
寄存器配置:
WRITE_REGISTER_c (0x00、0x06);// IOCFG2
WRITE_REGISTER_c (0x02、0x06);// IOCFG0
WRITE_REGISTER_c (0x03、0x07);
WRITE_REGISTER_c (0x04、0xD3);// SYNC1
WRITE_REGISTER_c (0x05、0x93);// SYNC0
write_register_c (0x06、0xFF);// PKTLEN
WRITE_REGISTER_c (0x07、0x0C);// PKT1L1
#ifdef Whitening_on
WRITE_REGISTER_c (0x08、0x06);// PK_CTRL0
#else
WRITE_REGISTER_c (0x08、0x46);// PK_CTRL0
#endif
WRITE_REGISTER_c (0x0B、0x08);// FSCTRL2
WRITE_REGISTER_c (0x0D、0x21);// FREQ2
WRITE_REGISTER_c (0x0E、0x62);// FREQ1
WRITE_REGISTER_c (0x0F、0x76);// FREQ0
WRITE_REGISTER_c (0x10、0x5B);// MDMCFG4
WRITE_REGISTER_c (0x11、0xf8);// MDMCFG3
WRITE_REGISTER_c (0x12、0x13);// MDMCFG2
write_register_c (0x13、0x22);// MDMCFG1
WRITE_REGISTER_c (0x15、0x47);// DEVIATN
WRITE_REGISTER_c (0x16、0x07);// MCSM0
WRITE_REGISTER_c (0x17、0x3C);// MCSM1
WRITE_REGISTER_c (0x18、0x18);// MCSM2
WRITE_REGISTER_c (0x19、0x1D);// FOCCFG
WRITE_REGISTER_c (0x1A、0x1C);// BSCFG
WRITE_REGISTER_c (0x1B、0xC7);// AGCCTRL2
WRITE_REGISTER_c (0x1C、0x00);// AGCCTRL1
WRITE_REGISTER_c (0x1D、0xB2);// AGCCTRL0
WRITE_REGISTER_c (0x1E、0x21);// WOREVT1
WRITE_REGISTER_c (0x1F、0xDB);// WOREVT0
WRITE_REGISTER_c (0x20、0x38);// WORCTRL
WRITE_REGISTER_c (0x21、0xB6);// FREND1
WRITE_REGISTER_c (0x23、0xEA);// FSCAL3
WRITE_REGISTER_c (0x24、0x2A);// FSCAL2
WRITE_REGISTER_c (0x25、0x00);// FSCAL1
write_register_c (0x26、0x1F);// FSCAL0
WRITE_REGISTER_c (0x2C、0x88);// TEST2
WRITE_REGISTER_c (0x2D、0x31);// TEST1
WRITE_REGISTER_c (0x2E、0x09);// TEST0
SET_RF_POWER (PA_12dBm);
有什么想法或建议?
您是否曾观察到类似的行为?
您是否有建议来避免 GDO2和内部 RX 逻辑之间出现这种错位情况?
提前感谢您的帮助!
Jonathan