mute 发表于 2013-7-18 15:12:16

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

本帖最后由 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到来,可以正常收到。。。。

.titrwh 发表于 2013-7-18 15:19:08

记得接收完成要清FIFO。                                                                                                                  

mute 发表于 2013-7-18 15:26:07

.titrwh 发表于 2013-7-18 15:19 static/image/common/back.gif
记得接收完成要清FIFO。                                                                               ...

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

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

.titrwh 发表于 2013-7-18 15:28:07

mute 发表于 2013-7-18 15:26 static/image/common/back.gif
多谢指点,原来的程序里已经清FIFO了,忘记写出来了。

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

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

mute 发表于 2013-7-18 15:49:53

本帖最后由 mute 于 2013-7-18 15:57 编辑

.titrwh 发表于 2013-7-18 15:28 static/image/common/back.gif
最好把你程序贴出来吧,谁实话si4432很折腾,寄存器太多,当时搞了一个月左右。                         ...


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

void exti_irq_handle(void)
{
        u8 status, status2, ctrl1, len;

        status2 = read_reg(STATUS_2);
        status= read_reg(STATUS_1);

        if (status & IRXFFAFULL)
        {
                read_fifo(RX_FIFO_NUM, &buf);
                recv_ok_len += RX_FIFO_NUM;
                rssi = read_reg(RSSI);
        }

        if (status2 & IPREAVAL)
        {
                rssi = read_reg(RSSI);
        }

        if (status & IPKVALID)
        {
                len = read_reg(RECEIVED_PACKET_LENGTH);

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

                if (recv_ok_len < len) {
                        read_fifo(len-recv_ok_len, &buf);
                }
                recv_ok_len = 0;

                //清空FIFO
                write_reg(CONTROL2, 0x02);
                write_reg(CONTROL2, 0x00);

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

                //检查是否设置成功
                ctrl1 = read_reg(CONTROL1);
                if (!(ctrl1&RXON) || !(ctrl1&XTON))
                {
                        DEBUGOUT("IC:%u\r\n", ctrl1);
                }
        }
}主循环里就只执行这个函数。void ctrl1_check()
{
        vu8 tmp;

        tmp = read_read(CONTROL1);

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

mute 发表于 2013-7-18 15:53:07

每次打印 P:xxxlen@xxxxtick后,从来没有IC(即中断里设置的0x05一直都是成功的)
但是P:xxxlen@xxxxtick每个包之间,几乎有一半的几率出现 C1(即CONTROL1这个寄存器又回到XTON的IDLE模式去了)

每个包之间间隔200ms

.titrwh 发表于 2013-7-18 16:06:08

mute 发表于 2013-7-18 15:49 static/image/common/back.gif
这是中断,开了接收fifo满、帧同步字节侦测、包有效中断。主循环里就只执行这个函数。read_reg和write_r ...

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

xukai871105 发表于 2013-7-18 19:06:10

我把这个帖子顶起来吧!
下班之前总是出现乱进状态的情况,几乎崩溃!

mute 发表于 2013-7-20 22:51:03

.titrwh 发表于 2013-7-18 16:06 static/image/common/back.gif
这个还真没看出啥问题,好长时间没用si4432了。

哎,悲剧啊,也许只能先用用查询模式,不开中断来做了。以后再买个模块试试
页: [1]
查看完整版本: SI4432的RX模式会意外回到IDLE模式,求助