文档详情

使用STM32F030F4P6的SPI协议和NRF24L01模块进行通讯实现无线数据的收发.pdf

发布:2022-10-28约1.42万字共23页下载文档
文本预览下载声明
使⽤STM32F030F4P6的SPI协议和NRF24L01模块进⾏通讯实现 ⽆线数据的收发 单⽚机这块纯属个⼈业余爱好, 有很多不⾜的地⽅还请⼤家多多指教, 代码中有些命名不规范的地⽅还请 ⼤家多多包涵. 本⽂只实现⽆线模块的简单的点亮(能收发⼀个字节数据), ⼀直想diy⼀个⽆线遥控的⼩车, 就要使⽤到⽆ 线模块, 找了好久发现NRF24L01(下⾯简称NRF)是最便宜的⼀款⽆线模块(除过WiFi和蓝⽛模块), 就买了 ⼏个, 由于stm32f103涨价, 就选择了便宜的stm32f030, ⽹上找了很多资料对于stm32f030的资料很少, 他和 stm32f103代码⼤同⼩异, 就试着在stm32f103代码的基础上修改⼀下, 就是不能通讯, 只能发送成功, 不能 接收到数据, 搁置了好久最后从新选择了⼀块 HC-12 的⽆线通讯模块, 这个模块⽐较贵⾸次购买⼀套(收 发两个模块)⽐较便宜, 空旷视野最远通讯距离1公⾥(没有实测量过), 他使⽤的是串⼝通讯, 写好代码烧录 进去后可以通讯, 最后成功diy了⽆线遥控⼩车, 利⽤HC-12感觉⼤材⼩⽤了, 最后闲来⽆事就⼜琢磨⼀下 这个NRF模块, 终于可以相互通讯了, 也不知道哪⾥出问题了, 唯⼀不同的是, 之前的是在⽹上找的资料上 修修改改, 没有使⽤中断, 只使⽤了while循环进⾏检测, 这次重头开始编写的时候使⽤了中断, 在调试了⼀ 下就可以通讯. 遇到的⼀些问题: 1.原理图上PA4 是SPI1的⽚选spi1_nss的复⽤, 配置的时候把PA4也配置成了复⽤模式, 发现不能成功, 需要 配置成输出模式解决了问题 2.NRF的IRQ脚配置中断的时候需要配置为下降沿触发 3.stm32板⼦和NRF模块进⾏连接的时候数据输出和输⼊线不能交叉连接(MCU 的MISO 和 NRF的 MISO 相连, MOSI同理) 以下是代码 , 适⽤于stm32f030 1. spi配置 #ifndef __bsp_spi_h #define __bsp_spi_h #include stm32f0xx_gpio.h #define SPIx SPI1 //SPI_1 #define SPI1_PORT GPIOA //PA 端⼝ #define PORTA_LCK RCC_AHBPeriph_GPIOA //GPIO 时钟 #define SPI_LCK RCC_APB2Periph_SPI1//spi 时钟 #define SPI1_CSN GPIO_Pin_1 //PA1 NSS #define SPI1_SCK GPIO_Pin_5 //PA5 SCK #define SPI1_MISO GPIO_Pin_6 //PA6 MISO #define SPI1_MOSI GPIO_Pin_7 //PA7 MOSI void SPI_Config(void); u8 SPI_SendByte(u8 byte); void Pin_CSN(u8 u); #endif bsp_spi.h #include bsp_spi.h #include stm32f0xx_gpio.h //初始化 void SPI_Config() { GPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef SPI_InitStruct; //端⼝初始化 RCC_AHBPeriphClockCmd(PORTA_LCK , ENABLE);//开启GPIO时钟 RCC_APB2PeriphClockCmd(SPI_LCK, ENABLE);//开启SPI_1时钟 //复⽤模式 GPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource5,GPIO_AF_0);//SCK GPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource6,GPIO_AF_0);//MISO GPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource7,GPIO_AF_0);//MOSI GPIO_InitStruct.GPIO_Pin SPI1_SCK | SPI1_MISO | SPI1_MOSI; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPI
显示全部
相似文档