您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI MSP430 >> MSP430 >> 正文
  nRF24l01&MSP430F5438的通讯的实现           ★★★ 【字体:
nRF24l01&MSP430F5438的通讯的实现
作者:玩转工控    文章来源:玩转工控    点击数:    更新时间:2015-5-15    

这段时间做了很多无线通讯方面的东东,在此就把相对比较难写的程序放上来和大家一起学习。

我这个通讯采用2个nRF24L01与MSP430F5438进行相互之间的通讯。主要目的测试MSP430F5438如何操作控制nRF24L01。在这也不详细多说了,给出程序代码大伙一看就明白。程序代码如下:

//*****************************************************************************
//
//  【名称】:2401测试程序
//  【功能】:无线通讯测试
//  【版本】:V1.0
//  【作者】:刘
//  【日期】:2011-11-16 09:35:00
//  【说明】:软件版本定义为:V1.0为初始版本,以后改进完善的版本以此类推为V2.0,V3.0.......
//
//*****************************************************************************
//
//  【功能】:头文件定义
//
//*****************************************************************************
#include <msp430x54x.h>
//*****************************************************************************
//
//  【功能】:端口定义
//
//*****************************************************************************
#define    Rst_RF24L01CE_1        P1OUT &=~BIT0       
#define    Set_RF24L01CE_1        P1OUT |= BIT0      
#define    Rst_RF24L01CSN_1       P1OUT &=~BIT2       
#define    Set_RF24L01CSN_1       P1OUT |= BIT2   
#define    Rst_RF24L01SCK_1       P1OUT &=~BIT4    
#define    Set_RF24L01SCK_1       P1OUT |= BIT4 
#define    Rst_RF24L01MOSI_1      P1OUT &=~BIT6
#define    Set_RF24L01MOSI_1      P1OUT |= BIT6
#define    Rst_RF24L01MISO_1      P2OUT &=~BIT0
#define    Set_RF24L01MISO_1      P2OUT |= BIT0
#define    Rst_RF24L01IRQ_1       P2OUT &=~BIT2     
#define    Set_RF24L01IRQ_1       P2OUT |= BIT2

