微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Mini2440 NRF24L01无线模块驱动

Mini2440 NRF24L01无线模块驱动

时间:11-19 来源:互联网 点击:

receive_state = SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况

if (receive_state & (1 < RX_DR)) // 判断是否接收到数据

{
CE_L; //SPI使能

udelay(50);
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer

revale = 1; //读取数据完成标志

}
SPI_RW_Reg(WRITE_REG + STATUS, receive_state); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志

return revale;
}

//函数:void nRF24L01_TxPacket(unsigned char * tx_buf)

//功能:发送 tx_buf中数据

void nRF24L01_TxPacket(unsigned char *tx_buf)
{ uint8 ret;
CE_L; //StandBy I模式

ndelay(60);
ret=SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
printk(“ret=%cn”,ret);
ret=SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
printk(“ret=%cn”,ret);

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送

CE_H; //置高CE,激发数据发送

udelay(10);
}

static irqreturn_t nrf24l01_interrupt(int irq,void *dev_id)
{ uint8 state ;
state = SPI_Read(STATUS);
if(state & 0x10){
SPI_RW_Reg(WRITE_REG + STATUS , state); //如果是重发中断则写回清除中断
}else if(state & 0x20){
SPI_RW_Reg(WRITE_REG + STATUS , state); //清除发送中断
}else if ( state & 0x40){
get_data = 1;
nRF24L01_RxPacket(TxBuf);
wake_up_interruptible(&read_queue);
}
return IRQ_RETVAL(IRQ_HANDLED);
}

uint8 init_NRF24L01(void)
{ 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 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址

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

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
mdelay(1000);
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG + STATUS, 0XFF);
printk(“test 1 n”);
mdelay(1000);
return 1;
}

static uint16 nrf24l01_poll(struct file *filp,struct poll_table_struct *wait)
{ uint16 mask = 0;
poll_wait(filp,&read_queue,wait);
if(get_data){
mask |= POLLIN|POLLRDNORM;
}

return mask;
} static ssize_t nrf24l01_write(struct file *filp,const char *buffer, size_t count,loff_t *ppos)
{ if(copy_from_user(TxBuf,buffer,count))
{
printk(“Can’t Send Data !”);
return -EFAULT;
}

nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG + STATUS,0XFF);
printk(“Send OK n”);
return 10;
}

static ssize_t nrf24l01_read(struct file * filp,char *buffer,size_t count,loff_t *ppos)
{ unsigned long err;
if(!get_data){
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
else
wait_event_interruptible(read_queue,get_data);
}
get_data = 0;
err = copy_to_user(buffer,TxBuf,min(TxBufSize,count));

printk(“read okn”);
return err ? -EFAULT : min(TxBufSize,count);
}

static int nrf24l01_open(struct inode *node, struct file *file)
{ uint8 flag = 0;
unsigned long err;
if (open_count == 1)
return -EBUSY;

flag = init_NRF24L01();

mdelay(100);
init_waitqueue_head(&read_queue);

err = request_irq(IRQ_EINT9,nrf24l01_interrupt,IRQ_TYPE_EDGE_FALLING,DEVICE_NAME,NULL);
if(err){
disable_irq(IRQ_EINT9);
free_irq(IRQ_EINT9,NULL);
}
if (flag == 0) {
printk(“uable to open device!n”);
return -1;
} else {
open_count++;
printk(“device opened !n”);
return 0;
}
}

static int

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top