zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    【转载wpf命令】
    【转载WPF资源】
    【转载MVVM模式的简介】
    【转载有关XmlAttribute的知识】
    【test7】stream、用于输入和输出的类、特性
    【补充作业】XML和LINQ
    CodeVS 1084 乒乓球
    android开发之屏幕旋转
    Android开发之新建项目报错的问题
    Android 开发获取用户权限
  • 原文地址:https://www.cnblogs.com/sky1991/p/2701596.html
Copyright © 2011-2022 走看看