|
楼主 |
发表于 2013-7-18 15:49:53
|
显示全部楼层
本帖最后由 mute 于 2013-7-18 15:57 编辑
.titrwh 发表于 2013-7-18 15:28
最好把你程序贴出来吧,谁实话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]);
- 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]);
- }
- 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读写函数了,应该没关系吧? |
|