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的引脚也能看出一点问题。
[解决办法]