SI4432通讯问题

nandou 2012-04-05 11:05:12
最近弄了一套SI4432模块玩,把2个模块连接到同一个单片机,一个作为发送另一个接收,从网上下载了一个RFtest51示例代码修改:
配置为FIFO CRC通讯模式,接收到有效数据包或CRC校验错误产生中断NIRQ 信号输入


while(1)
{

//当按键被按下就有一个数据包被发出;
if(PB1_TX == 0)//(发送模块处理)
{
while( PB1_TX == 0 );
UART_Send_Str("按键按下,开始发送....\n");
RFFIFOSendData2(sendLen, str);
//设置中断使能寄存器,这里设置为只有当有效的数据包被接收或者接收到的数据包数据CRC校验出错才来中断;具体设置参考0x05和0x06寄存器
SpiWriteRegister2(0x05, 0x03); //write 0x03 to the Interrupt Enable 1 register
SpiWriteRegister2(0x06, 0x00); //write 0x00 to the Interrupt Enable 2 register
//发射完毕后设置模块让它又工作在接收状态下;
RFSetRxMode2();
UART_Send_Str("发送完毕,恢复到接收状态....\n");
}


//check whether interrupt occured
//查询中断是否到来,如果中断来了,根据我们前面中断使能寄存器的设置,说明有效数据包已经收到,或者收到的数据包CRC校验出错;
//状态位进行处理
if( NIRQ == 0 )
{
//设置模块处于空闲模式,处理收到的数据包,不继续接收数据
//RFSetIdleMode读取中断标志ItStatus1清中断标志,并设置接收模块为Idle模式
RFSetIdleMode();
UART_Send_Str("中断来了....\n");
/*CRC Error interrupt occured*/
//判断是否由于CRC校验出错引发的中断;在RFSetIdleMode中已经读出了中断状态寄存器的值
if( (ItStatus1 & 0x01) == 0x01 )
{
//reset the RX FIFO
//如果是CRC校验出错,那么接收FIFO复位;
SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register
SpiWriteRegister(0x08, 0x00);
}

/*packet received interrupt occured*/
//判断是否是数据包已经被正确接收。
if( (ItStatus1 & 0x02) == 0x02 )
{
//数据判断处理 length = SpiReadRegister(0x4B); 。。。。。
}

//reset the RX FIFO
SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register
SpiWriteRegister(0x08, 0x00); //write 0x00 to the Operating Function Control 2 register
RFSetRxMode();
}
}


********************************************************
现在问题是:每次按下按键后发送模块显示发送成功,接收模块也能接收产生NIRQ中断信号(即运行到了:中断来了....),但是ItStatus1为0,不能进入if数据处理。每次按键发送数据,接收模块都能正常产生中断信号,不知道问题出现在哪里?求高手指点!!!
...全文
526 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq3022724 2012-05-20
  • 打赏
  • 举报
回复
请问深圳云佳的片子,真的通讯很近吗,我才买了5个还没试了,不要打击我哦
nandou 2012-05-02
  • 打赏
  • 举报
回复
距离没试过,我放家里(7楼),跑5楼试过可以收到数据,3楼就不行了
zhh368 2012-04-28
  • 打赏
  • 举报
回复
narihh:
您好,我前天也买了深圳云佳的模块,看您已经做好了,能否指导下我呢,谢谢。
narihh 2012-04-25
  • 打赏
  • 举报
回复
请问nandou,你这模块距离能到多少米?我用的深圳云佳的模块在林荫道上最远只能到260m。1.2K波特率,频偏3K,6K,2.4K波特率频偏38.4K都试过,距离差不多
nandou 2012-04-10
  • 打赏
  • 举报
回复
今天折腾了下,可以通讯了,换了STM32F103 3.3V供电的片子调,开始因为宏定义错了SDN端口电平反了,片子没使能一直死机,改过来就好了。
以前用的是5V单片机,可能因为端口用电阻分压匹配3.3V电平导致SPI信号不稳定,看来是不能偷懒啊,o(∩_∩)o 哈哈!

多谢bsnow!
nandou 2012-04-10
  • 打赏
  • 举报
回复
呵呵,谢谢了,这2天忙过几天在折腾下、
nandou 2012-04-09
  • 打赏
  • 举报
回复
读ID没试过,不过能正常响应发送模块发送的数据产生中断,应该SPI部分没问题吧,有空我试试。谢谢了。
nandou 2012-04-09
  • 打赏
  • 举报
回复
读ID没试过,不过能正常响应发送模块发送的数据产生中断,应该SPI部分没问题吧,有空我试试。谢谢了。
bsnow 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

读ID没试过,不过能正常响应发送模块发送的数据产生中断,应该SPI部分没问题吧,有空我试试。谢谢了。
[/Quote]

因为发送数据不需要读寄存器的。不过好像也需要读,发的时候也有中断我记得。唉。
bsnow 2012-04-09
  • 打赏
  • 举报
回复
那应该不太可能啊。 你有没有测试过你 SPI读的时序是否正确? 读读芯片ID没? 反正这个问题很是奇怪了。
nandou 2012-04-07
  • 打赏
  • 举报
回复

void RFSetIdleMode(void)
{
//The radio will work in idle mode
SpiWriteRegister(0x07, 0x01);
//write 0x09 to the Operating Function Control 1 register
SpiWriteRegister(0x0E, 0x01);
//Read interrupt status regsiters. It clear all pending interrupts and the nIRQ pin goes back to high.
ItStatus1 = SpiReadRegister(0x03); //read the Interrupt Status1 register
ItStatus2 = SpiReadRegister(0x04); //read the Interrupt Status2 register
}


ItStatus1是全局变量,RFSetIdleMode();主要就是读中断寄存器的值。
现在的问题就是能发送模块发送完数据后,接受模块可以正常产生IRQ中断信号,但是读出来的ItStatus1为0,不知道怎么回事。。。
bsnow 2012-04-05
  • 打赏
  • 举报
回复
看看你 RFSetIdleMode(); 是否正常返回 ItStatus1 变量。 我估计你在RFSetIdleMode()清中断的时候也把ItStatus1 赋值了。 你可以在 RFSetIdleMode()把 读到的中断 return出来。 我不知道你用的哪里的程序不过我推荐你用 官方提供的那套。

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