代码如下:
//*****************************************************************************
//
// 【名称】: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
//
//*****************************************************************************