|
我自己上个程序,万一程序的原因呢?
spi24l01.h
- #include <msp430.h>
- #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 <msp430.h>
- #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<x;i++)
- for(j=0;j<100;j++);
- }
- void TX_init(void)
- {
- init_hwspi();
- init_nrf24l01_io();
- //模式选择,设定为待机模式
- CE_L;
- //停止寄存器读写
- CSN_H;
- //清除状态寄存器的值
- SPI_RW_Reg(STATUS,0xff);
- //设定发送节点的地址TX_ADDR, 地址数据, 地址宽度
- SPI_Write_Buf(W_REGISTER + TX_ADDR, ADDR, ADR_WIDTH);
- //设定应答信号待接收节点的地址RX_ADDR_P0, 地址数据, 地址宽度
- SPI_Write_Buf(W_REGISTER + RX_ADDR_P0, ADDR, ADR_WIDTH);
- //设定自动应答功能EN_AA,数据通道0自动应答允许
- SPI_RW_Reg(W_REGISTER + EN_AA, 0x01);
- //设定接收地址允许,接收数据通道0,允许接收数据通道0允许
- SPI_RW_Reg(W_REGISTER + EN_RXADDR, 0x01);
- //设定自动重发,等待500+86us,自动重发10次
- SPI_RW_Reg(W_REGISTER + SETUP_RETR, 0x1a);
- //设定通信通道频率RF_CH,选择信道为40
- SPI_RW_Reg(W_REGISTER + RF_CH, 22);
- //设定射频寄存器,发射功率0dBm 数据传输率2Mbps
- SPI_RW_Reg(W_REGISTER + RF_SETUP, 0x07);
- }
- //发送数据包
- void TX_Packet(unsigned char * tx_buf)
- {
- //模式选择,设定为待机模式
- CE_L;
- //清除状态寄存器的值
- SPI_RW_Reg(W_REGISTER + STATUS,0xff);
- //写TX有效数据,数据地址,数据量(选择TX_PLOAD_WIDTH(根据设定值))
- SPI_Write_Buf(W_TX_PAYLOAD, tx_buf, PLOAD_WIDTH);
- //设定配置寄存器,发射模式 上电 16位CRC校验 CRC使能
- SPI_RW_Reg(W_REGISTER + CONFIG, 0x0e);
- //启动发射
- CE_H;
- delay_ms(1);
- }
- /*
- * main.c
- */
- void main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- init_clock();
- TX_init();
- sta=SPI_Read(STATUS);
- SPI_Read_Buf(RX_ADDR_P0,addr,5);
- TX_Packet(TX);
- sta=SPI_Read(STATUS);
- sta=SPI_Read(STATUS);
- _EINT();
- while(1)
- {
- // sta=SPI_Read(STATUS);
- if(TX[2]>99)
- TX[2]=0;
- }
- }
- //P1口中断服务函数
- #pragma vector=PORT1_VECTOR
- __interrupt void Port_1(void)
- {
- if(P1IFG&BIT0)
- {
- P1IFG &= ~BIT0;
- sta=SPI_Read(STATUS);
- SPI_RW_Reg(STATUS,0xff);
- if(sta&MAX_RT)
- {
- TX_Packet(TX);
- }
- else if(sta&TX_DS)
- {
- TX[2]++;
- TX_Packet(TX);
- }
- }
- }
复制代码
接收端
- #include <msp430.h>
- #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<x;i++)
- for(j=0;j<100;j++);
- }
- void RX_init(void)
- {
- init_hwspi();
- init_nrf24l01_io();
- delay_ms(1);
- //模式选择,设定为待机模式
- CE_L;
- //停止寄存器读写
- CSN_H;
- //设定通信通道频率RF_CH,选择信道为40
- SPI_RW_Reg(W_REGISTER + RF_CH,22);
- //设定接收数据通道0有效数据量,选择PLOAD_WIDTH
- SPI_RW_Reg(W_REGISTER + RX_PW_P0, PLOAD_WIDTH);
- //设定射频寄存器,发射功率0dBm 数据传输率2Mbps
- SPI_RW_Reg(W_REGISTER + RF_SETUP, 0x07);
- // //设定发送节点的地址TX_ADDR, 地址数据, 地址宽度
- // SPI_Write_Buf(W_REGISTER + TX_ADDR, ADDR, ADR_WIDTH);
- //设定接收节点的地址RX_ADDR_P0, 地址数据, 地址宽度
- SPI_Write_Buf(W_REGISTER +RX_ADDR_P0, ADDR, ADR_WIDTH);
- //设定自动应答功能EN_AA,写0x01数据通道0自动应答允许
- SPI_RW_Reg(W_REGISTER + EN_AA, 0x01);
- //设定接收地址允许,接收数据通道0允许
- SPI_RW_Reg(W_REGISTER + EN_RXADDR, 0x01);
- }
- void Set_RX()
- {
- CE_L;
- SPI_RW_Reg(W_REGISTER + CONFIG, 0x0f);
- CE_H;
- delay_ms(1);
- }
- unsigned char RX_PACKET(unsigned char * rx_buf)
- {
- sta= SPI_Read(STATUS);
- if(sta&RX_DR)
- {
- CE_L;
- SPI_Read_Buf(R_RX_PAYLOAD,rx_buf,PLOAD_WIDTH);
- flag_rx=1;
- SPI_RW_Reg(W_REGISTER+STATUS,0xff);
- }
- return flag_rx;
- }
- /*
- * main.c
- */
- void main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- init_clock();
- RX_init();
- SPI_Read_Buf(RX_ADDR_P0,addr,5);
- Set_RX();
- _EINT();
- while(1)
- {
- i = SPI_Read(CD);
- if(i<1)
- {
- sta= SPI_Read(STATUS);
- }
- else if(i>0)
- {
- sta= SPI_Read(STATUS);
- }
- sta= SPI_Read(STATUS);
- if(sta&RX_DR)
- {
- // RX_PACKET(RX);
- //清除状态寄存器的值
- SPI_RW_Reg(W_REGISTER + STATUS,0xff);
- fifo_s =SPI_Read(FIFO_STATUS);
- }
- }
- }
- ////P1口中断服务函数
- //#pragma vector=PORT1_VECTOR
- //__interrupt void Port_1(void)
- //{
- //// if(P1IFG&BIT0)
- //// {
- // sta= SPI_Read(STATUS);
- // if(sta&RX_DR)
- // {
- // RX_PACKET(RX);
- // }
- //// }
- //}
- //P1口中断服务函数
- #pragma vector=PORT1_VECTOR
- __interrupt void Port_1(void)
- {
- if(P1IFG&BIT0)
- {
- P1IFG &= ~BIT0;
- sta=SPI_Read(STATUS);
- // SPI_RW_Reg(STATUS,0xff);
- }
- }
复制代码
求助大神了 |
|