微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 NRF24L01+USART搞定有线和无线通信

stm32 NRF24L01+USART搞定有线和无线通信

时间:11-19 来源:互联网 点击:

第11行的GPIO初始化,主要是对通用IO口的属性设置和初始化,这里一定要对串口所需的A9和A10配置好!

1 void GPIO_Configuration(void){2   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                     //LED1控制--PB53   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;             //推挽输出4   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5   GPIO_Init(GPIOB, &GPIO_InitStructure);                     6 7   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                      //USART1 TX8   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出9   GPIO_Init(GPIOA, &GPIO_InitStructure);                     //A端口 10 11   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                  //USART1 RX12   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        //复用开漏输入13   GPIO_Init(GPIOA, &GPIO_InitStructure);                      //A端口 14 }

第12行的SPI2_NRF24L01_Init();主要是驱动NRF24L01的接口初始化,因为NRF24L01采用的是SPI通信,所以这里免不了SPI的设置和相关操作了,不过幸好都封装好了~像以前在51上做SPI就得自己模拟SPI,没有示波器调试起来甚是坑~此外这里我已经把NRF24L01的整个驱动都封装在NRF24L01.c这个文件里了,当想用的时候只要在中断向量里设置其中断接收函数,并在it.c里实现其接收函数;一般主函数里用到的是其初始化函数SPI2_NRF24L01_Init();和RX_Mode();,当在过程中想利用NRF24L01向外发数据时只要调用函数void NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes):

1 /****************************************************************************2 * 名    称:NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)3 * 功    能:将保存在接收缓存区的32字节的数据通过NRF24L01+发送出去4 * 入口参数:data_buffer   待发送数据5             Nb_bytes      待发送数据长度6 * 出口参数:无7 * 说    明:数据小于32,把有效数据外的空间用0填满8 * 调用方法:RX_Mode();9 ****************************************************************************/10 void NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)11 {  12     uchar i=0;  13     MODE_CE(0);                                 //NRF 模式控制     14 15     SPI_RW_Reg(WRITE_REG1+STATUS,0xff);         //设置状态寄存器初始化16     SPI_RW_Reg(0xe1,0);                         //清除TX FIFO寄存器17     SPI_RW_Reg(0xe2,0);                         //清除RX FIFO寄存器18     TX_Mode();                                 //设置为发送模式19     delay_ms(1);20     if(Nb_bytes<32){                         //当接收到的USB虚拟串口数据小于32,把有效数据外的空间用0填满21         for(i=Nb_bytes;i<32;i++) data_buffer[i]=0;22     }23     MODE_CE(0);24       SPI_Write_Buf(WR_TX_PLOAD, data_buffer, TX_PLOAD_WIDTH);        //发送32字节的缓存区数据到NRF24L0125     MODE_CE(1);                                                        //保持10us以上,将数据发送出去        26 }

第13行是USART初始化,包括波特率、数据位、停止位等~

1 void USART_Config(USART_TypeDef* USARTx){2   USART_InitStructure.USART_BaudRate = 9600;                        //速率9600bps3   USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //数据位8位4   USART_InitStructure.USART_StopBits = USART_StopBits_1;            //停止位1位5   USART_InitStructure.USART_Parity = USART_Parity_No;                //无校验位6   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控7   USART_InitStructure.USART_Mode = USART_Mode_Rx  USART_Mode_Tx;                    //收发模式8 9   /* Configure USART1 */10   USART_Init(USARTx, &USART_InitStructure);                            //配置串口参数函数11  12   13   /* Enable USART1 Receive and Transmit interrupts */14   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断15   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                        //使能发送缓冲空中断   16 17   /* Enable the USART1 */18   USART_Cmd(USART1, ENABLE);    19 }

同样的类似于NRF24L01一旦初始化之后,其数据接收一般采用中断方式、数据发送一般采用直接发送的方式。所以在中断向量里也要设置,也要在it.c中实现其接收中断子函数。其发送直接调用stm32f10的固件库函数(这里我稍加封装了下):其实就是发送一

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top