免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3301 | 回复: 4
打印 上一主题 下一主题

linux下的arm2440+nRF24L01驱动通信问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 10:03 |只看该作者 |倒序浏览
首先 我在单片机上测试了nRF24L01: 两块 单片机+01 可以相互通信   
然后我写了一个在mini2440下的nRF24L01驱动,通过测试: arm+01发送, 单片机+01可以接收arm+01发送过来的数据,
但是我用单片机+01发送 ,arm+01不能接收到数据。请问高手们 这是为什么呢?
  下面是arm+01接收的代码片段 :请老师和高手指点。。。。
//函数:void SetRX_Mode(void)
//功能:数据接收配置   
void SetRX_Mode(void)
{  
CE_L;
ndelay(60);
//SPI_RW_Reg(FLUSH_RX,0x00);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //接收模式
CE_H; //开始接收
udelay(200);
}
//函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf )
//功能:数据读取后放如rx_buf接收缓冲区中  
unsigned char nRF24L01_RxPacket(unsigned char *rx_buf)
{
unsigned char revale = 0;
sta = SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
printk(KERN_WARNING" SPI_Read sta = %x\n",sta); //sta一直等于0 所以一直无法进入if里面 就是没接收数据
if (sta&0x40) // 判断是否接收到数据   
{ //调用这个函数的时候 一直进不去这里面
printk(KERN_WARNING"222");
CE_L; //StandBy I模式
udelay(50);
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, RX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer
printk(KERN_WARNING"rx_buf=%s\n",rx_buf);
revale = 1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS, sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志

return revale;
}
//初始化
uint8 init_NRF24L01(void)
{
MOSI_UP;
//MISO_UP;

CE_OUT;
CSN_OUT;
SCK_OUT;
MOSI_OUT;
MISO_IN;
IRQ_IN;

udelay(500);
CE_L; // chip enable  
ndelay(60);
CSN_H; // Spi disable   
ndelay(60);
SCK_L; // Spi clock line init high
ndelay(60);

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址  
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许   
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21   
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB

printk("nrf24l01_init success \n");
mdelay(1000);
return 1;
}
//接收 数据      
static ssize_t nrf24l01_read(struct file * filp,char *buffer,size_t count,loff_t *ppos)
{
int ret;
printk(KERN_WARNING"run into read !\n");
SetRX_Mode(); //
mdelay(100);
nRF24L01_RxPacket(RxBuf);// 接收从内核空间复制到用户空间的数据 一直没有写进去 所以收到的是空?
   
ret=copy_to_user(buffer,TxBuf,count);
  if(ret>0)
{
return -EFAULT;
  }
return 0;

}

论坛徽章:
0
2 [报告]
发表于 2012-05-31 15:01 |只看该作者
以前做过,把发送与接收的程序以及驱动发过来给你分析下xia08160512@qq.com

论坛徽章:
0
3 [报告]
发表于 2012-05-31 15:03 |只看该作者
回复 2# xia0816
好的 那是你Q还是 什么Q邮箱?


   

论坛徽章:
0
4 [报告]
发表于 2012-05-31 15:11 |只看该作者
回复 2# xia0816
已经发到你的邮箱了  。。。。

   

论坛徽章:
0
5 [报告]
发表于 2012-09-15 16:44 |只看该作者
你的问题解决了吗,我也遇到同样的问题,请问怎么处理啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP