nRF24l01&MSP430F5438的通讯的实现

来源:本站
导读:目前正在解读《nRF24l01&MSP430F5438的通讯的实现》的相关信息,《nRF24l01&MSP430F5438的通讯的实现》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《nRF24l01&MSP430F5438的通讯的实现》的详细说明。
简介:这个通讯采用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

//

//*****************************************************************************

提醒:《nRF24l01&MSP430F5438的通讯的实现》最后刷新时间 2024-03-14 01:02:51,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《nRF24l01&MSP430F5438的通讯的实现》该内容的真实性请自行鉴别。