电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区
论坛
开发板专区
【STM32L476 Nucleo】评测1:L476的SPI与F4的异同
【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
的过程中遇到的问题与解决方法。
图
1
图
1
是
L476
的
SPI
特性介绍,数据长度范围是
4~16
比特,宽泛的数据长度设置范围。但是在平时的应用中价值并不大,一般都是
8
位或者
16
位的,但一些数字电路里可能会有较大用处。
图
2
图
2
是
F4
的,
F4
仅支持
8
位和
16
位的数据长度。
图
3
图
3
为
L476
的框图,最为明显的是它具有
FIFO
,先进先出队列。
图
4
这是一个
32
位的缓存,有利于
SPI
的连续工作。提高传输速率。
再来看一下
F4
的:
图
5
F4
仅有收发缓存器,也就是只有当上一数据发送完毕后再能写入下一个数据,这样就会造成发送的间断,降低数据传输速率。
两个单片机就在这两个方面有差别,但是,在使用的时候发现他们的
DR
寄存器操作有很大的差别,
L476
在
8
位及
8
位以下数据长度时,对
DR
写入数据后
spj
控制器会将
DR
认为是两个
8
位寄存器。先发送低
8
位的内容再发高
8
位。
图
6
图
6
是用逻辑分析仪抓取的波形图,发送数据为
0x0ff0,
按理只有第
8
位会被发送,也就是
0xf0
;这里显然发送了
16
位的数据,而且可以看出,数据是
0xf00f
;正如我之前所说,先发送了低
8
位
0xf0
,再发送了
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
个位了。
②:修改头文件,用共用体实现,修改如下
图
12
图
13
抓取波形
图
14
发送是正确的。
我本人更倾向于第二种解决方法,用起来更方便。但是会破坏头文件,会导致你的程序的兼容性降低,代码移植起来就很不方便了。
好了,本次对
SPI
的评测解析就到这里了,欢迎大家和我一起讨论有关的问题,一起交流STM32的开发经验。我文中若有不对之处,也望大家能给指出,小弟不胜感激。
本帖最后由 LiuYang 于 2016-5-28 14:13 编辑
不知道该如何去写一个评测才能将我对这款单片机的了解表达清楚。关于单片机的介绍,关于它的建工程方法,百度一下应该能搜到很多,我想就没太大意义去写。我更喜欢去分享一些技术性的东西,所以我就将我学习中遇到的一些问题和发现的与
F4
的一些小差异来和大家分享一下。
今天分享一下我在使用
SPI
的过程中遇到的问题与解决方法。
图
1
图
1
是
L476
的
SPI
特性介绍,数据长度范围是
4~16
比特,宽泛的数据长度设置范围。但是在平时的应用中价值并不大,一般都是
8
位或者
16
位的,但一些数字电路里可能会有较大用处。
图
2
图
2
是
F4
的,
F4
仅支持
8
位和
16
位的数据长度。
图
3
图
3
为
L476
的框图,最为明显的是它具有
FIFO
,先进先出队列。
图
4
这是一个
32
位的缓存,有利于
SPI
的连续工作。提高传输速率。
再来看一下
F4
的:
图
5
F4
仅有收发缓存器,也就是只有当上一数据发送完毕后再能写入下一个数据,这样就会造成发送的间断,降低数据传输速率。
两个单片机就在这两个方面有差别,但是,在使用的时候发现他们的
DR
寄存器操作有很大的差别,
L476
在
8
位及
8
位以下数据长度时,对
DR
写入数据后
spj
控制器会将
DR
认为是两个
8
位寄存器。先发送低
8
位的内容再发高
8
位。
图
6
图
6
是用逻辑分析仪抓取的波形图,发送数据为
0x0ff0,
按理只有第
8
位会被发送,也就是
0xf0
;这里显然发送了
16
位的数据,而且可以看出,数据是
0xf00f
;正如我之前所说,先发送了低
8
位
0xf0
,再发送了
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
个位了。
②:修改头文件,用共用体实现,修改如下
图
12
图
13
抓取波形
图
14
发送是正确的。
我本人更倾向于第二种解决方法,用起来更方便。但是会破坏头文件,会导致你的程序的兼容性降低,代码移植起来就很不方便了。
好了,本次对
SPI
的评测解析就到这里了,欢迎大家和我一起讨论有关的问题,一起交流STM32的开发经验。我文中若有不对之处,也望大家能给指出,小弟不胜感激。
0
收藏
举报
分享
×
微信分享
扫描二维码分享
qq分享
QQ空间分享
微博分享
我来回复
登录后可评论,请
登录
或
注册
所有回答
数量:
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
回复
举报
发布
×
举报
举报人:
被举报人:1716094642@qq.c
*
类型:
请选择类型
问题质量差
垃圾广告信息
偏离社区主题
违规内容
不友善内容
与社区已有问题重复
以上选项都不是
*
详细原因:
取消
提交
x
收藏成功!点击
我的收藏
查看收藏的全部帖子