搜索
bottom↓
回复: 8

SI4432的RX模式会意外回到IDLE模式,求助

[复制链接]

出0入0汤圆

发表于 2013-7-18 15:12:16 | 显示全部楼层 |阅读模式
本帖最后由 mute 于 2013-7-18 15:25 编辑

我用中断方式接收的,设置了【包有效中断】,进入 【包有效中断】0x02 ,收取数据包,重新设置寄存器0x07为XTON | RX 模式(0x05)。

但是经常就停止接收了。

后来查找问题,在主循环里,加入一直轮询模式寄存器0x07的代码。
发现中断设置成0x05后(中断里设置后05后,再读取,确认是0x05,已经设置进去了),在主循环里轮询,会发现有一半几率会从自动从0x05变回0x01(IDLE模式)。
看手册里是只有【包有效中断】才会变回0x01。非常奇怪。。。

整个流程是这样的:

包1中断
读取status1 status2
如果是包有效中断
读包1长度
接收包1数据
清fifo
写寄存器0x07为XTON | RX 模式(0x05)
读寄存器0x07 为(0x05),确认写成功
退出中断
主循环轮询寄存器0x07 为(0x05) 正常
主循环轮询寄存器0x07 为(0x05) 正常
.....
主循环轮询寄存器0x07 为(0x01) 自动变回 0x01
.....
包2到来,因为寄存器0x07变回0x01,无法收到。。。。
------------------------------------------
如果在主循环轮询的时候,发现变回0x01,就再次设置成0x05,就接收正常,不会丢包。


主循环轮询寄存器0x07 为(0x05) 正常
.....
主循环轮询寄存器0x07 为(0x01) 自动变回 0x01,再次设置成0x05
.....
包2到来,可以正常收到。。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-7-18 15:19:08 | 显示全部楼层
记得接收完成要清FIFO。                                                                                                                  

出0入0汤圆

 楼主| 发表于 2013-7-18 15:26:07 | 显示全部楼层
.titrwh 发表于 2013-7-18 15:19
记得接收完成要清FIFO。                                                                               ...

多谢指点,原来的程序里已经清FIFO了,忘记写出来了。

这个是不是与SI4432的版本会有关系呢?

出0入0汤圆

发表于 2013-7-18 15:28:07 | 显示全部楼层
mute 发表于 2013-7-18 15:26
多谢指点,原来的程序里已经清FIFO了,忘记写出来了。

这个是不是与SI4432的版本会有关系呢? ...

最好把你程序贴出来吧,谁实话si4432很折腾,寄存器太多,当时搞了一个月左右。                                                                     

出0入0汤圆

 楼主| 发表于 2013-7-18 15:49:53 | 显示全部楼层
本帖最后由 mute 于 2013-7-18 15:57 编辑
.titrwh 发表于 2013-7-18 15:28
最好把你程序贴出来吧,谁实话si4432很折腾,寄存器太多,当时搞了一个月左右。                         ...



这是中断,开了接收fifo满、帧同步字节侦测、包有效中断。
  1. #define RX_FIFO_NUM 50        //接收FIFO满门限

  2. void exti_irq_handle(void)
  3. {
  4.         u8 status, status2, ctrl1, len;

  5.         status2 = read_reg(STATUS_2);
  6.         status  = read_reg(STATUS_1);

  7.         if (status & IRXFFAFULL)
  8.         {
  9.                 read_fifo(RX_FIFO_NUM, &buf[recv_ok_len]);
  10.                 recv_ok_len += RX_FIFO_NUM;
  11.                 rssi = read_reg(RSSI);
  12.         }

  13.         if (status2 & IPREAVAL)
  14.         {
  15.                 rssi = read_reg(RSSI);
  16.         }

  17.         if (status & IPKVALID)
  18.         {
  19.                 len = read_reg(RECEIVED_PACKET_LENGTH);

  20.                 DEBUGOUT("P:%u@%u\r\n", len, systick_get());

  21.                 if (recv_ok_len < len) {
  22.                         read_fifo(len-recv_ok_len, &buf[recv_ok_len]);
  23.                 }
  24.                 recv_ok_len = 0;

  25.                 //清空FIFO
  26.                 write_reg(CONTROL2, 0x02);
  27.                 write_reg(CONTROL2, 0x00);

  28.                 //设置为接收模式
  29.                 write_reg(CONTROL1, XTON|RXON);

  30.                 //检查是否设置成功
  31.                 ctrl1 = read_reg(CONTROL1);
  32.                 if (!(ctrl1&RXON) || !(ctrl1&XTON))
  33.                 {
  34.                         DEBUGOUT("IC:%u\r\n", ctrl1);
  35.                 }
  36.         }
  37. }
复制代码
主循环里就只执行这个函数。
  1. void ctrl1_check()
  2. {
  3.         vu8 tmp;

  4.         tmp = read_read(CONTROL1);

  5.         if (!(tmp&RXON) || !(tmp&XTON))
  6.         {
  7.                 DEBUGOUT("C%u\r\n", tmp);
  8.                 write_reg(CONTROL1, RXON | XTON);
  9.         }
  10. }
复制代码
read_reg和write_reg里都有关闭外部中断和恢复外部中断的。
但是除了主循环ctrl1_check、外部中断,其他地方没有调用reg读写函数了,应该没关系吧?

出0入0汤圆

 楼主| 发表于 2013-7-18 15:53:07 | 显示全部楼层
每次打印 P:xxxlen@xxxxtick后,从来没有IC(即中断里设置的0x05一直都是成功的)
但是P:xxxlen@xxxxtick每个包之间,几乎有一半的几率出现 C1(即CONTROL1这个寄存器又回到XTON的IDLE模式去了)

每个包之间间隔200ms

出0入0汤圆

发表于 2013-7-18 16:06:08 | 显示全部楼层
mute 发表于 2013-7-18 15:49
这是中断,开了接收fifo满、帧同步字节侦测、包有效中断。主循环里就只执行这个函数。read_reg和write_r ...

这个还真没看出啥问题,好长时间没用si4432了。

出0入0汤圆

发表于 2013-7-18 19:06:10 | 显示全部楼层
我把这个帖子顶起来吧!
下班之前总是出现乱进状态的情况,几乎崩溃!

出0入0汤圆

 楼主| 发表于 2013-7-20 22:51:03 | 显示全部楼层
.titrwh 发表于 2013-7-18 16:06
这个还真没看出啥问题,好长时间没用si4432了。

哎,悲剧啊,也许只能先用用查询模式,不开中断来做了。以后再买个模块试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表