打印

模拟SPI问题

[复制链接]
6743|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenyu988|  楼主 | 2012-11-23 22:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
dqyubsh| | 2012-11-23 22:57 | 只看该作者
没明白你的意思,难不成两个单片机用模拟SPI通讯?

可以增加两条握手线,两边分别是输出,哪个单片机想说话,就给出确定电平,另一边就听着。

有些单片机的SPI有多种工作方式,貌似可以配置成从机发起通讯。

使用特权

评论回复
板凳
Ryanhsiung| | 2012-11-24 08:16 | 只看该作者
全部设置成开漏模式,主机控制SS就可以了。
  要是互为主的话,请要两根SS

使用特权

评论回复
地板
Tinnal| | 2012-11-24 08:51 | 只看该作者
控制时钟线的就是主机。

使用特权

评论回复
5
NE5532| | 2012-11-24 09:32 | 只看该作者
控制时钟线的就是主机。
Tinnal 发表于 2012-11-24 08:51

正解,SPI从机无权主动发起通讯。

使用特权

评论回复
6
chenyu988|  楼主 | 2012-11-24 10:11 | 只看该作者
5# NE5532
主机从机都用模拟的方式。主机的输出接到从机的输入,主机的输入接到从机的输出,时钟线接一起,这样对吗?
“控制时钟线的就是主机”意思是不是时钟线是高电平还是低电平只能主机控制,从机无权控制?
但从机如果不能配置时钟线的话,从机是如何产生上升、下降沿的呢?如果通过主机来产生的话,那主机又如何操作呢?
还是我理解的就是错的?

使用特权

评论回复
7
chenyu988|  楼主 | 2012-11-24 10:14 | 只看该作者
5# NE5532
主机从机都是模拟SPI,是不是要四根线?即2楼说的握手线,主机的握手线与从机的某个IO连接,然后主机的握手线给高电平以确定自己是主机。然后从机的上升下降沿的时钟频率其实与主机一致的。请问这样理解对吗? 或许我表达的不够清楚。

使用特权

评论回复
8
chenyu988|  楼主 | 2012-11-24 10:21 | 只看该作者
5# NE5532
还有个问题
SPI不是有3线4线两种模式吗?3线的时候没有握手线,则是互为主从吗?

使用特权

评论回复
9
NE5532| | 2012-11-24 10:29 | 只看该作者
主机从机都用模拟的方式。主机的输出接到从机的输入,主机的输入接到从机的输出,时钟线接一起,这样对吗?

对。

“控制时钟线的就是主机”意思是不是时钟线是高电平还是低电平只能主机控制,从机无权控制?

对。

但从机如果不能配置时钟线的话,从机是如何产生上升、下降沿的呢?如果通过主机来产生的话,那主机又如何操作呢?

从机只能跟随主机发送的时钟来动作,从机能控制的线只有MISO,主机产生时钟只需要拉高拉低时钟端口就可以了啊。

使用特权

评论回复
10
NE5532| | 2012-11-24 10:32 | 只看该作者
主机从机都是模拟SPI,是不是要四根线?即2楼说的握手线,主机的握手线与从机的某个IO连接,然后主机的握手线给高电平以确定自己是主机。然后从机的上升下降沿的时钟频率其实与主机一致的。请问这样理解对吗? 或许我表达的不够清楚。

你说的握手线,实际上应该叫“片选线”,SPI总线的片选线实际上是用于控制指令间的“断句”,你既然两边都是模拟SPI端口,只要没有其他器件(硬SPI口的器件)连在线上,可以通过协议省掉片选线。

从机没有上升沿下降沿的问题,你看这个问题看得太底层了,从机就是“跟着主机时钟收数和发数”而已。

使用特权

评论回复
11
NE5532| | 2012-11-24 10:33 | 只看该作者
SPI不是有3线4线两种模式吗?3线的时候没有握手线,则是互为主从吗?

SPI总线可以通过扩展的设计支持多主机共享总线,但是一般很少有需求这样做。一般把SPI认为是4线总线,3线总线的实现方法见上一个回帖。

使用特权

