【STM32L476 Nucleo】评测1:L476的SPI与F4的异同

  • 1716094642@qq.c
  • LV2工程师
  • |      2016-05-28 11:40:16
  • 浏览量 1644
  • 回复:7
本帖最后由 LiuYang 于 2016-5-28 14:13 编辑 不知道该如何去写一个评测才能将我对这款单片机的了解表达清楚。关于单片机的介绍,关于它的建工程方法,百度一下应该能搜到很多,我想就没太大意义去写。我更喜欢去分享一些技术性的东西,所以我就将我学习中遇到的一些问题和发现的与F4的一些小差异来和大家分享一下。今天分享一下我在使用SPI的过程中遇到的问题与解决方法。 11L476SPI特性介绍,数据长度范围是4~16比特,宽泛的数据长度设置范围。但是在平时的应用中价值并不大,一般都是8位或者16位的,但一些数字电路里可能会有较大用处。 22F4的,F4仅支持8位和16位的数据长度。 33L476的框图,最为明显的是它具有FIFO,先进先出队列。 4这是一个32位的缓存,有利于SPI的连续工作。提高传输速率。再来看一下F4的: 5F4仅有收发缓存器,也就是只有当上一数据发送完毕后再能写入下一个数据,这样就会造成发送的间断,降低数据传输速率。两个单片机就在这两个方面有差别,但是,在使用的时候发现他们的DR寄存器操作有很大的差别,L4768位及8位以下数据长度时,对DR写入数据后spj控制器会将DR认为是两个8位寄存器。先发送低8位的内容再发高8位。 66是用逻辑分析仪抓取的波形图,发送数据为0x0ff0,按理只有第8位会被发送,也就是0xf0;这里显然发送了16位的数据,而且可以看出,数据是0xf00f;正如我之前所说,先发送了低80xf0,再发送了0x0f再来看一下发生0x0000的情况: 7依然如此。那么,SPI工作在别的数据长度呢?6位模式,SPI1->DR=0x0303U; 8可见是发送了高8位和低8位数据中的低6位。12位模式,SPI1->DR=0x0303U; 9显而易见,这是发送了0x0303的低12位,和上图两个六位有明显差别。那么问题来了,我就想发送8位或更少的,咋办?这个问题之前确实也困扰了我,费了两三个小时才想明白。前面我们说到L476具有收发FIFO,就是这里搞的鬼。当你在8位模式下,你向DR寄存器(16位)写入一个值,那么就是更新了两个字节的数据,随后两字节数据都进入发送FIFO队列,逐一被发送。终于知道原因了,那么如何只更新一个字节呢?这就容易了,有两种方式:①:直接对地址做8位操作,代码如下 10波形图: 11终于是有8个位了。②:修改头文件,用共用体实现,修改如下 1213抓取波形 14发送是正确的。我本人更倾向于第二种解决方法,用起来更方便。但是会破坏头文件,会导致你的程序的兼容性降低,代码移植起来就很不方便了。好了,本次对SPI的评测解析就到这里了,欢迎大家和我一起讨论有关的问题,一起交流STM32的开发经验。我文中若有不对之处,也望大家能给指出,小弟不胜感激。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:5
兵临城下 2016-07-07
很细心。
0   回复
举报
发布
Eagleson 2016-06-24
非常专业的测试
0   回复
举报
发布
gtrjolin1986 2016-05-28
写的很好
1   回复
举报
发布
HelloWii 2016-05-28
细致。。。。。
1   回复
举报
发布
wecool 2016-05-28
赞一个,非常专业的测试
2   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子