stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

发布者:游走人间最新更新时间:2018-10-10 来源: eefocus关键字:stm32  nRF24L01  无线模块  移植 手机看文章 扫描二维码
随时随地手机看文章

    本来要接着写滴答定时器的,但是趁热打铁写下SPI2到SPI1的移植。

    为什么SPI2到SPI1的移植要放在nRF24L01模块里写呢,因为无线模块最重要的数据传输就是通过SPI实现的。为什么需要移植呢,因为即使是一个厂家的板子,不同型号之间它的无线模块引脚也有可能是不同的,顺便稿下移植,加深下理解。SPI2移植到SPI1呢,自己做的时候遇到了一些问题,就从遇到的问题顺便讲下初始化。

1.引脚问题

    看stm32的手册,不知道为什么,无论在GPIO还是在SPI里都没有看到这个引脚的问题(初学者有可能移植的时候可能纳闷为什么是这些引脚),只有在引脚复用AFIO那里才提了一下,如下图

[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

    这样才知道SPI1的引脚,但是SPI2的引脚手册里没有提到,只能结合板子的电路原理图顺便查一下了,以我用的两个德飞莱的板子为例,前者是德飞莱M3S,可以插ILI9320那个板子,后者是德飞莱小一些没有SD插槽那个板子。

[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植


[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

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

[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

2.时钟的使能

    由于引脚改了,使能的GPIO时钟也需要进行一下修改,同时切记不要忘了SPI1和SPI2时钟的区别,看一下数据手册中给出的系统结构,如下图

[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植
    特别需要注意的是SPI1挂在APB2上,而SPI2和SPI3挂在APB1上,因此SPI时钟初始化的时候,要注意是

RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );

RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1,  ENABLE );

这两句的哪一个(我还傻傻滴找了半天RCC_APB1Periph_SPI1[转载]stm32之nRF24L01无线模块(1):SPI2到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不好使的什么的,所以需要不断地尝试,自己做这个移植的时候,有一段毫不相关引脚注释居然改变了结果,最后一句一句注释掉,发现实际是厂商的函数写的不规范,把端口的输入输出频率的初始化给漏掉了[转载]stm32之nRF24L01无线模块(1):SPI2到SPI1的移植大部分玄学问题都是都原因的,移植的时候不断调试就能找到问题所在。


关键字:stm32  nRF24L01  无线模块  移植 引用地址:stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

上一篇:STM32学习笔记---基于UCOSII的EXTI外部按键中断实验
下一篇:STM32F1x系列内存结构

推荐阅读最新更新时间:2024-03-16 16:15

STM32独立看门狗和窗口看门狗应用的区别
1.关于看门狗的解释不再说明,窗口看门狗简而言之即只能看某个窗口期即某段时间内才能够喂狗。32的独立看门狗是没有中断的,而窗口看门狗可根据需要配置中断 2.关于独立看门狗和窗口看门狗的应用,手册p316 即17.1节讲的非常清楚。首先独立看门狗和窗口看门狗都可用来监视软件程序是否正常运行,而具体而言,因为独立看门狗独立于系统时钟单独运行,因此其可用来监视是否发生了硬件错误,比如说系统时钟故障,看门狗仍然能够起到重启的作用,但是独立看门狗的计时精度比较差,更多的应用在独立系统运行之外的对计时要求低的地方。而窗口看门狗是由系统时钟提供的,因此其计时也会很准确,当然其也就只能用来检测软件故障,比如硬件故障系统时钟坏了,自身也就不动了,也
[单片机]
STM32学习日志——I2C实验
今天学习的是I2C通信实验,I2C是一种两线式串行总线,有数据线SDA和时钟线SCL构成,可发送和接收数据,属于半双工通信。由于要有相同的时钟源,一般用于板内通信。 I2C有几个比较重要的状态:1)空闲状态,即两条线都拉高。2)起始信号:当SCL为高时SDA从高到低的跳变,停止信号:当SCL为高时,SDA从低到高的跳变。3)应答信号:每当发送器发送一个字节的数据时,在第九个脉冲,接收器会反馈一个应答信号ACK,低电平。如果接收器是主控器,则会发送一个非应答信号NACK,高电平,以通知发送方结束数据发送。4)数据有效性:数据必须在SCL的上升沿之前就准备好,并在SCL的下降沿结束前保持稳定。 iic头文件 SDA线需要发送数据
[单片机]
STM32学习笔记(1):GPIO口的使用
摸索了很久之后终于把ARM开发板上的LED灯点亮了,虽然是很简单的一个IO口操作,但是由于以前从来都没有什么经验,所以浪费了很多时间,也查找了很多资料。现在可以操作IO口了,证明迈出了学习ARM的第一步。 实验平台清单如下: 开发板: 奋斗STRIVE V3 核心芯片: STM32F103VET6 开发环境: RealView MDK-ARM Version:3.50 PC操作系统: Windows 7 家庭普通版 仿真器: SEGGER J-Link 其中,STM32F103VET6芯片是基于ARM Cortex-M3内核的,具体技术参数请参考ST公司给出的芯片资料(http
[单片机]
基于ARM的嵌入式linux 内核的裁剪与移植
0 引言 微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Neculeus和Windows CE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的配置。Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的操作系统。嵌入式linux是大势所趋
[单片机]
STM32 图像处理函式库介绍
STM32 图像处理函式库介绍 STM32 图像处理函式库STM32IPL是由 C 语言所编写的开放原始码软件函式库,提供了图像处理和计算机视觉功能,能加快在意法半导体(ST)的STM32 微控制器上开发视觉分析的应用。本产品在最新版 (v3.1.0)FP-AI-VISION1 功能套件中以STM32Cube 中间件的形式推出。 一般来说,视觉深度学习模型的输入不同于相机拍摄的图像,深度学习输入因为具有不同维度及图像格式,会需要预先处理原图,例如缩放、影像格式转换和标准化等。而STM32IPL可提供实用且现成的软件套件,以简化及加速影像预处理功能的开发。 主要特色 STM32IPL的主要特色如下: -
[单片机]
<font color='red'>STM32</font> 图像处理函式库介绍
STM32内存地址说明
STM32内存分配 在MDK编译过程中,内存的划分如下: Code是存储程序代码的。 RO-data是存储const常量和指令。 RW-data是存储初始化值不为0的全局变量。 ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。 Flash=Code + RO Data + RW Data; RAM=RW-data+ZI-data; 此内存划分暂未包括堆栈,堆栈会在程序运行时,占用RAM。 堆栈的内存占用就是MDK里,RAM分配给RW-data+ZI-data之后的地址开始分配的。
[单片机]
<font color='red'>STM32</font>内存地址说明
NRF24L01使用外部中断读取数据的问题
NRF24L01读取数据不能使用中断的方式,原因如下: 首先NRF24L01中断触发时,IRQ引脚会一直保持低电平直到状态寄存器中的中断标志被重新清零。 stm32的外部中断触发方式只有上升沿或者下降沿触发,若配置成外部中断模式,当RX_DR中断触发时IRQ引脚会产生一个下降沿,stm32进入中断函数执行数据读取函数,读取完之后清除状态寄存器标志,IRQ引脚重新变为高电平。但,若在在清除中断标志之后刚好又来了一帧数据,而此时还没有出中断函数,IRQ引脚就会被置为低电平,然后退出中断函数,但IRQ引脚再也产生不了下降沿信号(因为中断标志位不会再被清除),也即再也进不了中断了。
[单片机]
<font color='red'>NRF24L01</font>使用外部中断读取数据的问题
一文全面掌握stm32的GPIO知识
1 初学者重要提示 本文主要是以stm32H7系列为主。 对于不使用的引脚,推荐设置为模拟模式,悬空即可。 GPIO的速度等级高的时候,最好使能IO补偿单元。 2 GPIO功能简介 STM32H7的GPIO特性如下: 输出状态:开漏/推挽 + 上拉/下拉电阻。 通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。 GPIO速度等级设置。 输入状态:浮空,上拉/下拉,模拟。 通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。 通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。 通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。
[单片机]
一文全面掌握<font color='red'>stm32</font>的GPIO知识
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved