OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7392|回复: 33

重金求助,关于SPI通信发送空字节的问题

[复制链接]

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-5-26 14:39:39 | 显示全部楼层 |阅读模式
50金钱
PPT上说若要读取一个字节就必须发送一个空字节来引发从机的传输。
代码上是   byte=SPI2_ReadWriteByte(0Xff);

我想问的是主机发送这个0XFF给从机不会覆盖从机上的原有数据吗?既然我写别的数据,例如0X50可以写入,那0XFF也是写入呀,那不就覆盖了吗?

最佳答案

查看完整内容[请看2#楼]

这个SPI总线收发是同步的,兄弟。 你发一个数据必定接收到数据,这个数据有时候你需要有时候你不需要。 所以如果你想得到一个数据就发送一字节任意数据过去,但是你发送一个数据之后可以不考虑同步接收的数据,这就要看你们(主,从如何协定了)。 接口结构是移位寄存器形式的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 14:39:40 | 显示全部楼层
这个SPI总线收发是同步的,兄弟。  你发一个数据必定接收到数据,这个数据有时候你需要有时候你不需要。  所以如果你想得到一个数据就发送一字节任意数据过去,但是你发送一个数据之后可以不考虑同步接收的数据,这就要看你们(主,从如何协定了)。  接口结构是移位寄存器形式的。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 14:41:37 | 显示全部楼层
还有是  主机和从机的数据是在移位寄存器上来进行交换的,那么从机的移位寄存器在得到主机传过来的数据以后 发生了什么?这些数据去了哪里?
回复

使用道具 举报

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-5-26 14:51:22 | 显示全部楼层
数据的读取是在发送读取命令后,后面跟着的就是有效数据,注意,只有连续发送空数据,从机才能返回数据。
回复

使用道具 举报

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-5-26 14:53:07 | 显示全部楼层
最简单的方法,主机在发送最后一个有效数据字节后,再发送一个 NULL 标志字节,例如 0x00.
当主机在从从机读取时,也发送这个 NULL 标志字节来驱动时钟。
从机在发送有效数据前,先发送一个不同于 NULL 标志的起始标志字节,例如 0xFF.
这样,当从机没有对 SPI 移位寄存器写入数据的情况下,主机收到的始终是 NULL 字节,看作从机忙。当收到起始字节时,就知道后面是有效数据了
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-5-26 14:56:58 | 显示全部楼层
发什么都行,和发送字节的内容没关系。
spi的主机控制时钟线,需要发送空字节的原因是从机需要时钟线上一个字节的时序(下降沿)来交换数据,每得到一个下降沿,就往数据线上放一个bit的电平,在主机发送哑字节的“同时”,需要从数据线上读取电平,读取 数据在时钟线的上升沿进行。
这样发送一个字节的同时就收到了一个字节
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:04:11 | 显示全部楼层
康仔呦 发表于 2016-5-26 14:51
数据的读取是在发送读取命令后,后面跟着的就是有效数据,注意,只有连续发送空数据,从机才能返回数据。

这样,第一个问题:主机发送0X05给从机来读取状态寄存器,这个过程是,主机的移位寄存器中的0X05通过MOSI发送给从机的以为寄存器,然后从机的移位寄存器返回给主机的又是什么呢?  

第二个问题,从机得到0X05,后面是什么执行过程?状态寄存器的值会放到从机的移位寄存器上吗?然后主机再发送0XFF来驱动从机把这个值发送给主机。

第三个问题,从机得到0XFF这个值以后 ,这个值去哪里?难道说在任何主机写入操作之前,从机的位移寄存器上的值都是0XFF?

回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:06:25 | 显示全部楼层
康仔呦 发表于 2016-5-26 14:53
最简单的方法,主机在发送最后一个有效数据字节后,再发送一个 NULL 标志字节,例如 0x00.
...

难道是要区分写命令和写数据?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:22:58 | 显示全部楼层
pthread 发表于 2016-5-26 15:10
这个SPI总线收发是同步的,兄弟。  你发一个数据必定接收到数据,这个数据有时候你需要有时候你不需要。   ...

哥哥 我知道是同步的。我现在困惑的是,比如我要从FLASH上读取两个字节数据出来,主机得连续发送两个空字节0XFF给从机,才能得到这两个字节数据对吗?好 我现在为了得到第一个字节,主机的移位寄存器发送读取命令0X03给从机的位移寄存器,这时候从机的位移寄存器就变成0X03了吧,然后FLASH再怎么执行?会把第一个字节放到移位寄存器上,然后等待主机发送0XFF吗?
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:23:16 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:04
这样,第一个问题:主机发送0X05给从机来读取状态寄存器,这个过程是,主机的移位寄存器中的0X05通过MOSI ...

第一个问题: 返回的是从机上次接收到的数据。
第二个问题: 从机判断收到的数据0x05,是就将状态寄存器值写入数据寄存器。这个时候你(主机)需发个任意数据取出这个值。  从机收到0x05是一次收发,  你读取是另一次收发
第三个问题:还是0xff,。 如果从机以后都没有再写数据寄存器并且主机也没有再发数据来,那么从机的数据寄存器就一直维持0xff。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:25:41 | 显示全部楼层
pthread 发表于 2016-5-26 15:23
第一个问题: 返回的是从机上次接收到的数据。
第二个问题: 从机判断收到的数据0x05,是就将状态寄存器值 ...

数据寄存器和移位寄存器啥关系啊? 主从机分别有一个移位寄存器,那数据寄存器呢?
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:26:24 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:22
哥哥 我知道是同步的。我现在困惑的是,比如我要从FLASH上读取两个字节数据出来,主机得连续发送两个空字 ...

FLASH有固化的处理程序,你只管发来指令就可以了。这个时候你可以循环发送0xFF,监控接收到的数据。或者延迟一段时间(FLASH判断处理时间)去发送0xff直接得到这个数据。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:27:42 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:25
数据寄存器和移位寄存器啥关系啊? 主从机分别有一个移位寄存器,那数据寄存器呢?

数据寄存器是移位性质的,这样理解。 也就是数据寄存就是移位寄存器,这样看。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:32:31 | 显示全部楼层
pthread 发表于 2016-5-26 15:26
FLASH有固化的处理程序,你只管发来指令就可以了。这个时候你可以循环发送0xFF,监控接收到的数据。或者 ...

我觉得我应该是没把数据寄存器和移位寄存器这两个的功能分清楚,
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:33:57 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:32
我觉得我应该是没把数据寄存器和移位寄存器这两个的功能分清楚,

这个SPI的数据寄存器不存在缓冲。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:38:28 | 显示全部楼层
pthread 发表于 2016-5-26 15:27
数据寄存器是移位性质的,这样理解。 也就是数据寄存就是移位寄存器,这样看。

那我就更迷糊了。。。读取单个字节我还能理解一下,要是读取多个字节的话主机一直在发送0XFF,那从机的移位寄存器不就一直是0XFF吗?难道说从机在第二个0xFF到来之前,我们想要获得的数据就已经放在从机的移位寄存器上了?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:39:07 | 显示全部楼层
pthread 发表于 2016-5-26 15:33
这个SPI的数据寄存器不存在缓冲。

用了立马就没了?
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:44:17 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:38
那我就更迷糊了。。。读取单个字节我还能理解一下,要是读取多个字节的话主机一直在发送0XFF,那从机 ...

是的啊,这是从机的处理。  具体如何同步就需要调吧。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:44:34 | 显示全部楼层
pthread 发表于 2016-5-26 15:33
这个SPI的数据寄存器不存在缓冲。

我现在这样理解对吗?主机要从FLASH上取2个字节的数据,主机先发送读数据命令0X03给从机,发送完以后从机的移位寄存器是0X03。FLASH在得到这个命令后,立即把第一个字节放到移位寄存器上,等到主机把0XFF发送过来以后,第一个字节传送给主机。然后,从机又把第二个字节放到从机的移位寄存器上,等到主机把第二个0XFF,发送过来时,向主机传送第二个字节?

整个过程中,从机接收到的0XFF不会存在太长时间,会被FLASH上的数据覆盖?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 15:54:13 | 显示全部楼层
pthread 发表于 2016-5-26 15:44
是的啊,这是从机的处理。  具体如何同步就需要调吧。

例程上写了好多    SPI2_ReadWriteByte(0x00); 难道这就是调出来的?

QQ截图20160526155320.png
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 15:54:26 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:44
我现在这样理解对吗?主机要从FLASH上取2个字节的数据,主机先发送读数据命令0X03给从机,发送完以后从机 ...

不好意思,好像给你说的解释不通了啊。 我看了看数据手册(SPI功能描述的地方),你看一下接口。 过程应该是这样的:从机移位寄存器收到主机发来的数据,然后这个数据会备份到从机的接收缓冲(数据寄存器),然后从机根据收到的数据进行判断,将要输出的数据放到输出缓冲(数据寄存器),然后输出缓冲的数据会备份到移位寄存器,这个时候你再发来一字节数据,将移位寄存器里的数据移出去就得到从机回的数据了。   这个数据寄存器存在缓冲。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 16:00:32 | 显示全部楼层
pthread 发表于 2016-5-26 15:54
不好意思,好像给你说的解释不通了啊。 我看了看数据手册(SPI功能描述的地方),你看一下接口。 过程应 ...

额  那我的困惑还是这样的  如果我连续发送两个0XFF,第一个0XFF发给从机以后放在移位寄存器里,然后发送第二个的时候,不就相当于又把把第一个0XFF给“挤”回主机了吗、、、、、、、
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:03:37 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 15:54
例程上写了好多    SPI2_ReadWriteByte(0x00); 难道这就是调出来的?

这个取决于从设备的处理速度。SPI FLASH可以在发完命令后可以马上读到。
但是慢速从设备就需要等待了。   具体什么设备可以很快处理完,什么设备需要等待就需要具体的查看相应设备手册了吧,也可以通过调试,看是否需要延迟去读。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:09:42 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 16:00
额  那我的困惑还是这样的  如果我连续发送两个0XFF,第一个0XFF发给从机以后放在移位寄存器里,然后发送 ...

是的,这是在从机还没处理过来的情况下。如果从机处理速度快就不存在这个情况了。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 16:10:56 | 显示全部楼层
pthread 发表于 2016-5-26 16:03
这个取决于从设备的处理速度。SPI FLASH可以在发完命令后可以马上读到。
但是慢速从设备就需要等待了。  ...

额  我现在晕就晕在 读取多个字节时,多个字节是怎么放到从机移位寄存器上的,以及主机发送多个空字节0XFF到从机时,从机怎么处理空字节,这个空字节应该不会一直存在,而是被FLASH上的数据覆盖?越想越痛苦。。。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 16:13:40 | 显示全部楼层
pthread 发表于 2016-5-26 16:09
是的,这是在从机还没处理过来的情况下。如果从机处理速度快就不存在这个情况了。

麻蛋  不管了  管球他的 就这样吧  我就记住要发送空字节给从机才能得到数据就行了,,说不定哪天就恍然大悟了。。。。。。谢谢你的耐心讲解!!!!!
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 16:16:31 | 显示全部楼层
yklstudent 发表于 2016-5-26 16:10
好奇为什么大家都不用SPI中断的方式发送/接收数据

今天刚学到这里
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:21:24 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 16:10
额  我现在晕就晕在 读取多个字节时,多个字节是怎么放到从机移位寄存器上的,以及主机发送多个空字节0XF ...

你不需要考虑这些,从机的程序要么别人已经弄好了,你根据协议来就可以了。要么主从机程序都需要你来完成,这个时候你想想应该怎么实现。 从机根据接收到的数据(不管是中断还是轮训)来判断之后,决定怎么处理(是不理会,是只回一个字节,是回复一堆。),如果是回复很多的话,也是通过判断接收到的是否为0xff(这时就要你自己定义了,可以是0xff,可以是其他的)再决定是否发下一个数据。   从机是不会主动一下子把所有数据都放到输出缓冲的,都是需要根据主机发来的那个0xff来再发去的。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:23:40 | 显示全部楼层
pthread 发表于 2016-5-26 16:21
你不需要考虑这些,从机的程序要么别人已经弄好了,你根据协议来就可以了。要么主从机程序都需要你来完成 ...

0xFF是主从机通讯协议的一部分。   刚才说发任意字节过去,只能取得一个字节。再发这个字节过去就不能取得一块数据的下一个字节了。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-5-26 16:27:16 | 显示全部楼层
pthread 发表于 2016-5-26 16:23
0xFF是主从机通讯协议的一部分。   刚才说发任意字节过去,只能取得一个字节。再发这个字节过去就不能取 ...

发送0XFF就能获得连续数据?
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:30:50 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 16:27
发送0XFF就能获得连续数据?

这是协议的一部分。 主从机协商好了,从机说你只能发送来0xff,我才知道你需要下一个数据。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-26 16:33:11 | 显示全部楼层
xiaobudonglaosh 发表于 2016-5-26 16:13
麻蛋  不管了  管球他的 就这样吧  我就记住要发送空字节给从机才能得到数据就行了,,说不定哪天就恍然 ...

共同进步,我也在这个过程中回忆下,理顺理顺思路。     
回复

使用道具 举报

1

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2013-3-3
在线时间
35 小时
发表于 2016-5-27 09:12:37 | 显示全部楼层
SPI通讯接口是一个环形移位寄存器,所以说你想获得数据就得移出数据给从机,你给一位它给你一位。
回复

使用道具 举报

4

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-4-7
在线时间
32 小时
发表于 2016-5-27 15:05:25 | 显示全部楼层
大神们讲的很到位啊,也解决了我的疑惑哈哈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表