1、NRF24L01无线收发的ARM程序#include systemInit.h#include buzzer.h#include uartGetPut.h#include #include typedef unsigned char uchar;typedef unsigned char uint;/*-定义KEY-#define KEY_PERIPH SYSCTL_PERIPH_GPIOG#define KEY_PORT GPIO_PORTG_BASE#define KEY_PIN GPIO_PIN_5void buzzer00() unsigned int x; buzzerInit();
2、 / 蜂鸣器初始化 for(x=6666;x6333;x-) buzzerSound(x); SysCtlDelay(1 * (TheSysClock / 6000); for(x=6333;x888;x-) buzzerSound(x); SysCtlDelay(1 * (TheSysClock / 6000); for(x=888;x1333;x+) buzzerSound(x); SysCtlDelay(1 * (TheSysClock / 3000); /GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0x00); buzzerQuiet(); */
3、-临时-*/-NRF24L01 端口定义-输出型-#define CE_PERIPH SYSCTL_PERIPH_GPIOA#define CE_PORT GPIO_PORTA_BASE#define CE_PIN GPIO_PIN_3 /sbit CE =P11; /PA3#define MOSI_PERIPH SYSCTL_PERIPH_GPIOA#define MOSI_PORT GPIO_PORTA_BASE#define MOSI_PIN GPIO_PIN_1 /sbit MOSI =P14; /PA1#define SCK_PERIPH SYSCTL_PERIPH_GPIOA#de
4、fine SCK_PORT GPIO_PORTA_BASE#define SCK_PIN GPIO_PIN_2 /sbit SCK =P13; /PA2#define CSN_PERIPH SYSCTL_PERIPH_GPIOA#define CSN_PORT GPIO_PORTA_BASE#define CSN_PIN GPIO_PIN_4 /sbit CSN =P12; /PA4/-nrf905状态标志-读入型-#define MISO_PERIPH SYSCTL_PERIPH_GPIOA /sbit MISO =P15; /PA0#define MISO_PORT GPIO_PORTA_
5、BASE#define MISO_PIN GPIO_PIN_0#define IRQ_PERIPH SYSCTL_PERIPH_GPIOG#define IRQ_PORT GPIO_PORTG_BASE#define IRQ_PIN GPIO_PIN_4 /sbit IRQ =P16; /PG4/*按键*sbit KEY1=P36;sbit KEY2=P37;*数码管位选*sbit led3=P20;sbit led2=P21;sbit led1=P22;sbit led0=P23;*蜂明器*sbit BELL=P34;*数码管0-9编码*uchar seg10=0xC0,0xCF,0xA4,
6、0xB0,0x99,0x92,0x82,0xF8,0x80,0x90; /09段码*NRF24L01*/#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 20 / 20 uints TX payload /打包长度#define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduchar TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,
7、0x01; /本地地址uchar RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址/*NRF24L01寄存器指令*/SPI指令#define READ_REG 0x00 / 读寄存器指令 000AAAAA AAAAA指出读操作的寄存器地址#define WRITE_REG 0x20 / 写寄存器指令 001AAAAA AAAAA指出写操作的寄存器地址,只能在掉电或待机模式下操作#define RD_RX_PLOAD 0x61 / 读取接收数据指令 01100001 读RX有效数据,132字节。读操作全部从字节0开始,用于接收模式下#
8、define WR_TX_PLOAD 0xA0 / 写待发数据指令 10100000 写TX有效数据,132字节。写操作全部从字节0开始,用于发射模式下#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令 即清除TX FIFO寄存器,应用于发射模式下#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令 RX 接收#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留 空操作,可用来读寄存器/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验
9、模式以及收发状态响应方式#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
10、 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 / 接收频道1接收数据长度#define
11、RX_PW_P2 0x13 / 接收频道2接收数据长度#define RX_PW_P3 0x14 / 接收频道3接收数据长度#define RX_PW_P4 0x15 / 接收频道4接收数据长度#define RX_PW_P5 0x16 / 接收频道5接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(unsigned int uar);uchar S
12、PI_Read(unsigned char reg);void SetRX_Mode(void);uint SPI_RW_Reg(unsigned char reg, unsigned char value);uint SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars);uint SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars);unsigned char nRF24L01_RxPacket(un
13、signed char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*长延时*void Delay(unsigned int s) unsigned int i; for(i=0; is; i+); for(i=0; i0;n-) n+; n-; /_nop_();/*NRF24L01初始化*/void init_NRF24L01(void) SysCtlPeriEnable(CE_PERIPH); / 使能CE所在的GPIO端口 GPIOPinTypeOut(CE_PORT, CE_PIN); / 设置CE所在的管脚为输出
14、 SysCtlPeriEnable(MOSI_PERIPH); / 使能MOSI所在的GPIO端口 GPIOPinTypeOut(MOSI_PORT, MOSI_PIN); / 设置MOSI所在的管脚为输出 SysCtlPeriEnable(SCK_PERIPH); / 使能SCK所在的GPIO端口 GPIOPinTypeOut(SCK_PORT, SCK_PIN); / 设置SCK所在的管脚为输出 SysCtlPeriEnable(CSN_PERIPH); / 使能CSN所在的GPIO端口 GPIOPinTypeOut(CSN_PORT, CSN_PIN); / 设置CSN所在的管脚为输出
15、SysCtlPeriEnable(MISO_PERIPH); / 使能MISO所在的GPIO端口 GPIOPinTypeIn(MISO_PORT, MISO_PIN); / 设置MISO所在管脚为输入 SysCtlPeriEnable(IRQ_PERIPH); / 使能IRQ所在的GPIO端口 GPIOPinTypeIn(IRQ_PORT, IRQ_PIN); / 设置IRQ所在管脚为输入 inerDelay_us(200); GPIOPinWrite(CE_PORT, CE_PIN, CE_PIN); /CE=0; / chip enable 使能芯片 GPIOPinWrite(CSN_PO
16、RT, CSN_PIN, CSN_PIN);/CSN=1; / Spi disable 禁止Spi CSN为低时,Spi等待接收 GPIOPinWrite(SCK_PORT, SCK_PIN, SCK_PIN);/SCK=0; / SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频
17、道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dB/*函数:uint SPI_RW(uint u
18、char)功能:NRF24L01的SPI写时序*/uint SPI_RW(unsigned int uar) unsigned int bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit 8位输出 if(uar & 0x80) /MOSI = (uchar & 0x80); / output uchar, MSB to MOSI GPIOPinWrite(MOSI_PORT, MOSI_PIN, MOSI_PIN); /MOSI=1; else GPIOPinWrite(MOSI_PORT, MOSI_PIN, MOSI_PIN);
19、 /MOSI=0; /下面先移位将MOSI左移到uar第二位,再将MISO放在uar第一位 uar = (uar 1); / shift next bit into MSB. GPIOPinWrite(SCK_PORT, SCK_PIN, SCK_PIN); /SCK = 1; / Set SCK high. if(GPIOPinRead(MISO_PORT, MISO_PIN) /uchar |= MISO; / capture current MISO bit 捕捉当前MISO uar |= 0x01; GPIOPinWrite(SCK_PORT, SCK_PIN, SCK_PIN); /
20、SCK = 0; / .then set SCK low again return(uar); / return read uchar/*函数:uchar SPI_Read(uchar reg)功能:NRF24L01的SPI读时序*/uchar SPI_Read(unsigned char reg) unsigned char reg_val; GPIOPinWrite(CSN_PORT, CSN_PIN, CSN_PIN);/CSN = 0; / CSN low, initialize SPI communication. SPI等待接收数据 SPI_RW(reg); / Select re
21、gister to read from. 选择寄存器 reg_val = SPI_RW(0); / .then read register value 读取寄存器数值 GPIOPinWrite(CSN_PORT, CSN_PIN, CSN_PIN);/CSN = 1; / CSN high, terminate SPI communication 终止SPI return(reg_val); / return register value 返回寄存器数值/*函数:uint SPI_RW_Reg(unsigned char reg, unsigned char value)功能:NRF24L01读写寄存器函数 reg: 命令 value: what?*/uint SPI_RW_Reg(unsigned char reg, unsigned char value) unsigned int status; GPIOPinWrite(CSN_PORT, CSN_PIN, CSN_PIN); /CSN = 0; / CSN low, init SPI transaction status = SPI_RW(reg); / select reg
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1