#define    Rst_RF24L01CE_2        P3OUT &=~BIT0       
#define    Set_RF24L01CE_2        P3OUT |= BIT0      
#define    Rst_RF24L01CSN_2       P3OUT &=~BIT2       
#define    Set_RF24L01CSN_2       P3OUT |= BIT2   
#define    Rst_RF24L01SCK_2       P3OUT &=~BIT4    
#define    Set_RF24L01SCK_2       P3OUT |= BIT4 
#define    Rst_RF24L01MOSI_2      P3OUT &=~BIT6
#define    Set_RF24L01MOSI_2      P3OUT |= BIT6
#define    Rst_RF24L01MISO_2      P4OUT &=~BIT0
#define    Set_RF24L01MISO_2      P4OUT |= BIT0
#define    Rst_RF24L01IRQ_2       P4OUT &=~BIT2     
#define    Set_RF24L01IRQ_2       P4OUT |= BIT2
//*****************************************************************************
//
//  【功能】:常量定义
//
//*****************************************************************************
#define     TX_ADR_WIDTH          5               // 5字节发送地址宽度
#define     RX_ADR_WIDTH          5               // 5字节接收地址宽度
#define     TX_PLOAD_WIDTH        32              // 32字节发送数据宽度
#define     RX_PLOAD_WIDTH        32              // 32字节接收数据宽度
//*****************************************************************************
//  操作指令
//*****************************************************************************
#define     READ_REG              0x00              // 读寄存器指令
#define     WRITE_REG             0x20             // 写寄存器指令
#define     RD_RX_PLOAD           0x61              // 读取接收数据指令
#define     WR_TX_PLOAD           0xA0              // 写待发数据指令
#define     FLUSH_TX              0xE1             // 冲洗发送 FIFO指令
#define     FLUSH_RX              0xE2              // 冲洗接收 FIFO指令
#define     REUSE_TX_PL           0xE3              // 定义重复装载数据指令
#define     NOP1                  0xFF              // 保留
//*****************************************************************************
//  寄存器地址
//*****************************************************************************
#define     CONFIG                0x00                     // 配置收发状态,CRC校验模式以及收发状态响应方式
#define     EN_AA                 0x01                     // 自动应答功能设置
#define     EN_RXADDR             0x02                     // 可用信道设置
#define     SETUP_AW              0x03                     // 收发地址宽度设置
#define     SETUP_RETR            0x04                     // 自动重发功能设置
#define     RF_CH                 0x05                     // 工作频率设置
#define     RF_SETUP              0x06                     // 发射速率、功耗功能设置
#define     STATUS                0x07                     // 状态寄存器
#define     OBSERVE_TX            0x08                     // 发送监测功能
#define     CD                    0x09                     // 地址检测         
#define     RX_ADDR_P0            0x0A                     // 频道0接收数据地址
#define     RX_ADDR_P1            0x0B                     // 频道1接收数据地址
#define     RX_ADDR_P2            0x0C                     // 频道2接收数据地址
#define     RX_ADDR_P3            0x0D                     // 频道3接收数据地址
#define     RX_ADDR_P4            0x0E                     // 频道4接收数据地址
#define     RX_ADDR_P5            0x0F                     // 频道5接收数据地址
#define     TX_ADDR               0x10                     // 发送地址寄存器
#define     RX_PW_P0              0x11                     // 接收频道0接收数据长度
#define     RX_PW_P1              0x12                     // 接收频道0接收数据长度
#define     RX_PW_P2              0x13                     // 接收频道0接收数据长度
#define     RX_PW_P3              0x14                     // 接收频道0接收数据长度
#define     RX_PW_P4              0x15                     // 接收频道0接收数据长度
#define     RX_PW_P5              0x16                     // 接收频道0接收数据长度
#define     FIFO_STATUS           0x17                     // FIFO栈入栈出状态寄存器设置
//*****************************************************************************
//
//  【功能】: 全局变量定义
//
//*****************************************************************************
char  TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址
char  RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址
char  sta;
char TxBuf[32]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56};
char RxBuf[32];
unsigned char aa;
//*****************************************************************************
//
//  【功能】: 子函数定义
//
//*****************************************************************************
void RF24L01_IO_set(void);
void delay(unsigned long sTime);
void InitSys();
char SPI_RW(char data,char ch);
char SPI_Read(char reg,char ch);
char SPI_RW_Reg(char reg, char value,char ch);
char SPI_Read_Buf(char reg, char *pBuf, char chars,char ch);
char SPI_Write_Buf(char reg, char *pBuf, char chars,char ch);
void SetRX_Mode(char ch);
char nRF24L01_RxPacket(char* rx_buf,char ch);
void nRF24L01_TxPacket(char * tx_buf,char ch);
void init_NRF24L01(void);
void init_RF2401();
void SeTX_Mode(char ch);
//******************************************************************************
//
//  【名称】  void RF24L01_IO_set(void)
//  【功能】  IO端口初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无
//
//******************************************************************************
void RF24L01_IO_set(void)
{
      P1DIR |= BIT0 + BIT2 + BIT4 +BIT6;  
      P2DIR &= ~(BIT0 + BIT2);
      P3DIR |= BIT0 + BIT2 + BIT4 +BIT6;  
      P4DIR &= ~(BIT0 + BIT2);  
      P10DIR |= BIT6+BIT7;
}
//******************************************************************************
//
//  【名称】  void InitSys()
//  【功能】  系统时钟,寄存器初始化
//  【参数】  无
//  【返回】  无
//  【说明】  无
//
//******************************************************************************
void InitSys()
{
    int i;
    WDTCTL = WDTPW + WDTHOLD;                                      
    //  系统时钟设置
    P5SEL |= 0x0C;                                                
    UCSCTL6 &= ~XT2DRIVE_1;                                        
    //UCSCTL6 |=XCAP_3;                                              
    UCSCTL4  |= SELS__XT2CLK;                                     
    for(i=0xFF;i>0;i--);                                           
    UCSCTL7 &= ~(XT2OFFG + DCOFFG);
    SFRIFG1 &= ~OFIFG;
  
    _EINT();
    __bis_SR_register(GIE);                                        
}
//******************************************************************************
//
//  【名称】  void delay(unsigned long sTime)
//  【功能】  软件延时函数
//  【参数】  sTime:延时时间
//  【返回】  无
//  【说明】  无
//
//******************************************************************************
void delay(unsigned long sTime)
{
    while (sTime != 0)
    {
        sTime--;
    }
}
//*****************************************************************************
//
//  【名称】  char SPI_RW(char data,char ch)
//  【功能】  读写NRF24L01寄存器一字符
//  【参数】  data:一字节数据;ch:指定模块(通道数)
//  【返回】  寄存器状态
//  【说明】  无
//
//*****************************************************************************
char SPI_RW(char data,char ch)
{
    char i,temp=0;
    switch (ch)
    {
      case 1:
        for(i=0;i<8;i++)
        {
            if((data & 0x80)==0x80)
            {
                Set_RF24L01MOSI_1;       
            }
            else
            {
                Rst_RF24L01MOSI_1;
            }
            data = (data << 1);          
            temp<<=1;
            Set_RF24L01SCK_1;
            delay(10);
            if((P2IN&0x01)==0x01)
            {
                temp++;
            }
            Rst_RF24L01SCK_1;
            delay(10);
        }
        break;
      case 2:
        for(i=0;i<8;i++)
        {
            if((data & 0x80)==0x80)
            {
                Set_RF24L01MOSI_2;       
            }
            else
            {
                Rst_RF24L01MOSI_2;
            }
            data = (data << 1);
            temp<<=1;
            Set_RF24L01SCK_2;
            delay(10);
            if((P4IN&0x01)==0x01)
            {
                temp++;
            }
            Rst_RF24L01SCK_2;
            delay(10);
        }
        break;
    }
    return(temp);
}
//*****************************************************************************
//
//  【名称】  char SPI_Read(char reg,char ch)
//  【功能】  读NRF24L01寄存器一字符
//  【参数】  reg:寄存器;ch:指定模块(通道数)
//  【返回】  寄存器状态
//  【说明】  无
//
//*****************************************************************************
char SPI_Read(char reg,char ch)
{
    char reg_val;
    switch (ch)
    {
      case 1:
        Rst_RF24L01CSN_1;         
        SPI_RW(reg,1);          
        reg_val = SPI_RW(0,1);  
        Set_RF24L01CSN_1;       
        break;
      case 2:
        Rst_RF24L01CSN_2;         
        SPI_RW(reg,2);          
        reg_val = SPI_RW(0,2);  
        Set_RF24L01CSN_2;       
        break;
    }
    return(reg_val);    
}
//*****************************************************************************
//
//  【名称】  char SPI_RW_Reg(char reg, char value,char ch)
//  【功能】  读写NRF24L01寄存器一字符
//  【参数】  reg:寄存器;value:待写入值;ch:指定模块(通道数)
//  【返回】  寄存器状态
//  【说明】  无
//
//*****************************************************************************
char SPI_RW_Reg(char reg, char value,char ch)
{
    char status1;
    switch (ch)
    {
      case 1:
        Rst_RF24L01CSN_1;                
        status1 = SPI_RW(reg,1);    
        SPI_RW(value,1);           
        Set_RF24L01CSN_1;                 
        break;
      case 2:
        Rst_RF24L01CSN_2;                 
        status1 = SPI_RW(reg,2);    
        SPI_RW(value,2);           
        Set_RF24L01CSN_2;                 
        break;
    }
    return(status1);
}
//*****************************************************************************
//
//  【名称】  char SPI_Read_Buf(char reg, char *pBuf, char chars,char ch)
//  【功能】  读NRF24L01一字符串
//  【参数】  reg:寄存器;*pBuf:字符串;chars:字符串长度;ch:指定模块(通道数)
//  【返回】  寄存器状态
//  【说明】  无
//
//*****************************************************************************
char SPI_Read_Buf(char reg, char *pBuf, char chars,char ch)
{
    char status2,uchar_ctr;
    switch (ch)
    {
      case 1:
        Rst_RF24L01CSN_1;
        status2 = SPI_RW(reg,1);
        for(uchar_ctr=0;uchar_ctr<chars;uchar_ctr++)
        {
            pBuf[uchar_ctr] = SPI_RW(0,1);
        }
        Set_RF24L01CSN_1;
        break;
      case 2:
        Rst_RF24L01CSN_2;
        status2 = SPI_RW(reg,2);
        for(uchar_ctr=0;uchar_ctr<chars;uchar_ctr++)
        {
            pBuf[uchar_ctr] = SPI_RW(0,2);
        }
        Set_RF24L01CSN_2;
        break;
    }
    return(status2);
}
//*****************************************************************************
//
//  【名称】  char SPI_Write_Buf(char reg, char *pBuf, char chars,char ch)
//  【功能】  写NRF24L01一字符串
//  【参数】  reg:寄存器;*pBuf:字符串;chars:字符串长度;ch:指定模块(通道数)
//  【返回】  寄存器状态
//  【说明】  无
//
//*****************************************************************************
char SPI_Write_Buf(char reg, char *pBuf, char chars,char ch)
{
    char status1,uchar_ctr;
    switch (ch)
    {
      case 1:
        Rst_RF24L01CSN_1;
        status1 = SPI_RW(reg,1); 
        for(uchar_ctr=0; uchar_ctr<chars; uchar_ctr++)
        {
            SPI_RW(*pBuf++,1);
        }
        Set_RF24L01CSN_1;
        break;
      case 2:
        Rst_RF24L01CSN_2;
        status1 = SPI_RW(reg,2); 
        for(uchar_ctr=0; uchar_ctr<chars; uchar_ctr++)
        {
            SPI_RW(*pBuf++,2);
        }
        Set_RF24L01CSN_2;
        break;
    }
    return(status1);
}
//*****************************************************************************
//
//  【名称】  void SetTX_Mode(char ch)
//  【功能】  发送模式设置
//  【参数】  ch:指定模块(通道数)                               
//  【返回】  无
//  【说明】  无
//
//*****************************************************************************
void SeTX_Mode(char ch)
{
    switch (ch)
    {
      case 1:
        Rst_RF24L01CE_1;
        Set_RF24L01CSN_1;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E,1);
        Set_RF24L01CE_1;
        delay(100);
        break;
      case 2:
        Rst_RF24L01CE_2;
        Set_RF24L01CSN_2;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E,2);
        Set_RF24L01CE_2;
        delay(100);
        break;      
    }
}
//*****************************************************************************
//
//  【名称】  void SetRX_Mode(char ch)
//  【功能】  接收模式设置
//  【参数】  ch:指定模块(通道数)                               
//  【返回】  无
//  【说明】  无
//
//*****************************************************************************
void SetRX_Mode(char ch)
{
    switch (ch)
    {
      case 1:
        Rst_RF24L01CE_1;
        Set_RF24L01CSN_1;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F,1);
        Set_RF24L01CE_1;
        delay(100);
        break;
      case 2:
        Rst_RF24L01CE_2;
        Set_RF24L01CSN_2;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F,2);
        Set_RF24L01CE_2;
        delay(100);
        break;      
    }
}
//*****************************************************************************
//
//  【名称】  char nRF24L01_RxPacket(char* rx_buf,char ch)
//  【功能】  字符串接收
//  【参数】  * rx_buf:接收的字符串;ch:指定模块(通道数)                               
//  【返回】  接收成功与否标志
//  【说明】  无
//
//*****************************************************************************
char nRF24L01_RxPacket(char* rx_buf,char ch)
{
    char revale=0;
    switch (ch)
    {
      case 1:
        sta=SPI_Read(STATUS,1); 
        if(sta&0x40)
        {
            Rst_RF24L01CE_1 ;
            SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH,1);
            revale =1;
        }
        else
        {
            revale=0;
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta,1);
        break;
      case 2:
        sta=SPI_Read(STATUS,2);
        if(sta&0x40)
        {
            Rst_RF24L01CE_2 ;
            SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH,2);
            revale =1;
        }
        else
        {
            revale=0;
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta,2);
        break;
    }
    return revale;
}
//*****************************************************************************
//
//  【名称】  void nRF24L01_TxPacket(char * tx_buf,char ch)
//  【功能】  字符串发送
//  【参数】  * tx_buf:待发字符串;ch:指定模块(通道数)                               
//  【返回】  无
//  【说明】  无
//
//*****************************************************************************
void nRF24L01_TxPacket(char * tx_buf,char ch)
{
  switch (ch)
  {
    case 1:
      Rst_RF24L01CE_1 ;
      SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,1);
      SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH,1);
      Set_RF24L01CE_1;
      delay(200);
      break;
    case 2:
      Rst_RF24L01CE_2 ;
      SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,2);
      SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH,2);
      Set_RF24L01CE_2;
      delay(200);
      break;
  }
}
//*****************************************************************************
//
//  【名称】  void init_RF2401()
//  【功能】  NRF24L01初始化
//  【参数】  无                               
//  【返回】  无
//  【说明】  相关寄存器赋值,适应相应的功能
//
//*****************************************************************************
void init_RF2401()
{
    Rst_RF24L01CE_1;
    Set_RF24L01CSN_1;
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH,1);
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,1);
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x01,1);
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01,1);
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a,1);
    SPI_RW_Reg(WRITE_REG + RF_CH, 0x28,1);
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07,1);
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH,1);
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E,1);
    Rst_RF24L01CSN_1;
    Set_RF24L01CE_1;
  
    Rst_RF24L01CE_2;
    Set_RF24L01CSN_2;
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH,2);
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,2);
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x01,2);
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01,2);
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a,2);
    SPI_RW_Reg(WRITE_REG + RF_CH, 0x28,2);
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07,2);
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH,2);
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E,2);
    Rst_RF24L01CSN_2;
    Set_RF24L01CE_2;
    delay(100);
}
//*****************************************************************************
//
//  【名称】  main
//  【功能】  主函数
//  【参数】  无                               
//  【返回】  无
//  【说明】  无  
//
//*****************************************************************************
main()
{   
      unsigned char i;
      char a[32]={0};
      InitSys();
      RF24L01_IO_set();
      Rst_RF24L01SCK_1;
      Rst_RF24L01SCK_2;
      init_RF2401();

      P10OUT |= BIT7;
      P10OUT &= ~BIT6;
      while(1)
      {
          nRF24L01_TxPacket(TxBuf,1);
          SPI_RW_Reg(WRITE_REG+STATUS,0XFF,1);
        
        
          delay(10000);
        
          if(nRF24L01_RxPacket(RxBuf,2))
          {
              for(i=0;i<32;i++)
              {
                  a[i]=RxBuf[i];
              }
              P10OUT |= BIT6;
              P10OUT &= ~BIT7;
              SetRX_Mode(2);
          }
          else
          {
              P10OUT |= BIT7;
              P10OUT &= ~BIT6;
            
          }
          delay(10000);
        
      }
}
//*****************************************************************************
//
//  END
//
//*****************************************************************************

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2