我自己上个程序,万一程序的原因呢?
spi24l01.h
#include
#define NRF24L01DIR P1DIR
#define NRF24L01REN P1REN
#define NRF24L01IE P1IE
#define NRF24L01IES P1IES
#define NRF24L01IFG P1IFG
#define MCU2NRF24L01 P1OUT
#define NRF24L012MCU P1IN
#define CE BIT5
#define CSN BIT3
#define IRQ BIT0
#define OUTDIR NRF24L01DIR |= CE + CSN
#define IRQ_H MCU2NRF24L01 |= IRQ
#define IRQ_REN NRF24L01REN |= IRQ
#define IRQ_IE NRF24L01IE |= IRQ
#define IRQ_IES NRF24L01IES |= IRQ
#define IRQ_IFG NRF24L01IFG &= ~IRQ
#define CE_H MCU2NRF24L01 |= CE
#define CE_L MCU2NRF24L01 &= ~CE
#define CSN_H MCU2NRF24L01 |= CSN
#define CSN_L MCU2NRF24L01 &= ~CSN
/********** NRF24L01寄存器操作命令 ***********/
#define R_REGISTER 0x00 //读配置寄存器,低5位为寄存器地址
#define W_REGISTER 0x20 //写配置寄存器,低5位为寄存器地址
#define R_RX_PAYLOAD 0x61 //读RX有效数据,1~32字节
#define W_TX_PAYLOAD 0xA0 //写TX有效数据,1~32字节
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP 0xFF //空操作,可以用来读状态寄存器
/********** NRF24L01寄存器地址 *************/
#define CONFIG 0x00 //配置寄存器地址
#define EN_AA 0x01 //使能自动应答功能
#define EN_RXADDR 0x02 //接收地址允许
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道)
#define SETUP_RETR 0x04 //建立自动重发
#define RF_CH 0x05 //RF通道
#define RF_SETUP 0x06 //RF寄存器
#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有效数据宽度(1~32字节)
#define RX_PW_P1 0x12 // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2 0x13 // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3 0x14 // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4 0x15 // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5 0x16 // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS 0x17 // FIFO状态寄存器
/****** STATUS寄存器bit位定义 *******/
#define MAX_RT 0x10 //达到最大发送次数中断
#define TX_DS 0x20 //数据发送完成中断
#define RX_DR 0x40 //接收到数据中断
void init_hwspi(void);
void init_nrf24l01_io(void);
unsigned char SPI_RW(unsigned char Byte);
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value);
unsigned char SPI_Read(unsigned char reg);
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);
复制代码
spi24l01.c
#include
#include "spi24l01.h"
void init_hwspi(void)
{
//DataIn + DataOut + SerialClockOut
//UCA0SOMI+UCA0SIMO+UCA0CLK
P1SEL = BIT1 + BIT2 + BIT4;
P1SEL2 = BIT1 + BIT2 + BIT4;
//USCI复位状态。
UCA0CTL1 |= UCSWRST;
//USCI时钟源选择SMCLK
UCA0CTL1 |= UCSSEL_2;
//在第一个 UCLK 边沿上捕获的数据和在下列边沿上改变的数据,未激活的状态是低电平
//MSB优先+主控模式+3线SPI+同步模式
UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC;
//设定波特率
UCA0BR0 = 2;
UCA0BR1 = 0;
//USCI复位操作释放
UCA0CTL1 &= ~UCSWRST;
//使能接收和发送中断
// IE2 |= UCA0RXIE + UCA0TXIE;
}
void init_nrf24l01_io(void)
{
OUTDIR;
// IRQ_H;
// IRQ_REN;
// IRQ_IE;
// IRQ_IES;
// IRQ_IFG;
P1OUT |= BIT0;
P1REN |= BIT0;
P1IE |= BIT0;
P1IES |= BIT0;
P1IFG =0;
}
//硬件SPI数据交换函数
//SPI_RW(待交换的数据)
unsigned char SPI_RW(unsigned char byte)
{
UCA0TXBUF = byte;
while((UCA0STAT&UCBUSY)>0);
return UCA0RXBUF;
}
//寄存器写值函数
//SPI_RW_Reg(访问地址,要设定的值)
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
//设定状态值
unsigned char status;
// 拉低CSN,初始化SPI传输
CSN_L;
// 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值
status = SPI_RW(reg);
// 写入要设定的值
SPI_RW(value);
// 拉高CSN,结束SPI传输
CSN_H;
// 返回状态值
return (status);
}
//读取寄存器值的函数
//SPI_Read(要读取的寄存器地址)
unsigned char SPI_Read(unsigned char reg)
{
//设定读取到值
unsigned char reg_val;
// 拉低CSN,初始化SPI传输
CSN_L;
// 写入待访问的寄存器地址(读寄存器命令(0x00可省略)+寄存器地址),同时读取状态值
SPI_RW(reg);
//读取寄存器的值
reg_val = SPI_RW(0);
// 拉高CSN,结束SPI传输
CSN_H;
//返回读取到的寄存器的值
return (reg_val);
}
//读取多字节的数据(主要用来在接收时读取 FIFO 缓冲区中的值)
//SPI_Read_Buf(待读寄存器地址,待读数据的存放地址(即存放读取数据的数组),数据的字节数)
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
//设定状态值,当前字节数
unsigned char status, byte_ctr;
// 拉低CSN,初始化SPI传输
CSN_L;
// 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值
status = SPI_RW(reg);
//按照数据字节数读取每字节数据
for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
{
//将读取到每字节数据存入对应的数据地址
pBuf[byte_ctr] = SPI_RW(0);
}
// 拉高CSN,结束SPI传输
CSN_H;
// 返回状态值
return (status);
}
//写入多字节的数据(主要用来把数组里的数放到发射 FIFO 缓冲区中)
//SPI_Write_Buf(待写寄存器地址,待写数据的存放地址(即存放待写数据的数组),数据的字节数)
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
//设定状态值,当前字节数
unsigned char status, byte_ctr;
// 拉低CSN,初始化SPI传输
CSN_L;
// 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值
status = SPI_RW(reg);
//按照数据字节数写入每字节数据
for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
{
//写入当前地址的一字节数据,并移动到下一字节的地址
SPI_RW(*pBuf++);
}
// 拉高CSN,结束SPI传输
CSN_H;
// 返回状态值
return (status);
}
复制代码
发送端
#include
#include "spi24l01.h"
unsigned char sta;
unsigned char fifo_s;
unsigned char flag,i,flag_rx=0;
unsigned char addr[5]={0,0,0,0,0};
unsigned char TX[3]={1,2,3};
unsigned char RX[3]={0,0,0};
//有效数据宽度
#define PLOAD_WIDTH 3
//地址宽度
#define ADR_WIDTH 5
//发送地址&自动应答接收地址
unsigned char ADDR[ADR_WIDTH]={1,2,3,4,5};
void init_clock(void)
{
// 检查校准信息是否被擦除
while(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0XFF);
// 设置SELX的范围
DCOCTL=CALDCO_1MHZ;
// 设置SELX的范围
BCSCTL1=CALBC1_1MHZ;
//设置MCLK和SMCLK均为DCO_1MHz,8分频
BCSCTL2=DIVM_3+DIVS_3;
}
void delay_ms(unsigned int x)
{
unsigned int i,j;
for (i=0;i