使用STM32F030F4P6的SPI协议和NRF24L01模块进行通讯实现无线数据的收发.pdf
文本预览下载声明
使⽤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
显示全部