打印

SPI总线协议

[复制链接]
5639|17
手机看帖
扫描二维码
随时随地手机跟帖
沙发
senzh01| | 2010-5-13 19:50 | 只看该作者
非常感谢!

使用特权

评论回复
板凳
lihuiplus| | 2010-5-13 21:26 | 只看该作者
逻辑分析仪的抓图。

使用特权

评论回复
地板
smile_luo| | 2010-5-13 23:07 | 只看该作者
:handshake

使用特权

评论回复
5
zhuhan| | 2010-5-18 20:55 | 只看该作者
很好的 ,谢谢楼主

使用特权

评论回复
6
op27| | 2010-5-28 16:20 | 只看该作者
STM8A   SPI 之通讯方式:全双工?半双工?单工?



单工,半双工,全双工都是数据传输模式来的

单工:数据的发送方向只能固定一个方向,比如有A,B两个节点.只能是A发送,B接收.而B不能发送,单一方向的数据传输

半双工:线路两端的用户(或节点)不能同时发送数据,A发送,B接收,或者B发送,A接收

全双工:双方可以同时接收或发送数据的,这样以来,这条线路的速率就提高一半



根据以上定义,全双工的意义在于可以(并非一定要)同时接收和发送数据。



SPI总线设计出来是以解决全双工通讯为目的的。而SPI解决方案是主、从器件中两个移位的组成的环形总线,在某种需求(互换数据)和默契(主对从发送CMD,告诉从说下一个SPI周期开始互换)下,主器件向Txbuffer写入数据,同时从器件也向自己的TXbuffer写入数据,按照主器件的SCK节奏以及相应时序(上升沿进行一个位的移位操作)。

这样一来,8个周期后,主从的Txbuffer之间完成了互换的目的,即,八个CLOCK后,传输两个字节。实现了高速传输的全双工的目的。


但是,结合具体应用,比如有SPI硬件的单片机与具备SPI接口的E2PROM,LCD,SDCard等的通讯,似乎进行的都不是全双工通讯,依然是半双工通讯,一般而言就是主器件(单片机)发送命令,从器件(SDCard等)给出一个反应,接着根据命令从器件送出相应的数据给主器件。正是因为如此,在很多情况下,如单片机没有SPI硬件,也可以用IO模拟SPI,只要时序正确也是可以的。而对于有SPI硬件的单片机来说,只需设置相应的寄存器使得单片机处于主器件地位,MOSI和MISO端口工作正常,选择好SCK时钟频率即可完成初始化。下面将结合STM8A尝试初始化SPI。


打开STM8A的用户手册,找到SPI寄存器描述那一页,对着看SPI_CR1和SPI_CR2各个bit位的含义。

SPI_CR1        address 0x00 5200                            赋值

BIT 7                                                  0(最高位先传输)
  BIT 6                                                   1(SPI使能)

BIT [5:3]                                             000(fmaster二分频)

BIT 2                                                   1(主器件)

BIT 1                                                   0(SCK从0电平开始)

BIT 0                                                   0(第一个CLOCK开始第一个数据捕捉)



所以,

define SPI_CR1 volatile @0x5200

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

SPI_CR1=0x44;





  




由于是将SPI 设置成全双工正常模式(虽然不是用于全双工通讯),所以SPI_CR2中的BDM,BDOE,RXONLY不用设置,同时,不用CRC功能,且硬件上选择从器件,故SPI_CR2保持reset值不变,不用设置。

使用特权

评论回复
7
op27| | 2010-5-28 16:20 | 只看该作者
STM8A   SPI 之通讯方式:全双工?半双工?单工?

单工,半双工,全双工都是数据传输模式来的

单工:数据的发送方向只能固定一个方向,比如有A,B两个节点.只能是A发送,B接收.而B不能发送,单一方向的数据传输

半双工:线路两端的用户(或节点)不能同时发送数据,A发送,B接收,或者B发送,A接收

全双工:双方可以同时接收或发送数据的,这样以来,这条线路的速率就提高一半

根据以上定义,全双工的意义在于可以(并非一定要)同时接收和发送数据。

SPI总线设计出来是以解决全双工通讯为目的的。而SPI解决方案是主、从器件中两个移位的组成的环形总线,在某种需求(互换数据)和默契(主对从发送CMD,告诉从说下一个SPI周期开始互换)下,主器件向Txbuffer写入数据,同时从器件也向自己的TXbuffer写入数据,按照主器件的SCK节奏以及相应时序(上升沿进行一个位的移位操作)。
这样一来,8个周期后,主从的Txbuffer之间完成了互换的目的,即,八个CLOCK后,传输两个字节。实现了高速传输的全双工的目的。

