[MSP430F149] NRF24L01模块,已调试成功

nrf24l01.h

查看代码
 1 #define uchar unsigned char 

 2 #define uint unsigned int

 3 

 4 //****************************************IO端口定义*************************************** 

 5 

 6  #define CE_PORT        P5OUT

 7  #define CSN_PORT        P5OUT

 8  #define SCK_PORT        P5OUT

 9  #define MOSI_PORT        P4OUT

10  #define MISO_PORT        P4IN

11  #define IRQ_PORT        P4OUT

12 

13  #define CE_BIT            BIT1

14  #define CSN_BIT        BIT3

15  #define SCK_BIT        BIT2

16  #define MOSI_BIT        BIT5

17  #define MISO_BIT        BIT4

18  #define IRQ_BIT        BIT2

19 

20 

21 //*********************************************NRF24L01************************************* 

22 

23 #define TX_ADR_WIDTH    5    // 5 uints TX address width 

24 #define RX_ADR_WIDTH    5    // 5 uints RX address width 

25 #define TX_PLOAD_WIDTH  20  // 20 uints TX payload 

26 #define RX_PLOAD_WIDTH  20   // 20 uints TX payload 

27 

28  

29 //***************************************NRF24L01寄存器指令******************************************************* 

30 

31 #define READ_REG        0x00   // 读寄存器指令 

32 #define WRITE_REG       0x20  // 写寄存器指令 

33 #define RD_RX_PLOAD     0x61   // 读取接收数据指令 

34 #define WR_TX_PLOAD     0xA0   // 写待发数据指令 

35 #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令 

36 #define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令 

37 #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令 

38 #define NOP             0xFF   // 保留 

39 

40 //*************************************SPI(nRF24L01)寄存器地址**************************************************** 

41 

42 #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式 

43 #define EN_AA           0x01  // 自动应答功能设置 

44 #define EN_RXADDR       0x02  // 可用信道设置 

45 #define SETUP_AW        0x03  // 收发地址宽度设置 

46 #define SETUP_RETR      0x04  // 自动重发功能设置 

47 #define RF_CH           0x05  // 工作频率设置 

48 #define RF_SETUP        0x06  // 发射速率、功耗功能设置 

49 #define STATUS          0x07  // 状态寄存器 

50 #define OBSERVE_TX      0x08  // 发送监测功能 

51 #define CD              0x09  // 地址检测            

52 #define RX_ADDR_P0      0x0A  // 频道0接收数据地址 

53 #define RX_ADDR_P1      0x0B  // 频道1接收数据地址 

54 #define RX_ADDR_P2      0x0C  // 频道2接收数据地址 

55 #define RX_ADDR_P3      0x0D  // 频道3接收数据地址 

56 #define RX_ADDR_P4      0x0E  // 频道4接收数据地址 

57 #define RX_ADDR_P5      0x0F  // 频道5接收数据地址 

58 #define TX_ADDR         0x10  // 发送地址寄存器 

59 #define RX_PW_P0        0x11  // 接收频道0接收数据长度 

60 #define RX_PW_P1        0x12  // 接收频道0接收数据长度 

61 #define RX_PW_P2        0x13  // 接收频道0接收数据长度 

62 #define RX_PW_P3        0x14  // 接收频道0接收数据长度 

63 #define RX_PW_P4        0x15  // 接收频道0接收数据长度 

64 #define RX_PW_P5        0x16  // 接收频道0接收数据长度 

65 #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置 

66 

67 

68 void Delay(unsigned int x); 

69 void InerDelay_us(unsigned long n); 

70 void Init_NRF24L01(void); 

71 uint SPI_RW(uint uuchar); 

72 uchar SPI_Read(uchar reg); 

73 void SetRX_Mode(void); 

74 uint SPI_RW_Reg(uchar reg, uchar value); 

75 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); 

76 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); 

77 unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  

78 void NRF24L01_TxPacket(unsigned char * tx_buf) ;

 

nrf24l01.c