评论回复
12
chenyu988|  楼主 | 2012-11-24 11:09 | 只看该作者
11# NE5532
感谢您细心的回答。不过还有些地方暂时不能理解。
主机4根线MISO MOSI CLK1 CS分别与从机的MISO MOSI CLK2 CS连接吧?
主从都是模拟的话CS可以省去,那主从之间互相收发的吧?那如何确定哪个是主,哪个是从呢?(即如何确定时钟是由谁提供的)还是此时就没有主从之分了?
还有就是从机时钟的问题。
假设我是两个51单片机A、B之间模拟SPI通讯,假设是4线制,A通过CS拉高确定是主机,CLK由A的CLK1提供,A/B里面都有单独的收发程序吧?
B收发的时候需要把CLK2拉高或者拉低吧?此时CLK2应该是A的CLK1提供的
而B只能操作CLK2,那CLK2拉高或者拉低的频率怎么由CLK1(CLK1在A上)控制呢?还是此时CLK2硬件与CLK1连接了,操作CLK2拉高拉低,就相当于CLK1拉高拉低?
呵呵可能我表达的不清楚。

使用特权

评论回复
13
123654789| | 2012-11-24 11:14 | 只看该作者
主机4根线MISO MOSI CLK1 CS分别与从机的MISO MOSI CLK2 CS连接吧?     这句话不对

主从都是模拟的话CS可以省去    这句话也不对

使用特权

评论回复
14
123654789| | 2012-11-24 11:17 | 只看该作者
而B只能操作CLK2,     这句话也不对

使用特权

评论回复
15
NE5532| | 2012-11-24 11:17 | 只看该作者
主机4根线MISO MOSI CLK1 CS分别与从机的MISO MOSI CLK2 CS连接吧?

正确

主从都是模拟的话CS可以省去,那主从之间互相收发的吧?那如何确定哪个是主,哪个是从呢?(即如何确定时钟是由谁提供的)还是此时就没有主从之分了?

谁发时钟谁就是主机,我猜你是想问两边是否可以交替当主机的问题,可以,但是自己软件处理好,不然要撞车。

还有就是从机时钟的问题。
假设我是两个51单片机A、B之间模拟SPI通讯,假设是4线制,A通过CS拉高确定是主机,CLK由A的CLK1提供,A/B里面都有单独的收发程序吧?

虽然确实只有主机可以操作CS,但是主机的实际定义是以“谁发时钟谁当主机”来定义的。两侧都要有独立的收发程序。

B收发的时候需要把CLK2拉高或者拉低吧?此时CLK2应该是A的CLK1提供的
而B只能操作CLK2,那CLK2拉高或者拉低的频率怎么由CLK1(CLK1在A上)控制呢?还是此时CLK2硬件与CLK1连接了,操作CLK2拉高拉低,就相当于CLK1拉高拉低?

从机端的CLK引脚是输入,不是输出,所以从机无法操作CLK,只能读。

使用特权

评论回复
16
123654789| | 2012-11-24 11:21 | 只看该作者
下面这句话不正确

使用特权

评论回复
17
123654789| | 2012-11-24 11:26 | 只看该作者
主机4根线MISO MOSI CLK1 CS分别与从机的MISO MOSI CLK2 CS连接吧?

这句话不正确

按照楼主的意思

MISO < --------  > MISO
MOSI < --------  > MOSI
CLK1 < --------  > CLK2
CS    < --------  > CS

把数据线交叉起来才对
应该是
MISO < --------    MOSI
MOSI   --------  > MISO
CLK1 < --------  > CLK2
CS   < --------  > CS

使用特权

评论回复
18
123654789| | 2012-11-24 11:29 | 只看该作者
主从都是模拟的话CS可以省去    这句话也不对


应该是 任何时候都要有CS
如果没有CS
那么就变成I2C 总线了

使用特权

评论回复
19
NE5532| | 2012-11-24 11:29 | 只看该作者
主机4根线MISO MOSI CLK1 CS分别与从机的MISO MOSI CLK2 CS连接吧?

这句话不正确

按照楼主的意思

MISO < --------  > MISO
MOSI < --------  > MOSI
CLK1 < --------  > CLK2
CS    < --------  > CS

把数据 ...

你理解错了,MISO是Master Input Slave Output的意思,在一个给定的SPI总线上,主机和从机是固定的,能这样写的芯片,说明是考虑 了这个问题的。

有的芯片写为SI、SO,这种时候才是多半要交叉的。

因为有的芯片厂家比较白痴,所以保险起见,最好仔细看下数据手册后面的详细介绍,看看哪根线是输出,哪根线是输入。

个人比较推荐MOSI和MISO的写法,很难出错。

123654789 发表于 2012-11-24 11:26

使用特权

评论回复
20
123654789| | 2012-11-24 11:44 | 只看该作者
NE5532 发表于 2012-11-24 11:29


你考虑问题不够全面

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

1107

帖子

14

粉丝