突破渴望

(原创)今天写的24L01 例程,欢迎大家讨论

0
阅读(4085)

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:该函数完成多个字节的写入,返回状态字