首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > Wireless >

linux上的arm2440+nRF24L01驱动通信有关问题

2012-12-17 
linux下的arm2440+nRF24L01驱动通信问题首先 我在单片机上测试了nRF24L01:两块 单片机+01 可以相互通信然

linux下的arm2440+nRF24L01驱动通信问题
首先 我在单片机上测试了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;

}
[解决办法]
我的是6410的板子,不知道怎么打开上拉电阻和读取数据状态。顶起啊。
[解决办法]
示波器看一下,CE_H是否正确执行,监控IRQ的引脚也能看出一点问题。
[解决办法]

引用:
示波器看一下,CE_H是否正确执行,监控IRQ的引脚也能看出一点问题。
  谢谢已经解决了 能通信了

热点排行