但是,结合具体应用,比如有SPI硬件的单片机与具备SPI接口的E2PROM,LCD,SDCard等的通讯,似乎进行的都不是全双工通讯,依然是半双工通讯,一般而言就是主器件(单片机)发送命令,从器件(SDCard等)给出一个反应,接着根据命令从器件送出相应的数据给主器件。正是因为如此,在很多情况下,如单片机没有SPI硬件,也可以用IO模拟SPI,只要时序正确也是可以的。而对于有SPI硬件的单片机来说,只需设置相应的寄存器使得单片机处于主器件地位,MOSI和MISO端口工作正常,选择好SCK时钟频率即可完成初始化。下面将结合STM8A尝试初始化SPI。

打开STM8A的用户手册,找到SPI寄存器描述那一页,对着看SPI_CR1和SPI_CR2各个bit位的含义。
SPI_CR1                address 0x00 5200                                赋值
BIT 7                                                                  0(最高位先传输)
  BIT 6                                                                1(SPI使能)
BIT [5:3]                                                        000(fmaster二分频)
BIT 2                                                                1(主器件)
BIT 1                                                                0(SCK从0电平开始)
BIT 0                                                                0(第一个CLOCK开始第一个数据捕捉)

所以,
define SPI_CR1 volatile @0x5200
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
SPI_CR1=0x44;










由于是将SPI 设置成全双工正常模式(虽然不是用于全双工通讯),所以SPI_CR2中的BDM,BDOE,RXONLY不用设置,同时,不用CRC功能,且硬件上选择从器件,故SPI_CR2保持reset值不变,不用设置。

使用特权

评论回复
8
op27| | 2010-5-28 16:38 | 只看该作者
BDM: Bi-directional data mode enable
0: 2-line uni-directional data mode selected
1: 1-line bi-directional data mode selected

BDOE: Output enable in bi-directional mode
This bit combined with BDM bit selects the direction of transfer in bidirectional
mode
0: Output disabled (receive-only mode)
1: Output enabled (transmit-only mode)
In master mode, the MOSI pin is used and in slave mode, the MISO pin is
used.
RXONLY: Receive only
0: Full duplex (Transmit and receive)
1: Output disabled (Receive only mode)
This bit combined with BDM bit selects the direction of transfer in 2 line unidirectional
mode
This bit is also useful in a multi-slave system in which this particular slave is
not accessed, the output from the accessed slave is not corrupted.

如果设置BDM=0,且RXONLY=0,就是STM8A 的SPI的常规用法,即全双工。
而如果BDM=1,即一个数据线同时负责收发,bidirectional?就可以通过BDOE为0或者为1来切换收和发的方向,即如果要发送数据必须先将BDOE置一,而要收数据得先给BDOE置零?
而如果BDM=0,且RXONLY=1(1: Output disabled (Receive only mode)),则意味着什么?

使用特权

评论回复
9
415939279| | 2010-5-29 11:00 | 只看该作者
很好的 ,谢谢楼主

使用特权

评论回复
10
kingsut2006| | 2010-5-31 19:04 | 只看该作者
谢谢

使用特权

评论回复
11
dan.lin| | 2010-7-7 14:24 | 只看该作者
谢谢,正在整理接口的资料!

使用特权

评论回复
12
gkb986| | 2010-7-7 20:27 | 只看该作者
不错
收藏了!

使用特权

评论回复
13
luei1987kg| | 2010-7-7 22:02 | 只看该作者
谢谢有用

使用特权

评论回复
14
hotpower| | 2010-7-8 05:45 | 只看该作者
SPI 之通讯方式:全双工?半双工?单工?


对其以后疑惑~~~

使用特权

评论回复
15
ino1988| | 2011-3-27 13:23 | 只看该作者
非常感谢分享!!

使用特权

评论回复
16
nan65219025| | 2011-11-14 13:50 | 只看该作者
感谢楼主分享!

使用特权

评论回复
17
percypan| | 2011-12-2 18:22 | 只看该作者
谢楼主

使用特权

评论回复
18
namezzx0604| | 2012-1-15 17:39 | 只看该作者
谢谢楼主分享

使用特权

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

本版积分规则

个人签名:宽温,超低温oled彩色液晶屏模块(军用) www.mcutech.cn 手机13871489945

30

主题

193

帖子

1

粉丝