烽火社区

标题: 【STM32L476 Nucleo】评测1:L476的SPI与F4的异同 [打印本页]

作者: lhg100    时间: 2016-5-28 11:40 AM
标题: 【STM32L476 Nucleo】评测1:L476的SPI与F4的异同
本帖最后由 LiuYang 于 2016-5-28 14:13 编辑

不知道该如何去写一个评测才能将我对这款单片机的了解表达清楚。关于单片机的介绍,关于它的建工程方法,百度一下应该能搜到很多,我想就没太大意义去写。我更喜欢去分享一些技术性的东西,所以我就将我学习中遇到的一些问题和发现的与F4的一些小差异来和大家分享一下。
今天分享一下我在使用SPI的过程中遇到的问题与解决方法。
[attach]28681[/attach]
1
1L476SPI特性介绍,数据长度范围是4~16比特,宽泛的数据长度设置范围。但是在平时的应用中价值并不大,一般都是8位或者16位的,但一些数字电路里可能会有较大用处。


[attach]28682[/attach]
2
2F4的,F4仅支持8位和16位的数据长度。


[attach]28683[/attach]
3
3L476的框图,最为明显的是它具有FIFO,先进先出队列。


[attach]28684[/attach]
4
这是一个32位的缓存,有利于SPI的连续工作。提高传输速率。
再来看一下F4的:

[attach]28685[/attach]
5
F4仅有收发缓存器,也就是只有当上一数据发送完毕后再能写入下一个数据,这样就会造成发送的间断,降低数据传输速率。
两个单片机就在这两个方面有差别,但是,在使用的时候发现他们的DR寄存器操作有很大的差别,L4768位及8位以下数据长度时,对DR写入数据后spj控制器会将DR认为是两个8位寄存器。先发送低8位的内容再发高8位。

[attach]28686[/attach]
6
6是用逻辑分析仪抓取的波形图,发送数据为0x0ff0,按理只有第8位会被发送,也就是0xf0;这里显然发送了16位的数据,而且可以看出,数据是0xf00f;正如我之前所说,先发送了低80xf0,再发送了0x0f
再来看一下发生0x0000的情况:


[attach]28687[/attach]
7
依然如此。
那么,SPI工作在别的数据长度呢?
6位模式,SPI1->DR=0x0303U;



[attach]28688[/attach]
8
可见是发送了高8位和低8位数据中的低6位。
12位模式,SPI1->DR=0x0303U;

[attach]28689[/attach]
9
显而易见,这是发送了0x0303的低12位,和上图两个六位有明显差别。
那么问题来了,我就想发送8位或更少的,咋办?
这个问题之前确实也困扰了我,费了两三个小时才想明白。
前面我们说到L476具有收发FIFO,就是这里搞的鬼。当你在8位模式下,你向DR寄存器(16位)写入一个值,那么就是更新了两个字节的数据,随后两字节数据都进入发送FIFO队列,逐一被发送。终于知道原因了,那么如何只更新一个字节呢?这就容易了,有两种方式:
①:直接对地址做8位操作,代码如下


[attach]28690[/attach]
10
波形图:


[attach]28691[/attach]
11
终于是有8个位了。
②:修改头文件,用共用体实现,修改如下


[attach]28692[/attach]
12
[attach]28693[/attach]
13
抓取波形


[attach]28694[/attach]
14
发送是正确的。
我本人更倾向于第二种解决方法,用起来更方便。但是会破坏头文件,会导致你的程序的兼容性降低,代码移植起来就很不方便了。
好了,本次对SPI的评测解析就到这里了,欢迎大家和我一起讨论有关的问题,一起交流STM32的开发经验。我文中若有不对之处,也望大家能给指出,小弟不胜感激。
















作者: oneside    时间: 2016-5-28 11:42 AM
赞一个,非常专业的测试
作者: 想飞的咕咕    时间: 2016-5-28 02:20 PM
细致。。。。。
作者: autumn_stone    时间: 2016-5-28 02:29 PM
写的很好
作者: mcdevices3    时间: 2016-6-24 08:46 AM
非常专业的测试
作者: Husterbin    时间: 2016-7-7 08:46 PM
很细心。
作者: javid    时间: 2016-7-15 01:56 AM
兵临城下 发表于 2016-7-7 20:46
很细心。

相信
作者: guochen3795    时间: 2016-7-15 01:56 AM
兵临城下 发表于 2016-7-7 20:46
很细心。

谢谢,,打错字了




欢迎光临 烽火社区 (http://bbs.cnecport.com/) Powered by Discuz! X3.2