查看代码
  1 #include <msp430f149.h> 

  2 #include "nrf24l01.h"

  3 

  4 //************************************************************************************** 

  5 

  6 uint sta;   //状态标志 



  7 

  8 #define RX_DR  sta & BIT6 

  9 #define TX_DS  sta & BIT5 

 10 #define MAX_RT sta & BIT4

 11 

 12 uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //接收地址

 13 uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};

 14 

 15 void Init_NRF24L01(void) 

 16 { 

 17   //配置端口

 18  P4DIR &= ~MISO_BIT; 

 19  P4DIR |= MOSI_BIT + IRQ_BIT ;

 20  P5DIR |=  CE_BIT + SCK_BIT + CSN_BIT;

 21 

 22    __delay_cycles(800);

 23    CE_PORT &= ~ CE_BIT;   //CE=0;

 24    CSN_PORT |= CSN_BIT;  // CSN=1; 

 25    SCK_PORT &= ~SCK_BIT;   //SCK=0; 

 26    

 27    

 28    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址

 29    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收的地址 

 30    SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动 ACK应答允许禁止    4

 31    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0      5   发送时注意这两点

 32    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);   //禁止自动重发

 33    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致 

 34    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 

 35    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为1MHZ,发射功率为最大值0dB    

 36 }

 37 

 38 uint SPI_RW(uint uuchar) 

 39 { 

 40    uint bit_ctr; 

 41 

 42    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit 

 43    { 

 44       if(uuchar & 0x80) MOSI_PORT |= MOSI_BIT;        // output 'uchar', MSB to MOSI 

 45         else MOSI_PORT &= ~MOSI_BIT;

 46       uuchar = (uuchar << 1);           // shift next bit into MSB.. 

 47       SCK_PORT |= SCK_BIT;   //SCK=1;                       // Set SCK high.. 

 48       if(MISO_PORT & MISO_BIT)

 49          uuchar |= 0x01;           // capture current MISO bit 

 50       SCK_PORT &= ~SCK_BIT;   //SCK=0;                // ..then set SCK low again 

 51    } 

 52    return(uuchar);               // return read uchar 

 53 }

 54 

 55  

 56 

 57 

 58 uchar SPI_Read(uchar reg) 

 59 { 

 60      uchar reg_val; 

 61 

 62      CSN_PORT &= ~CSN_BIT; //CSN = 0;                // CSN low, initialize SPI communication... 

 63      SPI_RW(reg);            // Select register to read from.. 

 64      reg_val = SPI_RW(0);    // ..then read registervalue 

 65      CSN_PORT |= CSN_BIT; // CSN = 1;                // CSN high, terminate SPI communication 

 66      return(reg_val);        // return register value 

 67 }

 68 

 69  

 70 

 71 

 72 uint SPI_RW_Reg(uchar reg, uchar value) 

 73 { 

 74   uint status; 

 75 

 76   CSN_PORT &= ~CSN_BIT; //CSN = 0;                   // CSN low, init SPI transaction 

 77   status = SPI_RW(reg);      // select register 

 78   SPI_RW(value);             // ..and write value to it.. 

 79   CSN_PORT |= CSN_BIT;//CSN = 1;                   // CSN high again 

 80   return(status);            // return nRF24L01 status uchar 

 81 }

 82 

 83  

 84 

 85 

 86 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) 

 87 { 

 88 

 89   uint status,uchar_ctr; 

 90 

 91   CSN_PORT &= ~CSN_BIT;//CSN = 0;                      // Set CSN low, init SPI tranaction 

 92   status = SPI_RW(reg);         // Select register to write to and read status uchar 

 93   for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) 

 94   {

 95     pBuf[uchar_ctr] = SPI_RW(0);    //

 96   }  

 97   CSN_PORT |= CSN_BIT;//CSN = 1;                            

 98   return(status);                    // return nRF24L01 status uchar 

 99 }

100 

101  

102 

103 

104 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) 

105 { 

106    uint status,uchar_ctr; 

107 

108   CSN_PORT &= ~CSN_BIT;// CSN = 0;            //SPI使能        

109   status = SPI_RW(reg);    

110   for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // 

111   {

112       SPI_RW(*pBuf++);

113   }   

114   CSN_PORT |= CSN_BIT;//CSN = 1;           //关闭SPI 

115   return(status);    //  

116 } 

117 

118  

119 

120 

121 void SetRX_Mode(void) 

122 { 

123     CE_PORT &= ~CE_BIT;//CE = 0;

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

125     CE_PORT |= CE_BIT;//CE = 1;  

126     //InerDelay_us(130);

127         __delay_cycles(1000);

128 }

129 

130  

131 

132 

133 unsigned char NRF24L01_RxPacket(unsigned char* rx_buf) 

134 

135 { 

136     unsigned char revale=0; 

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

138     if(RX_DR)    // 判断是否接收到数据 

139     { 

140          CE_PORT &= ~CE_BIT; //CE = 0;    //SPI使能 

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

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

143     } 

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

145     return revale; 

146 }

147 

148  

149 

150 void NRF24L01_TxPacket(unsigned char * tx_buf) 

151 

152 { 

153     CE_PORT &= ~CE_BIT; //CE = 0;   //StandBy I模式   

154     SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  

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

156     CE_PORT |= CE_BIT; // CE = 1;   //置高CE,激发数据发送 

157     //InerDelay_us(50);

158         __delay_cycles(400);

159 }

 

你可能感兴趣的:(调试)