您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > NRF24L01动态字节长度接受和发送
在STM32战舰开发板上测试,接受采用IRQ引脚产生外部中断。发送数据字节长度可以动态改变,接收端也可以读取到发送方实际发送字节长度。战舰开发板为接收端。然后将接受数据通过USART1发送至电脑,使用DMA传输方式,波。STM32F103ZET6与NRF24L01SPI通信速率为9MHz。24L01.c文件代码#include24l01.h#includelcd.h#includedelay.h#includespi.hconstuint8_tTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//发送地址constuint8_tRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//发送地址//初始化24L01的IO口voidNRF24L01_Init(void){GPIO_InitTypeDefGPIO_InitStructure;SPI_InitTypeDefSPI_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);//初始化指定IOGPIO_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;//PG67推挽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();//初始化SPISPI_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,失败u8NRF24L01_Check(void){u8buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8i;NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5);//读出写入的地址for(i=0;i5;i++)if(buf[i]!=0XA5)break;if(i!=5)return1;//检测24L01错误return0;//检测到24L01}//SPI写寄存器//reg:指定寄存器地址//value:写入的值u8NRF24L01_Write_Reg(u8reg,u8value){u8status;NRF24L01_CSN=0;//使能SPI传输status=SPI2_ReadWriteByte(reg);//发送寄存器号SPI2_ReadWriteByte(value);//写入寄存器的值NRF24L01_CSN=1;//禁止SPI传输return(status);//返回状态值}//读取SPI寄存器值//reg:要读的寄存器u8NRF24L01_Read_Reg(u8reg){u8reg_val;NRF24L01_CSN=0;//使能SPI传输SPI2_ReadWriteByte(reg);//发送寄存器号reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN=1;//禁止SPI传输return(reg_val);//返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8NRF24L01_Read_Buf(u8reg,u8*pBuf,u8len){u8status,u8_ctr;NRF24L01_CSN=0;//使能SPI传输status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctrlen;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//读出数据NRF24L01_CSN=1;//关闭SPI传输returnstatus;//返回读到的状态值}//在指定位置写指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8NRF24L01_Write_Buf(u8reg,u8*pBuf,u8len){u8status,u8_ctr;NRF24L01_CSN=0;//使能SPI传输status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctrlen;u8_ctr++)SPI2_ReadWriteByte(*pBuf++);//写入数据NRF24L01_CSN=1;//关闭SPI传输returnstatus;//返回读到的状态值}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况u8NRF24L01_TxPacket(u8*txbuf,u8length){u8sta;NRF24L01_CE=0;if(length=32)return0;else{NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,length);//写数据到TXBUF32个字节}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);//清除TXFIFO寄存器returnMAX_TX;}if(sta&TX_OK)//发送完成{returnTX_OK;}return0xff;//其他原因发送失败}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:0,接收完成;其他,错误代码u8NRF24L01_RxPacket(u8*rxbuf){u8sta;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);//清除RXFIFO寄存器return0;}return1;//没收到任何数据}//该函数初始化NRF24L01到RX模式//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNAHCURR//当CE变高后,即进入RX模式,并可以接收数据了voidNRF24L01_RX_Mode(void){NRF24L01_CE=0;NRF24L01_Write_Buf(WRITE_REG_NRF+RX
本文标题:NRF24L01动态字节长度接受和发送
链接地址:https://www.777doc.com/doc-2889869 .html