TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信

TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信

本人在实习期间的第一项学习任务就是在STM32F051的开发板STM32F0DISCOVERY上学习基本操作,并掌握SPI通信协议,实现与常见FLASH的通信以及读写其他外设的寄存器等。

在此前不久我曾利用STM32F103开发过一些小的课程设计,如波形发生器、电子钟等等。而STM32F051是我第一次接触,尽管都是STM32体系,但具有不同的内核,103为Cotex-M3而051为Cotex-M0。因此在寄存器、时钟、引脚管理等细节处理上会有一些不同,而正是这些不同给我后续的学习与调试带来了较大的问题。

具体学习过程不细说,在此我记录总结我在学习过程遇到的几个问题:

1. STM32的开发,无论是用直接读写寄存器的手段还是利用库函数开发的方式,都必须仔细跟踪阅读中文手册中相关的章节,如用库函数开发,还得对照阅读库函数文件,学习了解其中各个函数的用途。这样能够快速的了解该套MCU与其他的MCU的差别,比如RCC_AHBPeriphClockCmd这类外围时钟使能命令函数是非常重要的,但在不同型号的STM32MCU中却有着很不同的分配;

2. STM32F051中,SPI的发送和接收都有一个FIFO BUFFER,这是它与其他型号的较大区别。因为这个FIFO的存在,使得它可以缓存下一些数据,提高传输的速率,但由此也带来一些问题需要注意。该BUFFER是32位,即4字节大小,默认的配置下,每当buffer里的数据达到16位,spi控制器即会自动将buffer里的数据读到内存中,或自动将其发出。但这是最适合于传输的数据为16位的情况,当我们要传输的数据帧大小为小于等于8位时,为了数据不紊乱,需要修改buffer的阈值为8位,利用下述语句SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);

3. STM32F051中,尽管GPIO口的复用功能与其他型号的STM32几乎一致,但在配置时也有值得注意的不同点。比如在051中,并不能像STM32F103等系列中一样,直接用一条函数配置GPIO口为复用推挽,而必须分开配置。相关语句如下:左侧为STM32F103,右侧为051

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; ------>> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 

此外,STM32F051中,GPIO口的复用功能也许在配置时指定启用,否则将不能正常使用其复用的功能,相关语句如下:该语句将PB13配置为复用类0(包含SPI)

GPIO_PinAFConfig(GPIOB,  GPIO_PinSource13 , GPIO_AF_0);

4. 在配置完毕后,我花费了较久时间来调试解决一个BUG。当时我发现PB12,即SPI的NSS位选口无法正常拉低,这样导致主从设备间不能正常通信。后来经过检查,我发现由于我PB13/14/15口与PB12口是分开配置的,先配置了PB12口,再调用相关函数配置了其余GPIO口,而在配置PB12口时,我对GPIOB的时钟尚未使能,如此导致了PB12的配置无效化,从而产生了上述的问题。当我将GPIOB使能的语句提前后,bug如期消除;

5. 对于不同的外设,其支持的SPI MODE各不相同,如W25X16/64等FLASH普遍支持MODE0和MODE3,而有些设备却只支持MODE0等。不仅如此,各外设所要求的数据格式也不同,这就需要我们在配置主机跟外设的通信时,除了阅读主机开发手册之外,还需自习查阅外设的手册,尤其是SPI部分,只有将主机的SPI配置和外设的相匹配,两者才能正常通信。上述的MODE是CPOL和CPHA的组合模式。

6. 一般通过SPI配置外设寄存器时,都是先发送命令,再发送地址,也可认为命令和地址组成了数个字节的长指令,接着外设会发送一些主机需求的数据回来。而主机为了外设能够正常进入发送这个阶段以及其自身能够正常读取这些数据,它必须先发送dummy数据,以驱动SCK和NSS信号的工作。这个dummy数据一般为0x00,或者0xFF,而不能任意取值,因为任意取值很可能会触发一些命令或隐藏命令,导致意料之外的错误发生。

7. SPI通信在KEIL的单步调试中很容易出现问题,这是因为STM32F051的SPI寄存器部分位只能访问一次,一旦由KEIL访问了,则本身函数就会访问出错。其次在调试中接入示波器等设备也会产生较大的干扰,影响通信的正常进行。我在调试时正是因为示波器的干扰使得从机返回的数据永远处于高电平状态,原因至今不明,撤去示波器后,SPI可以全速通信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值