搜索
bottom↓
回复: 24
打印 上一主题 下一主题

SPI通信问题求助

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2015-10-20 11:09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在在写SPI通信程序,MCU带有SPI通信接口。有个问题想不明白,SPI通信时发送方可以直接把MCU设置为主机,然后再发送数据就好了。
但是从机怎么知道什么时候会发送数据?SPI通信有个SCS选择脚,从机是不是通过检测SCS脚位上的电压来判断是不是要进入接收模式。换句话说
就是每隔一段时间从机都要检测一次SCS脚位上的电压,以决定是否需要接收数据。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2015-10-20 11:15:06 | 只看该作者
片选脚是为了多个从机跟主机通讯用的,就像开关一样。

出0入0汤圆

3
 楼主| 发表于 2015-10-20 11:16:40 | 只看该作者
Hhhhhhhh 发表于 2015-10-20 11:15
片选脚是为了多个从机跟主机通讯用的,就像开关一样。

那我把MCU设置为从机的话是不是只要主机发数据过来他自己会接收

出0入0汤圆

4
发表于 2015-10-20 11:20:55 | 只看该作者
夜尽天明 发表于 2015-10-20 11:16
那我把MCU设置为从机的话是不是只要主机发数据过来他自己会接收

是的。。

出0入0汤圆

5
发表于 2015-10-20 11:27:25 | 只看该作者
一般都是通过中断来干这个事

出0入0汤圆

6
发表于 2015-10-20 11:39:41 | 只看该作者
那个只是片选引脚,主机是不断的查询是否接收到数据。有的硬件模块SPI有IRQ引脚,就可以通过IRQ引脚发送给主机的外部中断,来决定是否接收数据。

出500入109汤圆

7
发表于 2015-10-20 11:40:16 | 只看该作者
两个MCU都默认把SPI设置为从机,DMA方式接收,设置一个足够大的缓冲区,然后设置一个接收中断,在主机发送完成之后向从机产生一个中断信号,从机中断,处理数据。

出500入109汤圆

8
发表于 2015-10-20 11:42:01 | 只看该作者
我在做这个,实际上的双MCU使用SPI通信要实现大量数据通信的话不太好做,

出0入0汤圆

9
 楼主| 发表于 2015-10-20 11:44:49 | 只看该作者
小Z 发表于 2015-10-20 11:39
那个只是片选引脚,主机是不断的查询是否接收到数据。有的硬件模块SPI有IRQ引脚,就可以通过IRQ引脚发送给 ...

明白了,下午测试下,谢谢

出0入0汤圆

10
 楼主| 发表于 2015-10-20 11:46:40 | 只看该作者
momo_li 发表于 2015-10-20 11:42
我在做这个,实际上的双MCU使用SPI通信要实现大量数据通信的话不太好做,

我的通信数据量不会很大,50个字节以内

出0入0汤圆

11
 楼主| 发表于 2015-10-20 11:47:10 | 只看该作者
vmalloc 发表于 2015-10-20 11:27
一般都是通过中断来干这个事

单片机是有通信功能的中断

出0入0汤圆

12
发表于 2015-10-20 11:49:52 | 只看该作者
如果两个 MCU 用 SPI,又想双向有高速度,就必须用两组 SPI 端口
一组端口的中断应答模式速度不行,过去搞过

出0入22汤圆

13
发表于 2015-10-20 11:53:23 | 只看该作者
本帖最后由 zxq6 于 2015-10-20 11:55 编辑

从硬件层来说,丛机只要拉低CS,就激活了SPI模块,不是通过轮询来实现接收的。
接收数据是通过判断SCK引脚状态来判断的。看配置,有些是检测上升沿,有些是检测下降沿。
接收到的数据会放在一个寄存器里面。
当接收到足够的数据位后,(根据配置,8bit,16bit,24bit等等),根据配置,可以向软件系统发送中断信号。
软件系统再来处理接收到的数据。
有些spi还有fifo,这个就更复杂一些了。
至于DMA,那个更复杂了。

有机会,你用fpga实现一次spi,你就懂了。其实很简单的。比fpga实现uart简单太多了。

出0入0汤圆

14
 楼主| 发表于 2015-10-20 12:00:35 | 只看该作者
zxq6 发表于 2015-10-20 11:53
从硬件层来说,丛机只要拉低CS,就激活了SPI模块,不是通过轮询来实现接收的。
接收数据是通过判断SCK引脚 ...

知道怎么用了,不过FPGA我是真心不懂

出0入0汤圆

15
发表于 2015-10-20 12:37:44 | 只看该作者
scs 若是模拟接收,肯定是接中断了。要是MCU自带spi,就不用管了。
fpga 是并行处理,scs等于说是一直处于等待状态。
不存在轮询的说法。

出0入0汤圆

