[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 }

 

posted @ 2012-09-25 15:13  sky1991  阅读(2314)  评论(0编辑  收藏  举报