历史上的今天
今天是:2024年10月16日(星期三)
2018年10月16日 | stm32之nRF24L01无线模块(1):SPI2到SPI1的移植
2018-10-16 来源:eefocus
本来要接着写滴答定时器的,但是趁热打铁写下SPI2到SPI1的移植。
为什么SPI2到SPI1的移植要放在nRF24L01模块里写呢,因为无线模块最重要的数据传输就是通过SPI实现的。为什么需要移植呢,因为即使是一个厂家的板子,不同型号之间它的无线模块引脚也有可能是不同的,顺便稿下移植,加深下理解。SPI2移植到SPI1呢,自己做的时候遇到了一些问题,就从遇到的问题顺便讲下初始化。
1.引脚问题
看stm32的手册,不知道为什么,无论在GPIO还是在SPI里都没有看到这个引脚的问题(初学者有可能移植的时候可能纳闷为什么是这些引脚),只有在引脚复用AFIO那里才提了一下,如下图
这样才知道SPI1的引脚,但是SPI2的引脚手册里没有提到,只能结合板子的电路原理图顺便查一下了,以我用的两个德飞莱的板子为例,前者是德飞莱M3S,可以插ILI9320那个板子,后者是德飞莱小一些没有SD插槽那个板子。


可以看到二者的引脚是不同的,但是引脚并不是随意给出的,在不进行重映射的情况下,前者的SPI引脚是SPI2对应的引脚,后者则是SPI1对应的引脚。由于对应的引脚不同,自然在GPIO的初始化时候,要修改初始化的引脚,引脚的输入输出模式,在数据手册中已经给出,如下

2.时钟的使能
由于引脚改了,使能的GPIO时钟也需要进行一下修改,同时切记不要忘了SPI1和SPI2时钟的区别,看一下数据手册中给出的系统结构,如下图
特别需要注意的是SPI1挂在APB2上,而SPI2和SPI3挂在APB1上,因此SPI时钟初始化的时候,要注意是
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
这两句的哪一个(我还傻傻滴找了半天RCC_APB1Periph_SPI1
)
这个时钟在设置SPI速度的时候还会导致一个小问题,APB2的最大时钟是APB1的一倍,由于nRF24L01的最大频率是10MHz,因此移植的时候注意一下。
3.片选和使能的预定义
看一下上面的无线模块的电路原理图,除了SPI引脚就是片选CSN和使能CE引脚了,这两个引脚是用于开始和结束SPI通信的,移植的时候也有可能没注意到。
库函数中为了简洁明了,一般将引脚的置高置低都用预定义的形式表示,比如CE的置高置低是这么表示的
#define NRF24L01_CE_SET GPIO_SetBits(GPIOG,GPIO_Pin_6)
#define NRF24L01_CE_CLR GPIO_ResetBits(GPIOG,GPIO_Pin_6)
在移植的时候,这种预定义很容易忽略,忘了的话根本就不会开始SPI通信,自然也就没有现象了。
4.库函数的改变
在SPI2的函数中,只要是涉及写寄存器的部分,就要看下到底写的是SPI2还是SPI1的寄存器,当然,这里有一个很明显的特点,就是stm32官方的库函数一般是通用的,像下面这个SPI命令函数
SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
而厂商写的,一般都是需要注意下的,比如SPI速度设置的函数
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI2->CR1&=0XFFC7;
SPI2->CR1|=SPI_BaudRatePrescaler;
SPI_Cmd(SPI2,ENABLE);
}
这里写的寄存器就是SPI2的寄存器,移植的时候就需要改一下啦(结构体寄存器关系滴答定时器那里已经讲过啦)
5.玄学问题((*^__^*)。。。)
搞硬件,必不可少的会出现玄学问题,比如keil4好使,keil5不好使的什么的,所以需要不断地尝试,自己做这个移植的时候,有一段毫不相关引脚注释居然改变了结果,最后一句一句注释掉,发现实际是厂商的函数写的不规范,把端口的输入输出频率的初始化给漏掉了
大部分玄学问题都是都原因的,移植的时候不断调试就能找到问题所在。
史海拾趣
|
《社区大讲堂》DO-254中的高设计可靠性的逻辑综合(六)--DO-254的工程需要考虑 DO-254的工程需要在综合时考虑更多 逻辑综合工具在设计可靠性方面能提供很多额外的价值。以下是一些支持DO-254项目中非常重要的功能。 可重复性的综合结果 DO-254需要设计的每一步都要有可重复性。 主要的目的是能够获取设计环境,设计工具 ...… 查看全部问答> |
|
由于之前其他项目用过LPC2478做USB相关的设备,领导要求,我们这个项目也用到这个LPC2478,但是我们需要采用FE组网, 求高手指导下LPC2478的软硬件组网方案和具体设计思路? 感谢!… 查看全部问答> |
|
随着一年多的真实产品开发——虽然,嘿嘿,按照他们的说法,我这实在有点非主流,但在后期的调试中吃了不少苦头,于是在蛋疼的调试中,以及在阅读诸如《代码大全》这些书籍时,渐渐地萌生了一种如何做一个方便调试,方便扩展,方便移植的单片机程序 ...… 查看全部问答> |
|
续之前的 【富士通FRAM心得提交1】 https://bbs.eeworld.com.cn/thread-419758-1-1.html 前几天PCB板子终于寄过来了。为了减少浪费,一块板子上放了不少模块。 串口通信模块 硬件部分目前还是延续之前预定的方案,STM8S处理器,MB85 ...… 查看全部问答> |
|
嵌入式开发精品书籍推荐(十三)---嵌入式系统的C语言程序设计 嵌入式开发精品书籍推荐(十三)---嵌入式系统的C语言程序设计 随着电子技术的的飞速发展,对于电子工程师来说,如今的电子设计已经很少有只用硬件电路就能实现的项目了,尤其是现今到处都是智能化电子产品。凡是带有“智能化”字样的电子产品 ...… 查看全部问答> |
|
对于网络监控录像机、硬盘录像机和视频服务器,一般情况下都有视频输入接口和音频输入接口,而它们都是一一对应的,可能都是BNC 或者莲花头接口,中间有一个孔。而拾音器一般都是几根线缆拉出来,对于三芯制的,一根是音频正极,一根是音频负极,最 ...… 查看全部问答> |
|
GPMC_CONFIG_1到7的配置如下 一、Gpmc_config_1:32’h40001000:设置异步非复用单个写,四长度页读模式,数据位宽16位, 二、Gpmc_config_2:32’h00060501:设置gpmc_a有效和gpmc_ncs有效之间时间间隔为1gpmc_fclk,gpmc_ncs下降沿和gpmc_fclk上 ...… 查看全部问答> |




