<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[Linux下驱动2.4G无线模块(NRF24L01)]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 02 Jun 2010 05:43:41 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NRF24L01使用的SPI协议通信，这里并没有用到s3c2440自带的SPI功能，而是直接用IO口模拟SPI。而根据Datasheet所示，NRF24L01的SPI接速率为0~8Mbps，因此需要在读写时序上加上适当的延时。<br/><br/> <br/><br/>驱动程序：<br/><br/>/************************************************************/<br/>//文件名：nrf24l01.c<br/>//功能:linux下的nrf24l01驱动程序<br/>//使用说明: (1)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)<br/>//作者:jammy-lee<br/><br/>//日期：2010-01-11<br/>/************************************************************/<br/><br/>#include &lt;linux/config.h&gt;<br/>#include &lt;linux/init.h&gt;<br/>#include &lt;linux/fs.h&gt;<br/>#include &lt;linux/module.h&gt;<br/>#include &lt;linux/kernel.h&gt;<br/>#include &lt;linux/delay.h&gt;<br/>#include &lt;linux/miscdevice.h&gt;<br/>#include &lt;linux/devfs_fs_kernel.h&gt;<br/><br/>#include &lt;asm/uaccess.h&gt;<br/>#include &lt;asm/hardware.h&gt;<br/>#include &lt;asm/arch/regs-gpio.h&gt;<br/><br/>typedef unsigned int uint16 ;<br/>typedef unsigned char uint8 ;<br/><br/>/*<br/>//和引脚相关的宏定义<br/>#define CE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPF3<br/>#define CE_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPF3_OUTP<br/>#define SCK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPF4<br/>#define SCK_OUTP&nbsp;&nbsp; S3C2410_GPF4_OUTP<br/>#define MISO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG3<br/>#define MISO_INP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG3_INP<br/>#define IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG0<br/>#define IRQ_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG0_OUTP<br/>#define MOSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG5<br/>#define MOSI_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG5_OUTP<br/>#define CSN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG6<br/>#define CSN_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG6_OUTP<br/>*/<br/><br/>//和引脚相关的宏定义<br/>#define CSN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPF3<br/>#define CSN_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPF3_OUTP<br/>#define MOSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPF4<br/>#define MOSI_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPF4_OUTP<br/>#define IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG3<br/>#define IRQ_INP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG3_INP<br/>#define MISO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG0<br/>#define MISO_INP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG0_INP<br/>#define SCK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S3C2410_GPG5<br/>#define SCK_OUTP&nbsp;&nbsp; S3C2410_GPG5_OUTP<br/>#define CE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG6<br/>#define CE_OUTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_GPG6_OUTP<br/><br/>#define DEVICE_NAME&nbsp;&nbsp;&nbsp;&nbsp; &quot;NRF24L01&quot; //设备名称，在可以 /proc/devices 查看<br/>#define NRF24L01_MAJOR&nbsp;&nbsp; 241&nbsp;&nbsp;//主设备号<br/>#define TxBufSize&nbsp;&nbsp;&nbsp;&nbsp;32<br/><br/>uint8&nbsp;&nbsp;TxBuf[TxBufSize]=&#123;<br/> 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,<br/> 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,<br/> 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,<br/> 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,<br/>&#125;;<br/><br/>//NRF24L01端口定义<br/>#define CE_OUT&nbsp;&nbsp;s3c2410_gpio_cfgpin(CE, CE_OUTP)&nbsp;&nbsp;//数据线设置为输出<br/>#define CE_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(CE, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define CE_L&nbsp;&nbsp;s3c2410_gpio_setpin(CE, 0)&nbsp;&nbsp; //拉低数据线电平 <br/>#define CE_H&nbsp;&nbsp;s3c2410_gpio_setpin(CE, 1)&nbsp;&nbsp; //拉高数据线电平<br/><br/>#define SCK_OUT&nbsp;&nbsp;s3c2410_gpio_cfgpin(SCK, SCK_OUTP) //数据线设置为输出<br/>#define SCK_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(SCK, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define SCK_L&nbsp;&nbsp;s3c2410_gpio_setpin(SCK, 0)&nbsp;&nbsp;//拉低数据线电平 <br/>#define SCK_H&nbsp;&nbsp;s3c2410_gpio_setpin(SCK, 1)&nbsp;&nbsp;//拉高数据线电平 <br/><br/>#define MISO_IN&nbsp;&nbsp;s3c2410_gpio_cfgpin(MISO, MISO_INP) //数据线设置为输出<br/>#define MISO_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(MISO, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define MISO_STU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s3c2410_gpio_getpin(MISO)&nbsp;&nbsp; //数据状态<br/><br/>#define IRQ_IN&nbsp;&nbsp;s3c2410_gpio_cfgpin(IRQ, IRQ_INP) //数据线设置为输出<br/>#define IRQ_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(IRQ, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define IRQ_L&nbsp;&nbsp;s3c2410_gpio_setpin(IRQ, 0)&nbsp;&nbsp; //拉低数据线电平 <br/>#define IRQ_H&nbsp;&nbsp;s3c2410_gpio_setpin(IRQ, 1)&nbsp;&nbsp; //拉高数据线电平 <br/><br/>#define MOSI_OUT s3c2410_gpio_cfgpin(MOSI, MOSI_OUTP) //数据线设置为输出<br/>#define MOSI_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(MOSI, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define MOSI_L&nbsp;&nbsp;s3c2410_gpio_setpin(MOSI, 0)&nbsp;&nbsp;//拉低数据线电平 <br/>#define MOSI_H&nbsp;&nbsp;s3c2410_gpio_setpin(MOSI, 1)&nbsp;&nbsp;//拉高数据线电平 <br/><br/>#define CSN_OUT&nbsp;&nbsp;s3c2410_gpio_cfgpin(CSN, CSN_OUTP) //数据线设置为输出<br/>#define CSN_UP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410_gpio_pullup(CSN, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开上拉电阻<br/>#define CSN_L&nbsp;&nbsp;s3c2410_gpio_setpin(CSN, 0)&nbsp;&nbsp;//拉低数据线电平 <br/>#define CSN_H&nbsp;&nbsp;s3c2410_gpio_setpin(CSN, 1)&nbsp;&nbsp;//拉高数据线电平 <br/> <br/><br/>//NRF24L01<br/>#define TX_ADR_WIDTH&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 5 uint8s TX address width<br/>#define RX_ADR_WIDTH&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 5 uint8s RX address width<br/>#define TX_PLOAD_WIDTH&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;// 20 uint8s TX payload<br/>#define RX_PLOAD_WIDTH&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 20 uint8s TX payload<br/>uint8 const TX_ADDRESS[TX_ADR_WIDTH]= &#123;0x34,0x43,0x10,0x10,0x01&#125;;&nbsp;&nbsp;&nbsp;&nbsp;//本地地址<br/>uint8 const RX_ADDRESS[RX_ADR_WIDTH]= &#123;0x34,0x43,0x10,0x10,0x01&#125;;&nbsp;&nbsp;&nbsp;&nbsp;//接收地址<br/><br/><br/>//NRF24L01寄存器指令<br/>#define READ_REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;// 读寄存器指令<br/>#define WRITE_REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x20&nbsp;&nbsp;&nbsp;&nbsp;// 写寄存器指令<br/>#define RD_RX_PLOAD&nbsp;&nbsp;&nbsp;&nbsp; 0x61&nbsp;&nbsp;&nbsp;&nbsp;// 读取接收数据指令<br/>#define WR_TX_PLOAD&nbsp;&nbsp;&nbsp;&nbsp; 0xA0&nbsp;&nbsp;&nbsp;&nbsp;// 写待发数据指令<br/>#define FLUSH_TX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xE1&nbsp;&nbsp;&nbsp;&nbsp;// 冲洗发送 FIFO指令<br/>#define FLUSH_RX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xE2&nbsp;&nbsp;&nbsp;&nbsp;// 冲洗接收 FIFO指令<br/>#define REUSE_TX_PL&nbsp;&nbsp;&nbsp;&nbsp; 0xE3&nbsp;&nbsp;&nbsp;&nbsp;// 定义重复装载数据指令<br/>#define NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xFF&nbsp;&nbsp;&nbsp;&nbsp;// 保留<br/><br/><br/>//SPI(nRF24L01)寄存器地址<br/>#define CONFIG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;// 配置收发状态，CRC校验模式以及收发状态响应方式<br/>#define EN_AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x01&nbsp;&nbsp;// 自动应答功能设置<br/>#define EN_RXADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x02&nbsp;&nbsp;// 可用信道设置<br/>#define SETUP_AW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03&nbsp;&nbsp;// 收发地址宽度设置<br/>#define SETUP_RETR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x04&nbsp;&nbsp;// 自动重发功能设置<br/>#define RF_CH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x05&nbsp;&nbsp;// 工作频率设置<br/>#define RF_SETUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x06&nbsp;&nbsp;// 发射速率、功耗功能设置<br/>#define STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07&nbsp;&nbsp;// 状态寄存器<br/>#define OBSERVE_TX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x08&nbsp;&nbsp;// 发送监测功能<br/>#define CD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x09&nbsp;&nbsp;// 地址检测&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>#define RX_ADDR_P0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0A&nbsp;&nbsp;// 频道0接收数据地址<br/>#define RX_ADDR_P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0B&nbsp;&nbsp;// 频道1接收数据地址<br/>#define RX_ADDR_P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0C&nbsp;&nbsp;// 频道2接收数据地址<br/>#define RX_ADDR_P3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0D&nbsp;&nbsp;// 频道3接收数据地址<br/>#define RX_ADDR_P4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0E&nbsp;&nbsp;// 频道4接收数据地址<br/>#define RX_ADDR_P5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0F&nbsp;&nbsp;// 频道5接收数据地址<br/>#define TX_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10&nbsp;&nbsp;// 发送地址寄存器<br/>#define RX_PW_P0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x11&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define RX_PW_P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x12&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define RX_PW_P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x13&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define RX_PW_P3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x14&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define RX_PW_P4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x15&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define RX_PW_P5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x16&nbsp;&nbsp;// 接收频道0接收数据长度<br/>#define FIFO_STATUS&nbsp;&nbsp;&nbsp;&nbsp; 0x17&nbsp;&nbsp;// FIFO栈入栈出状态寄存器设置<br/><br/> <br/><br/>uint8 init_NRF24L01(void);<br/><br/>uint8 SPI_RW(uint8 tmp);<br/><br/>uint8 SPI_Read(uint8 reg);<br/><br/>void SetRX_Mode(void);<br/><br/>uint8 SPI_RW_Reg(uint8 reg, uint8 value);<br/><br/>uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);<br/><br/>uint8 SPI_Write_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);<br/><br/>unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);<br/><br/>void nRF24L01_TxPacket(unsigned char * tx_buf);<br/><br/>//全局变量<br/>uint8 opencount = 0;<br/><br/><br/>//<br/>uint8&nbsp;&nbsp;&nbsp;&nbsp; sta;&nbsp;&nbsp; //状态标志<br/>#define&nbsp;&nbsp; RX_DR&nbsp;&nbsp;&nbsp;&nbsp;6<br/>#define&nbsp;&nbsp; TX_DS&nbsp;&nbsp;&nbsp;&nbsp;5<br/>#define&nbsp;&nbsp; MAX_RT&nbsp;&nbsp; 4<br/><br/> <br/><br/>//NRF24L01初始化<br/>uint8 init_NRF24L01(void)<br/>&#123;<br/>/*<br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_UP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCK_UP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;MISO_UP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;IRQ_UP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;MOSI_UP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_UP;&nbsp;&nbsp;<br/>*/<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;MISO_UP;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_OUT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_OUT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCK_OUT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;MOSI_OUT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;MISO_IN;<br/>&nbsp;&nbsp;&nbsp;&nbsp;IRQ_IN;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;udelay(500);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_L;&nbsp;&nbsp;&nbsp;&nbsp;// chip enable<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_H;&nbsp;&nbsp; // Spi disable<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SCK_L;&nbsp;&nbsp; // Spi clock line init high<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);&nbsp;&nbsp;&nbsp;&nbsp;// 写本地地址 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;频道0自动 ACK应答允许 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);&nbsp;&nbsp;//&nbsp;&nbsp;允许接收地址只有频道0，如果需要多频道可以参考Page21 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + RF_CH, 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp; 设置信道工作为2.4GHZ，收发必须一致<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度，本次设置为32字节<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置发射速率为1MHZ，发射功率为最大值0dB<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IRQ收发完成中断响应，16位CRC ，主接收<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(1000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;test 1 &#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(1000);<br/>/*<br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;test 2 &#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(1000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;test 3 &#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(1000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;test 4 &#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(1000);<br/>*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;return (1);<br/>&#125;<br/><br/><br/>//函数：uint8 SPI_RW(uint8 tmp)<br/>//功能：NRF24L01的SPI写时序tmp<br/>uint8 SPI_RW(uint8 tmp)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uint8 bit_ctr;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;for(bit_ctr=0 ;bit_ctr&lt;8 ;bit_ctr++) // output 8-bit<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/> if(tmp &amp; 0x80)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // output &#039;tmp&#039;, MSB to MOSI<br/>&nbsp;&nbsp;&nbsp;&nbsp; MOSI_H;<br/> else<br/>&nbsp;&nbsp;&nbsp;&nbsp; MOSI_L;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp &lt;&lt;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // shift next bit into MSB..<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set SCK high..<br/> ndelay(60);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp &#124;= MISO_STU;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// capture current MISO bit<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ..then set SCK low again<br/> ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return(tmp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// return read tmp<br/>&#125;<br/><br/> <br/><br/>//函数：uint8 SPI_Read(uint8 reg)<br/>//功能：NRF24L01的SPI时序<br/>uint8 SPI_Read(uint8 reg)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uint8 reg_val;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// CSN low, initialize SPI communication...<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Select register to read from..<br/>&nbsp;&nbsp;&nbsp;&nbsp;reg_val = SPI_RW(0);&nbsp;&nbsp;&nbsp;&nbsp; // ..then read registervalue<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CSN high, terminate SPI communication<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return(reg_val);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return register value<br/>&#125;<br/><br/> <br/><br/>//功能：NRF24L01读写寄存器函数<br/>uint8 SPI_RW_Reg(uint8 reg, uint8 value)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uint8 status;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CSN low, init SPI transaction<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;status = SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// select register<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ..and write value to it..<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // CSN high again<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// return nRF24L01 status uint8<br/>&#125;<br/><br/> <br/><br/>//函数：uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)<br/>//功能: 用于读数据，reg：为寄存器地址，pBuf：为待读出数据地址，uchars：读出数据的个数<br/>uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uint8 status,uint8_ctr;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Set CSN low, init SPI tranaction<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;status = SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Select register to write to and read status uint8<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;for(uint8_ctr=0;uint8_ctr&lt;uchars;uint8_ctr++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuf[uint8_ctr] = SPI_RW(0);&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ndelay(20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_H;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// return nRF24L01 status uint8<br/>&#125;<br/><br/><br/>//函数：uint8 SPI_Write_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)<br/>//功能: 用于写数据：为寄存器地址，pBuf：为待写入数据地址，uchars：写入数据的个数<br/>uint8 SPI_Write_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;uint8 status,uint8_ctr;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SPI使能 <br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;status = SPI_RW(reg);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(uint8_ctr=0; uint8_ctr&lt;uchars; uint8_ctr++) //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW(*pBuf++);<br/>&nbsp;&nbsp;&nbsp;&nbsp; ndelay(20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CSN_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭SPI<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&#125;<br/><br/><br/>//函数：void SetRX_Mode(void)<br/>//功能：数据接收配置<br/>void SetRX_Mode(void)<br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_L;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>//&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IRQ收发完成中断响应，16位CRC ，主接收<br/>&nbsp;&nbsp;&nbsp;&nbsp;//udelay(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_H;<br/>&nbsp;&nbsp;&nbsp;&nbsp;udelay(130);<br/>&#125;<br/><br/> <br/><br/>//函数：unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)<br/>//功能：数据读取后放如rx_buf接收缓冲区中<br/>unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;unsigned char revale=0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;sta=SPI_Read(STATUS);&nbsp;&nbsp; // 读取状态寄存其来判断数据接收状况<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(sta &amp; (1&lt;&lt;RX_DR))&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否接收到数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CE_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //SPI使能<br/>&nbsp;&nbsp;&nbsp;&nbsp; udelay(50);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;revale =1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取数据完成标志<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,sta);&nbsp;&nbsp; //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1，通过写1来清楚中断标志<br/>&nbsp;&nbsp;&nbsp;&nbsp;return revale;<br/>&#125;<br/><br/><br/>//函数：void nRF24L01_TxPacket(unsigned char * tx_buf)<br/>//功能：发送 tx_buf中数据<br/>void nRF24L01_TxPacket(unsigned char * tx_buf)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_L;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //StandBy I模式 <br/>&nbsp;&nbsp;&nbsp;&nbsp;ndelay(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 装载数据 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// IRQ收发完成中断响应，16位CRC，主发送<br/>&nbsp;&nbsp;&nbsp;&nbsp;CE_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置高CE，激发数据发送<br/>&nbsp;&nbsp;&nbsp;&nbsp;udelay(10);<br/>&#125;<br/><br/>//文件的写函数<br/>static ssize_t nrf24l01_write(struct file *filp, const char *buffer,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t count, loff_t *ppos)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( copy_from_user( &amp;TxBuf, buffer, count ) );&nbsp;&nbsp;&nbsp;&nbsp;//从内核空间复制到用户空间<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/> printk(&quot;Can&#039;t Send Data !&quot;);<br/> return -EFAULT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;OK! &#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return(10);<br/>&#125;<br/><br/>//的读函数<br/>static ssize_t nrf24l01_read(struct file *filp, char *buffer,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t count, loff_t *ppos)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;nRF24L01_TxPacket(TxBuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,0XFF);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;read &#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return (10);<br/>&#125;<br/><br/>static int nrf24l01_open(struct inode *node, struct file *file)<br/>&#123;<br/>&nbsp;&nbsp;uint8 flag = 0;<br/><br/>&nbsp;&nbsp;if(opencount == 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;return -EBUSY;<br/> <br/>&nbsp;&nbsp;flag = init_NRF24L01();<br/><br/>&nbsp;&nbsp;mdelay(100);<br/>&nbsp;&nbsp;if(flag == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;uable to open device!&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opencount++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;device opened !&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&nbsp;&nbsp; &#125;<br/>&#125;<br/><br/>static int nrf24l01_release(struct inode *node, struct file *file)<br/>&#123;<br/>&nbsp;&nbsp;opencount--;<br/>&nbsp;&nbsp;printk(DEVICE_NAME &quot; released !&#92;n&quot;);<br/>&nbsp;&nbsp;return 0;<br/>&#125;<br/><br/>static struct file_operations nrf24l01_fops = &#123;<br/>&nbsp;&nbsp;.owner = THIS_MODULE,<br/>&nbsp;&nbsp;.open = nrf24l01_open,<br/>&nbsp;&nbsp;.write = nrf24l01_write,<br/>&nbsp;&nbsp;.read = nrf24l01_read,<br/>&nbsp;&nbsp;.release = nrf24l01_release,<br/>&#125;;<br/><br/>static int __init nrf24l01_init(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int ret;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;Initial driver for NRF24L01......................&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;ret = register_chrdev(NRF24L01_MAJOR, DEVICE_NAME, &amp;nrf24l01_fops);<br/>&nbsp;&nbsp;&nbsp;&nbsp;mdelay(10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (ret &lt; 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(DEVICE_NAME &quot; can&#039;t register major number&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(DEVICE_NAME &quot; register success&#92;n&quot;);<br/> return 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>static void __exit nrf24l01_exit(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;unregister_chrdev(NRF24L01_MAJOR, DEVICE_NAME);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;NRF24L01 unregister success &#92;n&quot;);<br/>&#125;<br/><br/><br/>module_init(nrf24l01_init);<br/>module_exit(nrf24l01_exit);<br/>MODULE_AUTHOR(&quot;jammy_lee@163.com&quot;);<br/>MODULE_DESCRIPTION(&quot;nrf24l01 driver for TQ2440&quot;);<br/>MODULE_LICENSE(&quot;GPL&quot;);<br/><br/>测试程序：<br/><br/>/************************************************************/<br/>//文件名：test_ds18b20.c<br/>//功能:测试linux下的ds18b20程序<br/>//使用说明: (1)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)<br/>//作者:jammy-lee<br/>//日期:2010-01-18<br/>/************************************************************/<br/><br/>#include &lt;stdio.h&gt;<br/><br/>#include &lt;stdlib.h&gt;<br/><br/>#include &lt;unistd.h&gt;<br/><br/>#include &lt;sys/ioctl.h&gt;<br/><br/>#include &lt;sys/types.h&gt;<br/><br/>#include &lt;sys/stat.h&gt;<br/><br/>#include &lt;fcntl.h&gt;<br/><br/>#include &lt;sys/select.h&gt;<br/><br/>#include &lt;sys/time.h&gt;<br/><br/>#include &lt;errno.h&gt;<br/><br/>unsigned char TxBuf[32] = &#123;0x00&#125;;<br/><br/>int main(void)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;int fd = -1;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;int count = 1;<br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//fd = open(&quot;/dev/nrf24l01&quot;, 0);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fd = open(&quot;/dev/nrf24l01&quot;, O_RDWR);&nbsp;&nbsp; //打开nrf24l01为可读写文件<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(fd &lt; 0)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;Can&#039;t open /dev/nrf24l01 &#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;open /dev/nrf24l01 success &#92;n&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;while(count &lt;= 5)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(fd, &amp;TxBuf , sizeof(TxBuf));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Sending %d time &#92;n&quot;, count);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usleep(100*1000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br/>&#125;<br/><br/> <br/><br/> 来源：http://blog.163.com/prevBlogPerma.do?host=jammy_lee&amp;srl=101195478201016112945395&amp;mode=prev
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Linux下驱动2.4G无线模块(NRF24L01)]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>