16
发表于 2015-10-20 13:10:46 | 只看该作者
13楼讲的很不错,大赞
只要片选了从机,从机就会把匹配自己的时钟极性和相位的数据缓存,不管你处理不处理数据。

出0入0汤圆

17
发表于 2015-10-20 13:13:55 | 只看该作者
momo_li 发表于 2015-10-20 11:40
两个MCU都默认把SPI设置为从机,DMA方式接收,设置一个足够大的缓冲区,然后设置一个接收中断,在主机发送 ...

spi是全双工的,发送完也就接收完了,不明白为什么还要主从机切换?
求指教...谢谢

出0入22汤圆

18
发表于 2015-10-20 13:57:22 来自手机 | 只看该作者
mvpgpz 发表于 2015-10-20 13:13
spi是全双工的,发送完也就接收完了,不明白为什么还要主从机切换?
求指教...谢谢 ...

主机和从机唯一的区别就是是否提供时钟信号。如果你第三方提供时钟,那么,两方都配置为从机照样可以通信

出0入0汤圆

19
发表于 2015-10-20 17:24:28 | 只看该作者
zxq6 发表于 2015-10-20 13:57
主机和从机唯一的区别就是是否提供时钟信号。如果你第三方提供时钟,那么,两方都配置为从机照样可以通信 ...

在同一个主机下的两个从机 直接 互相 通信么?
这个我倒是没有试过
这种用法一般会出现在什么情况下呢?
难点在哪里?
求指教 谢谢

出0入22汤圆

20
发表于 2015-10-20 21:23:02 来自手机 | 只看该作者
mvpgpz 发表于 2015-10-20 17:24
在同一个主机下的两个从机 直接 互相 通信么?
这个我倒是没有试过
这种用法一般会出现在什么情况下呢?

这种是很极端的抬杠用的,实际上没人这么用。因为,时钟第三方控制,徒增加一个第三方,吃力不讨好。而且,两个从机之间的软件工作量剧增,所以,虽然能够实现目的,但是确实不是一个好的方案的。

出500入109汤圆

21
发表于 2015-10-21 08:55:25 | 只看该作者
mvpgpz 发表于 2015-10-20 13:13
spi是全双工的,发送完也就接收完了,不明白为什么还要主从机切换?
求指教...谢谢 ...

双MCU使用SPI通信,两个MCU都会主动产生数据向对方发送。数据量大,通信频繁。
希望是能在18M的频率下达到90%的利用率,实际上却做不到,主要是MCU的任务太多,不能及时的响应中断,另一方面就是SPI不是很稳定,有时会出问题。

出0入22汤圆

22
发表于 2015-10-21 10:07:03 | 只看该作者
momo_li 发表于 2015-10-21 08:55
双MCU使用SPI通信,两个MCU都会主动产生数据向对方发送。数据量大,通信频繁。
希望是能在18M的频率下达 ...

其实是可以的。使用dma吧。你这个要求。
我在lm3s上,使用dma,可以让spi的效率到95%以上。

出500入109汤圆

23
发表于 2015-10-21 10:22:46 | 只看该作者
zxq6 发表于 2015-10-21 10:07
其实是可以的。使用dma吧。你这个要求。
我在lm3s上,使用dma,可以让spi的效率到95%以上。 ...

双向通信,会出现两个MCU同时要向对方发送数据的情况,这个时候两个MCU都把自己设置为主机,需要一个仲裁,决定谁先发。
我使用的方案是:每个MCU有一个接收忙状态引脚,一个发送开始引脚。先检测对方的接收忙,如果空闲的话把自己的接收置位忙状态,然后设置SPI为主机置位发送信号,开始发送数据,数据发送完成之后,设置SPI为从机,清除接收忙状态,清除发送信号,此时对方产生中断处理数据。
由于MCU执行每条命令是需要时间的,这个方案仍然无法避免发送冲突,尤其是频繁通信的时候。
你那里是使用的什么方案来解决这个问题呢?

出0入22汤圆

24
发表于 2015-10-21 10:27:49 | 只看该作者
momo_li 发表于 2015-10-21 10:22
双向通信,会出现两个MCU同时要向对方发送数据的情况,这个时候两个MCU都把自己设置为主机,需要一个仲裁 ...

哦,不好意思,看错了,我以为是单向通信。
我以前是单向通信,使用的dma,效率很高。
如果双向,暂时还没啥建议的。

出500入109汤圆

25
发表于 2015-10-21 10:36:07 | 只看该作者
zxq6 发表于 2015-10-21 10:27
哦,不好意思,看错了,我以为是单向通信。
我以前是单向通信,使用的dma,效率很高。
如果双向,暂时还 ...

单向的话相对来说简单一些,这个东西做完之后我感觉还是用串口对发比较合适一些,因为SPI仲裁损失的效率太多,18MSPI实际的数据量估计比不上4.5M的串口。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 02:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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