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:CC1101上的间歇性 RX 问题—GDO2置为有效、但 RX FIFO 无效

Guru**** 2341740 points
Other Parts Discussed in Thread: CC1101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1506877/cc1101-intermittent-rx-issue-on-cc1101-gdo2-asserted-but-rx-fifo-invalid

部件号:CC1101
主题中讨论的其他器件: test2.

工具/软件:

您好:

我目前正在为其中一个应用验证 CC1101、该应用涉及一个发射极和一个接收器。
出于验证目的、我将发送器配置为以恒定频率连续发送相同的消息。

GDO2配置为有数值0x06、用于将微控制器与传入数据同步。
我使用启用了同步字和 CRC 的数据包模式。 大多数消息都已正确接收。 但是、我偶尔会观察到一种奇怪的行为—大约每300条消息就会发生一次、看起来是随机的。

具体情况如下:

  • 在预期时间(即与数据包接收保持一致) GDO2置为有效、

  • 但是 芯片状态 从 CC1101读取的是0x00Rx FIFO 大小不一致 更奇怪的是 MARCSTATE 寄存器给出了奇怪的值。


Mag 正常情况(预期行为):

  1. GDO2置为有效

  2. 读取芯片状态→1, RX FIFO→0, MARCSTATE→0x0D.

  3. 等待一小段时间、确保至少有3个字节可用(用于解析数据包大小):
    →读取芯片状态→1、RX FIFO→3、MARCSTATE→0x0D

  4. 读取完整消息(数据包+附加的 STATUS 字节):

    CopyEdit
    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)。


X 有问题的情况:

  1. GDO2置为有效 (按预期)。

  2. 读取芯片状态→0, RX FIFO→0, MARCSTATE→0xFD.

  3. 再等一会、然后:

    • 读取芯片状态→0, RX FIFO→0, MARCSTATE→0x1F.

  4. 再次等待:

    • 读取芯片状态→0, RX FIFO→6, MARCSTATE→0xFD.

  5. 从 RX FIFO 中读取3个字节:0x00 0x6F 0x00

这些字节显然不一致、并且数据包的其余部分丢失。
更令人困惑的是 GDO2保持高电平 、与预期的消息时间保持一致—就像硬件知道传入的数据包、但内部逻辑不同步一样。


μClipboard 寄存器配置:

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);


Pray 有什么想法或建议?

您是否曾观察到类似的行为?
您是否有建议来避免 GDO2和内部 RX 逻辑之间出现这种错位情况?

提前感谢您的帮助!

Jonathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    恐怕我无法告诉您发生了什么、除非我有完整的代码以及一些来自 SPI 流量的逻辑分析仪数据。

    根据您的设置、我看到您使用的是无限数据包长度模式、这意味着由于您也使用 CRC 和 CEC 自动刷新、因此您的接收算法必须从无限数据包长度更改为固定数据包长度、并在某个时候正确设置 PKTLEN 寄存器。

    因为我不知道你是如何实施的,我不知道出了什么问题。

    BR

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我恐怕我无法通过查看您的代码来精确定位正在发生的事情。

    应该不可能从 MARCSTATE 读回0xFD 或0x1F、因此我想看看一些图。

    您应该使用示波器验证您的 SPI 时序是否符合规格、而逻辑分析仪绘制的图可以帮助我监控程序的流程。

    在启动 SCLK 之前、您是否总是等待 CHIP_RDYn 被置为有效、并将勘误表注中的 SPI 错误考虑在内?

    Siri