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到来,可以正常收到。。。。
记得接收完成要清FIFO。 .titrwh 发表于 2013-7-18 15:19 static/image/common/back.gif
记得接收完成要清FIFO。 ...
多谢指点,原来的程序里已经清FIFO了,忘记写出来了。
这个是不是与SI4432的版本会有关系呢? mute 发表于 2013-7-18 15:26 static/image/common/back.gif
多谢指点,原来的程序里已经清FIFO了,忘记写出来了。
这个是不是与SI4432的版本会有关系呢? ...
最好把你程序贴出来吧,谁实话si4432很折腾,寄存器太多,当时搞了一个月左右。 本帖最后由 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读写函数了,应该没关系吧? 每次打印 P:xxxlen@xxxxtick后,从来没有IC(即中断里设置的0x05一直都是成功的)
但是P:xxxlen@xxxxtick每个包之间,几乎有一半的几率出现 C1(即CONTROL1这个寄存器又回到XTON的IDLE模式去了)
每个包之间间隔200ms mute 发表于 2013-7-18 15:49 static/image/common/back.gif
这是中断,开了接收fifo满、帧同步字节侦测、包有效中断。主循环里就只执行这个函数。read_reg和write_r ...
这个还真没看出啥问题,好长时间没用si4432了。 我把这个帖子顶起来吧!
下班之前总是出现乱进状态的情况,几乎崩溃! .titrwh 发表于 2013-7-18 16:06 static/image/common/back.gif
这个还真没看出啥问题,好长时间没用si4432了。
哎,悲剧啊,也许只能先用用查询模式,不开中断来做了。以后再买个模块试试
页:
[1]