|
|
本帖最后由 mylife1213 于 2014-11-7 15:44 编辑
买了24L01+快一年了,这个星期才开始写程序
建议先完整看一下中文文档在看我的建议才会比较好理解.
24l01寄存器真的很多从0x00到0x1D总共30个寄存器! 建议入手的极客如果不想用别人的库去实现的通讯的话一定要去北欧半导体下载官方文档(英文版)和讯通翻译的Nrf24l01(注意没有+)中文版结合起来用,带+的是增强版,增加了:
1·可设置为250K传输速度
2·有连续载波传输功能
3·能设置为带数据的ACK功能
4·增加了RPD(传输功率检测功能)
5·然后一些功率,电流等有极小的变化
写24l01+的驱动要注意几点:
1:注意各个电源状态切换的等待时间
2:注意CE引脚和发送接收和待机状态的搭配
3:注意0x07 STATUS寄存器MAX_RT标志位如果置位(自动重试发送达到最大次数),一定要进行程序处理,不然是没办法在发送其他数据的!我的处理方法是对STATUS写0xFF初始化中断标志(对该寄存器对应位写1是清除中断状态),然后决定要重试才是舍弃该包
4:要实现1个24l01+接收多个发送的数据要注意配置0x02寄存器使能对应通道接收,还有一定要一起配置0x11到0x16对应的P0-P5的数据宽度,我个人建议是也开启0x01 EN_AA对应通道的自动应答寄存器,自动应答我觉得很实用!(查看讯通pdf- 16页)
5:对于对应通道地址的配置,0x0A对应的是P0通道(一般用于发送数据和ACK),地址长度按照0x03 SETUP_AW寄存器(设置地址宽度所有数据通道) 配件进行地址P0发送端地址写入配置! P1-P5是接收通道,P1地址按照SETUP_AW寄存器设定的地址长度进行配置,P2-P5只需要配置一个字节,24L01+规定P2-P5高位1个字节和P1不同,其他都是一样的,比如P1配置地址是0x01,0xff,0xff,0xff,0xff (这些设定地址宽度是5个字节) ,P2(0x0C寄存器)写入0x02,那么P2完整的地址是0x02,0xff,0xff,0xff,0xff,这个是发送端给P2通道的发送地址!
6:0x07 STATUS寄存器的RX_P_NO 是那个通道接收到数据的,当STATUS RX_DR置位高,而0x00寄存器配置为IRQ中断允许,那么中断程序要去取数据,先得读取STATUS RX_P_NO寄存器对应接收到那个通道的数据,然后读取到的数据就是这个通道的!这个是多通道要注意的!
7:函数介绍NRF24L01 的控制程序主要包括以下几个函数
uchar SPI_RW(uchar byte);
uchar SPI_RW_Reg(uchar reg, uchar value);
uchar SPI_Read(uchar reg);
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes);
void RX_Mode(void);
void TX_Mode(void);
4.1.1 uchar SPI_RW(uchar byte)
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (byte & 0x80); // output 'byte', MSB to MOSI
byte = (byte << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
byte |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(byte); // return read byte
}
最基本的函数,完成GPIO 模拟SPI 的功能。将输出字节(MOSI)从MSB 循环输出,
同时将输入字节(MISO)从LSB 循环移入。上升沿读入,下降沿输出。(从SCK 被初始化
为低电平可以判断出)。
4.1.2 uchar SPI_RW_Reg (uchar reg, uchar value)
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status byte
}
寄存器访问函数:用来设置24L01 的寄存器的值。基本思路就是通过WRITE_REG 命令(也
就是0x20+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。对于
函数来说也就是把value 值写到reg 寄存器中。
需要注意的是,访问NRF24L01 之前首先要enable 芯片(CSN=0;),访问完了以后再disable
芯片(CSN=1;)。
4.1.3 uchar SPI_Read (uchar reg);
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN low, initialize SPI communication
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication
return(reg_val); // return register value
}
读取寄存器值的函数:基本思路就是通过READ_REG 命令(也就是0x00+寄存器地址),把
寄存器中的值读出来。对于函数来说也就是把reg 寄存器的值读到reg_val 中去。
4.1.4 uchar SPI_Read_Buf (uchar reg, uchar *pBuf, uchar bytes);
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01
CSN = 1; // Set CSN high again
return(status); // return nRF24L01 status byte
}
接收缓冲区访问函数:主要用来在接收时读取FIFO 缓冲区中的值。基本思路就是通过
READ_REG 命令把数据从接收FIFO(RD_RX_PLOAD)中读出并存到数组里面去。
4.1.5 uchar SPI_Write_Buf (uchar reg, uchar *pBuf, uchar bytes);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and readstatus byte
Uart_Delay(10);
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
SPI_RW(*pBuf++);
CSN = 1; // Set CSN high again
return(status); // return nRF24L01 status byte
}
发射缓冲区访问函数:主要用来把数组里的数放到发射FIFO 缓冲区中。基本思路就是通过
WRITE_REG 命令把数据存到发射FIFO(WR_TX_PLOAD)中去。
已经编写好库文件 http://www.geek-workshop.com/thread-11501-1-1.html
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|