(原创)今天写的24L01 例程,欢迎大家讨论
0赞24L01 有20个引脚,各个引脚的定义如下:
CE:使能发射或接收;
CSN,SCK,MOSI,MISO:SPI引脚端,微处理器可通过此引脚配置nRF24L01:
IRQ:中断;
VDD:电源输入端;
VSS:电源地:
XC2,XC1:晶体振荡器引脚;
VDD_PA:为功率放大器供电,输出为1.8 V;
ANT1,ANT2:天线接口;
IREF:参考电流输入
使用IO口模拟SPI,以龙丘科技的无线模块为例,使用M口模拟SPI可如下定义
#define NRFIRQ PTM_PTM0
#define NRFCE PTM_PTM1
#define NRFMISO PTM_PTM2
#define NRFCSN PTM_PTM3
#define NRFMOSI PTM_PTM4
#define NRFSCK PTM_PTM5
RX_DR: 接收数据准备好,接收缓冲区有新的数据到达时被置为1,向该位写1可清除该位
TX_DS: 缓冲区数据被发送完后被置为1,如果自动应答启用的话,只有在对方应答到达后才会置1,向该位写1可清除该位
MAX_RT: 若没有收到对方确认,24L01会自动超时重传,当到达最大重传次数后,该位被置1,向该位写1可清除该位。若不清除该位则无法进一步通信。
RX_P_NO: 3bit,表示正在读取缓冲区数据载荷的数据管道编号。000~101:数据管道编号。
110:没有使用
111:接收缓冲区空
Ps:接收到新数据,数据发送完毕,重传到达最大次数都会引起中断,通过读取状态字可查询中断事件。
中断由IRQ引脚低电平触发。
SPI写模式
/********************************************************************
SPI读写函数
写入一个字节并返回一个字节
ch:需要写入的字节
*********************************************************************/
unsigned char SPI_Byte_RW(unsigned char ch)
{
unsigned char i;
for(i=1;i<=8;i++)
{
if(ch&0x80)//如果ch最高位为1
NRFMOSI=1;
else
NRFMOSI=0;
NRFSCK=1;//时钟置高
ch<<=1;//左移一位
_asm(nop);
_asm(nop);
NRFSCK=0;//时钟置低
ch|=NRFMISO;
}
return(ch);
}
解释:
- 该函数作用为一次SPI数据交换,将ch中一个字节数据按照高位在前低位在后的顺序串行发送,每发送一个bit都读回一个bit,8个比特发送完毕,同时也和24L01完成一次数据交换。
- 该函数是spi通信的基本函数
- 注意spi通信中,可以一次读取或写入多个字节,顺序为低字节在前,高字节在后,每个字节是高位在前,低位在后。
- 参考SPI时序图,可见,上升沿写入1个bit,下降沿读入一个bit。
- 该SPI通信函数只涉及一个字节的读写,没有涉及CS信号线。
SPI_Byte_RW()函数应用举例,一次写入多个字节
/************************************************************************************************
函数:byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,len:写入数据的个数
************************************************************************************************/
byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
{
byte status,cnt;
NRFCSN = 0; //SPI使能
status = SPI_Byte_RW(reg); //第一个字节返回状态字
for(cnt=0; cnt<len; cnt++) //
SPI_Byte_RW(*pBuf++);
NRFCSN = 1; //关闭SPI
return(status); //
}
PS:该函数完成多个字节的写入,返回状态字
