尊敬的 Sirs:
我们正在使用 cc1200开始生产收发器。 测试表明、接收器在4小时至2天的随机间隔锁定。 我们发现、每当发生锁定时、载波侦听有效停止脉冲。 那么、我们将使用该信号来判断是否
需要重新初始化接收器。 我们在监听模式下使用接收器。
问题是这是一种好的方式,还是有更好的方式。
谢谢
John Moore
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.
如果载波侦听信号停止脉冲、我会假设无线电已停止进入 RX 模式(您不会再收到任何 WOR 事件(可以在 GPIO 上监控 WOR_EVENT0/1/2)。
你(们)好
这很可能是因为软件没有正确处理错误、无线电最终处于空闲状态、而不是返回睡眠状态、应用程序也不会在 WOR 模式中将其频带回来。
我强烈建议您找到导致无线电“卡住”的根本原因,并解决此问题,而不是实施解决方法。 当我不知道导致您失败的原因时、我也不建议进行任何修复。
典型的问题可能是您没有使用数据包长度过滤、并且缓冲区的大小不足以容纳最大长度的数据包(长度字节+ 255有效载荷字节+ 2个状态字节)、或者 RXFIFO 溢出。
如果您处于 RX FIFO 错误状态、在清空 RX FIFO (SFRX)并发送另一个 WOR 选通(SWOR)之前、对讲机将不会返回 WOR 模式。
如果使用数据包长度过滤、是否设置 TERM_ON_BAD_PACKET_EN = 0?
BR
Siri
您好、Siri:
在中断驱动的 Rx 例程中、我执行读取以确定消息类型(长度)、然后读取消息的其余部分。
然后我再读取一个字节、读取的字节数。 这可能是错误的!!:
cc120xSpiReadReg (CC120X_NUM_RXBYTES、&rxBytes、1);//测试在 Rx FIFO 中读取另一个字节。 SUB.c.
cc120xSpiReadRxFifo (rxBuffer、(rxBytes));//进行测试。 在 subs.c 中
然后检查错误。 如果有刷新 FIFO 并设置为监听模式。:
//CheckForErrors:检查数据包错误
cc120xSpiReadReg (CC120X_MARCSTATE、&marcState、1); //检查状态。
if (marcState ==0x11)
{
WaitForIdleState();//等待达到空闲状态
TrxSpiCmdStrobe (CC120X_SFRX);//3A。 刷新 Rx FIFO 的命令
WaitForIdleState();//等待达到空闲状态
TrxSpiCmdStrobe (CC120X_SWOR);//将无线电设置为射频监听模式
}
谢谢、
John
你(们)好
如果您在以下行之前进行任何读取;
cc120xSpiReadReg (CC120X_NUM_RXBYTES、&rxBytes、1);//测试在 Rx FIFO 中读取另一个字节。 SUB.c.
cc120xSpiReadRxFifo (rxBuffer、(rxBytes));//进行测试。 在 subs.c 中
这可能是错误的。 在读取 FIFO 之前、应始终检查 FIFO 中是否有数据。
此外、我想知道您的错误检查。
您在 WaitForIdleState 中执行什么操作(等待空闲时除外)? 您是否在等待空闲进入?
如果您这样做、则无需这样做、因为您可以在 RX_FIFO_ERR 状态下直接选通 SFRX。
如果您只是轮询 MARCSTATE 空闲、这是错误的、因为对讲机不会从 RX_FIFO_ERR 状态自动进入空闲状态(CSTATE = 0x11)
您是否处于此状态、等待空闲?
Siri
谢谢、Siri、您是一名救生员:
我根据您的注释更正了 runrx 函数末尾附近的以下代码:
//cc120xSpiReadRxFifo (rxBuffer、(rxBytes));// in subs 删除了这3行
//if (rxBytes>0)
// cc120xSpiReadReg (CC120X_NUM_RXBYTES、&rxBytes、1);//清理 fifo subs.c
//CheckForErrors:检查数据包错误
cc120xSpiReadReg (CC120X_MARCSTATE、&marcState、1);//检查状态。 更正了此错误
if ((marcState & 0x1F)=0x11)//rec fifo 错误
{
TrxSpiCmdStrobe (CC120X_SFRX);//3A。 刷新 Rx FIFO 并进入空闲状态的命令
WaitForIdleState();//等待达到空闲状态
TrxSpiCmdStrobe (CC120X_SWOR);//将无线电设置为射频监听模式
}
其他
{
if ((marcState & 0x1F)=0x1)//空闲?
TrxSpiCmdStrobe (CC120X_SWOR);//将无线电设置为射频监听模式 这似乎是必要的
}
谢谢、 John
SIRI:
接收器以 ewor 模式运行。
在中断之外的主循环中、我还将检查 marcstate 以查看它是否处于空闲模式。
如果它处于空闲模式、则该例程执行以下操作:
TrxSpiCmdStrobe (CC120X_SWOR); //将无线电设置为射频监听模式
但是、ewor 计时器会导致接收器进入和退出 IDEL/Receive 模式、这种情况有时也会发生
读取空闲模式还是始终读取 ewor 模式?
谢谢、John
我认为不能使用 carrier_sense。
根据用户指南、CS 响应时间是 CARER_SENSE_VALID 置为有效之前所需的时间。 这是
启用基于 CS 的 RX 端接时、对讲机处于 RX 状态的最长时间、因此我认为在对讲机实际退出 RX 之前、此信号不会生效。 另一个"问题"是、该信号在睡眠状态下将硬连线为0或1、具体取决于您选择将其输出到哪个 GPIO (在下面的中、当运行监听模式时、WOR_EVENT0输出到 GPIO2、CARER_SENSE_VALID 输出到 GPIO3:
通过使用 IOCFGx.GPIOx_CFG 设置为0x30或更高的信号(例如 WOR_EVENT0之一)、可以清楚地指示监听模式正在运行。
BR
Siri
好消息、Siri:
我们实际上始终在监听模式下使用无线电。 中断例程会查看似乎每个监听周期都存在的 Carrier_sense 有效脉冲。 IRQ 将这些脉冲的计数保持在0.2秒间隔内。 如果计数在0.2秒内降至5以下、则软件假定接收器已锁定、然后重新初始化。
到 目前为止、它实际上运行良好。 我使用 GPIO3读取 CS、使用 GPIO2读取 CS_VALID、因此我稍微缺少 GPIO 位来查看 EWOR 事件。
您认为这会起作用吗?
谢谢、John