




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在STM32战舰开发板上测试,接受采用IRQ引脚产生外部中断。发送数据字节长度可以动态改变,接收端也可以读取到发送方实际发送字节长度。战舰开发板为接收端。然后将接受数据通过USART1发送至电脑,使用DMA传输方式,波。STM32F103ZET6与NRF24L01 SPI通信速率为9MHz。24L01.c文件代码#include 24l01.h#include lcd.h#include delay.h#include spi.hconst uint8_t TX_ADDRESSTX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发送地址const uint8_t RX_ADDRESSRX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发送地址/初始化24L01的IO口void NRF24L01_Init(void) GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG |RCC_APB2Periph_AFIO, ENABLE); /使能PB,D,G端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; /PB12上拉 防止W25X的干扰 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化指定IO GPIO_SetBits(GPIOB,GPIO_Pin_12);/上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /PD2推挽输出上拉 禁止SD卡的干扰 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_SetBits(GPIOD,GPIO_Pin_2);/初始化指定IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;/PG6 7 推挽 GPIO_Init(GPIOG, &GPIO_InitStructure);/初始化指定IORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/使能复用功能时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource8);EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); NRF24L01_CE=0; /使能24L01NRF24L01_CSN=1;/SPI片选取消 SPI2_Init(); /初始化SPI SPI_Cmd(SPI2, DISABLE); / SPI外设不使能SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; /SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;/SPI主机 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;/发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;/时钟悬空低SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;/数据捕获于第1个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;/NSS信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;/定义波特率预分频的值:波特率预分频值为16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;/数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;/CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); /根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI2, ENABLE); /使能SPI外设SPI2_SetSpeed(SPI_BaudRatePrescaler_4);/9MHz /检测24L01是否存在/返回值:0,成功;1,失败u8 NRF24L01_Check(void)u8 buf5=0XA5,0XA5,0XA5,0XA5,0XA5;u8 i;NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);/写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); /读出写入的地址 for(i=0;i5;i+)if(bufi!=0XA5)break; if(i!=5)return 1;/检测24L01错误return 0; /检测到24L01 /SPI写寄存器/reg:指定寄存器地址/value:写入的值u8 NRF24L01_Write_Reg(u8 reg,u8 value)u8 status; NRF24L01_CSN=0; /使能SPI传输 status =SPI2_ReadWriteByte(reg);/发送寄存器号 SPI2_ReadWriteByte(value); /写入寄存器的值 NRF24L01_CSN=1; /禁止SPI传输 return(status); /返回状态值/读取SPI寄存器值/reg:要读的寄存器u8 NRF24L01_Read_Reg(u8 reg)u8 reg_val; NRF24L01_CSN = 0; /使能SPI传输 SPI2_ReadWriteByte(reg); /发送寄存器号 reg_val=SPI2_ReadWriteByte(0XFF);/读取寄存器内容 NRF24L01_CSN = 1; /禁止SPI传输 return(reg_val); /返回状态值/在指定位置读出指定长度的数据/reg:寄存器(位置)/*pBuf:数据指针/len:数据长度/返回值,此次读到的状态寄存器值 u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)u8 status,u8_ctr; NRF24L01_CSN = 0; /使能SPI传输 status=SPI2_ReadWriteByte(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0;u8_ctrlen;u8_ctr+) pBufu8_ctr=SPI2_ReadWriteByte(0XFF);/读出数据 NRF24L01_CSN=1; /关闭SPI传输 return status; /返回读到的状态值/在指定位置写指定长度的数据/reg:寄存器(位置)/*pBuf:数据指针/len:数据长度/返回值,此次读到的状态寄存器值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)u8 status,u8_ctr; NRF24L01_CSN = 0; /使能SPI传输 status = SPI2_ReadWriteByte(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0; u8_ctr=32)return 0;elseNRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,length);/写数据到TX BUF32个字节 NRF24L01_CE=1;/启动发送 while(NRF24L01_IRQ!=0);/等待发送完成sta=NRF24L01_Read_Reg(STATUS); /读取状态寄存器的值 NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); /清除TX_DS或MAX_RT中断标志if(sta&MAX_TX)/达到最大重发次数NRF24L01_Write_Reg(FLUSH_TX,0xff);/清除TX FIFO寄存器 return MAX_TX; if(sta&TX_OK)/发送完成return TX_OK;return 0xff;/其他原因发送失败/启动NRF24L01发送一次数据/txbuf:待发送数据首地址/返回值:0,接收完成;其他,错误代码u8 NRF24L01_RxPacket(u8 *rxbuf)u8 sta; sta=NRF24L01_Read_Reg(STATUS); /读取状态寄存器的值 NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); /清除TX_DS或MAX_RT中断标志if(sta&RX_OK)/接收到数据NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);/读取数据NRF24L01_Write_Reg(FLUSH_RX,0xff);/清除RX FIFO寄存器 return 0; return 1;/没收到任何数据 /该函数初始化NRF24L01到RX模式/设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR/当CE变高后,即进入RX模式,并可以接收数据了 void NRF24L01_RX_Mode(void)NRF24L01_CE=0; NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);/写RX节点地址 NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,EN_P0); /使能通道0的自动应答 NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,EN_P0);/使能通道0的接收地址 NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40); /设置RF通信频率 NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);/选择通道0的有效数据宽度 NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);/设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);/配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 #if EN_DYNAMIC_DATA_LENGTH /使能动态数据长度NRF24L01_Write_Reg(WRITE_REG_NRF+FEATURE,EN_DPL);NRF24L01_Write_Reg(WRITE_REG_NRF+DYNPD,EN_P0);#endif NRF24L01_CE = 1; /CE为高,130us进入接收模式 delay_us(500); /该函数初始化NRF24L01到TX模式/设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR/PWR_UP,CRC使能/当CE变高后,即进入RX模式,并可以接收数据了 /CE为高大于10us,则启动发送. void NRF24L01_TX_Mode(void) NRF24L01_CE=0; NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);/写TX节点地址 NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); /设置TX节点地址,主要为了使能ACK NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,EN_P0); /使能通道0的自动应答 NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,EN_P0); /使能通道0的接收地址 NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);/设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次#if EN_DYNAMIC_DATA_LENGTH /动态数据长度发送NRF24L01_Write_Reg(WRITE_REG_NRF+FEATURE,EN_DPL);NRF24L01_Write_Reg(WRITE_REG_NRF+DYNPD,EN_P0);#endif NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40); /设置RF通道为40 NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f); /设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e); /配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断 NRF24L01_CE=1;/CE为高,10us后启动发送delay_us(20); 24L01.h文件#ifndef _24L01_H#define _24L01_H #include sys.h #include /*Enable dynamic length, not need send or receive packet data of a fixed length */#defineEN_DYNAMIC_DATA_LENGTH1 /使能动态数据长度/*NRF24L01 type*/#define_NRF24L01/#define_NRF24L01P/#define_NRF24L01N#if defined(_NRF24L01) & defined(_NRF24L01P) #error You can only select one of NRF24L01x,not two or more!#endif#if defined(_NRF24L01) & defined(_NRF24L01N) #error You can only select one of NRF24L01x,not two or more!#endif#if defined(_NRF24L01P) & defined(_NRF24L01N) #error You can only select one of NRF24L01x,not two or more!#endif#defineRESERVED0x00#defineEN_P50x20#defineEN_P40x10#defineEN_P30x08#defineEN_P20x04#defineEN_P10x02#defineEN_P00x01/NRF24L01寄存器操作命令#define READ_REG_NRF0x00 /读配置寄存器,低5位为寄存器地址#define WRITE_REG_NRF0x20 /写配置寄存器,低5位为寄存器地址#define RD_RX_PLOAD 0x61 /读RX有效数据,132字节#define WR_TX_PLOAD 0xA0 /写TX有效数据,132字节#define FLUSH_TX 0xE1 /清除TX FIFO寄存器.发射模式下用#define FLUSH_RX 0xE2 /清除RX FIFO寄存器.接收模式下用#define REUSE_TX_PL 0xE3 /重新使用上一包数据,CE为高,数据包被不断发送.#defineR_RX_PL_WID0x60 /读取动态数据长度接受时读取接受到有效数据的数目#define NOP 0xFF /空操作,可以用来读状态寄存器 /SPI(NRF24L01)寄存器地址#define CONFIG 0x00 /配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能; /bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能#define EN_AA 0x01 /使能自动应答功能 bit05,对应通道05#define EN_RXADDR 0x02 /接收地址允许,bit05,对应通道05#define SETUP_AW 0x03 /设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;#define SETUP_RETR 0x04 /建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us#define RF_CH 0x05 /RF通道,bit6:0,工作通道频率;#define RF_SETUP 0x06 /RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益#ifdefined(_NRF24L01P)#defineCONT_WAVE(17)#defineRF_DR_RATE_1Mbps0#defineRF_DR_RATE_2Mbps(10)#defineRF_DR_RATE_250kbps(11)#defineRF_DR_RATE_Reserved(10) | (11)#endif#define STATUS 0x07 /状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发 /bit5:数据发送完成中断;bit6:接收数据中断;#define MAX_TX 0x10 /达到最大发送次数中断#define TX_OK 0x20 /TX发送完成中断#define RX_OK 0x40 /接收到数据中断#define OBSERVE_TX 0x08 /发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器#define CD 0x09 /载波检测寄存器,bit0,载波检测;#define RX_ADDR_P0 0x0A /数据通道0接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P1 0x0B /数据通道1接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P2 0x0C /数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P139:8相等;#define RX_ADDR_P3 0x0D /数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P139:8相等;#define RX_ADDR_P4 0x0E /数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P139:8相等;#define RX_ADDR_P5 0x0F /数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P139:8相等;#define TX_ADDR 0x10 /发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等#define RX_PW_P0 0x11 /接收数据通道0有效数据宽度(132字节),设置为0则非法#define RX_PW_P1 0x12 /接收数据通道1有效数据宽度(132字节),设置为0则非法#define RX_PW_P2 0x13 /接收数据通道2有效数据宽度(132字节),设置为0则非法#define RX_PW_P3 0x14 /接收数据通道3有效数据宽度(132字节),设置为0则非法#define RX_PW_P4 0x15 /接收数据通道4有效数据宽度(132字节),设置为0则非法#define RX_PW_P5 0x16 /接收数据通道5有效数据宽度(132字节),设置为0则非法#define NRF_FIFO_STATUS 0x17 /FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留 /bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;#defineDYNPD0x1C /使能动态载荷长度寄存器#defineFEATURE0x1D /特性寄存器#defineEN_DPL0x04 #defineEN_ACK_PAY0x02#defineEN_DYN_ACK0x01/24L01操作线#define NRF24L01_CE PGout(6) /24L01片选信号#define NRF24L01_CSN PGout(7) /SPI片选信号 #define NRF24L01_IRQ PGin(8) /IRQ主机数据输入/24L01发送接收数据宽度定义#define TX_ADR_WIDTH 5 /5字节的地址宽度#define RX_ADR_WIDTH 5 /5字节的地址宽度#define TX_PLOAD_WIDTH 16 /32字节的用户数据宽度#define RX_PLOAD_WIDTH 16 /32字节的用户数据宽度typedefstructu8 Recv_Buf1RX_PLOAD_WIDTH;/接受缓冲区1u8 Recv_Buf2RX_PLOAD_WIDTH;/接受缓冲区2u8 Recv_ValidData_Length;/接受到合法数据长度u8 *pRecv_Buf_Point;/指向接受缓冲区的首地址u8 Recv_Data_Flag;/接受到数据标志位NRF24L01_RECV_DATA_TYPE;extern NRF24L01_RECV_DATA_TYPEnrf24l01_Recv_Data_Param;void NRF24L01_Init(void);/初始化void NRF24L01_RX_Mode(void);/配置为接收模式void NRF24L01_TX_Mode(void);/配置为发送模式u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);/写数据区u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);/读数据区 u8 NRF24L01_Read_Reg(u8 reg);/读寄存器u8 NRF24L01_Write_Reg(u8 reg, u8 value);/写寄存器u8 NRF24L01_Check(void);/检查24L01是否存在u8 NRF24L01_RxPacket(u8 *rxbuf);/接收一个包的数据u8 NRF24L01_TxPacket(u8 *txbuf,u8 length);#endifMain.c文件#include led.h#include delay.h#include sys.h#include 24l01.h #include usart.h#include NRF24L01_RECV_DATA_TYPEnrf24l01_Recv_Data_Param;u8 U8_USART3_TX_BUF100; void NRF24L01_IRQHandler(void);void Error_Handler(void); int main(void) delay_init(); NVIC_Configuration(); LED_Init(); USART_Config();delay_ms(1500);/战舰版USB-232接口通电,程序会短暂复位,避免影响后面接收delay_ms(1500); NRF24L01_Init(); /* Check the existance of NRF24L01 or the SPI communication between MCU and NRF24L01 is working normally or not */ while(NRF24L01_Check()Error_Handler();/* Set the pRecv_Buf_Point point to the buf1 */nrf24l01_Recv_Data_Param.pRecv_Buf_Point = nrf24l01_Recv_Data_Param.Recv_Buf1; /* Set PRX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年济宁市兖州区事业单位公开招聘工作人员(教育类)(9人)模拟试卷附答案详解
- 2025安徽蚌埠市龙子湖区产业发展有限公司招聘22人考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年合肥工业大学土木与水利工程学院人事派遣岗位招聘1人考前自测高频考点模拟试题及答案详解(网校专用)
- 2025年洛阳博物馆人才引进高层次人才2名考前自测高频考点模拟试题及答案详解(全优)
- 2025江苏常州经济开发区招聘村人员12人模拟试卷及参考答案详解
- 2025年温州永嘉县金溪镇中心卫生院招聘季节工4人模拟试卷及答案详解(夺冠)
- 2025广东佛山市禅城区国有资产监督管理局下属企业招聘工作人员2人考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025安徽宣城市广德市国有资产投资经营有限公司下属公司招聘11人考前自测高频考点模拟试题及答案详解(全优)
- 2025安徽芜湖鸠江区招聘区属国有企业领导人员拟聘用人员(二)考前自测高频考点模拟试题及完整答案详解一套
- 2025年福建省南平市建阳区新华书店招聘3人模拟试卷及1套参考答案详解
- 2025年学校少先队知识应知应会题库(含答案)
- (2025)企业首席质量官培训考核试题(附含答案)
- DB31∕T 1545-2025 卫生健康数据分类分级要求
- 起重机指挥Q1练习测试题附答案
- 《网络与新媒体概论》教学课件合集
- 2023类器官技术与行业研究报告-复刻结构重现功能 构建组织器官替身
- 国有资产交易法律实务与疑难问题
- 中华人民共和国基本医疗卫生与健康促进法课件
- 初中毕业证在哪里查询
- 九宫格智力数独200题(题答案)版
- GB/T 5796.4-2022梯形螺纹第4部分:公差
评论
0/150
提交评论