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值不变,不用设置。 |