本章节将浅析SPI通信原理,以及利用MC9S08DZ60单片机的串行外围设备接口SPI,实现SPI串行通信,MCU为主控设备。有兴趣的读者可以通过单片机的I/O口,模拟SPI通信过程,实现SPI通信。
1.理解SPI通信协议
读者可以到网盘https://pan.baidu.com/s/1yEoRjek9Oag5iEpp40nYYQ下载<SPI协议及工作原理分析>,该文章是作者在百度文库找到,并提取下来的,文中附有当时的下载地址。转发请注意注明转载出处。
这篇文章很简洁的介绍了SPI通信协议和工作原理,初识SPI通信的读者请认真阅读。
作者在此简短说明SPI通信原理。
如下图,主设备(Master)要发送0x66给从设备(Slave),同时从设备(Slave)也会把0xC5发送给主设备(Master);
每个CLKx周期,主从设备做了一个bit位的数据交换,数据交换为byte单位,需要循坏8CLK周期。
从而分析出SPI具备的几个特点:
主从模式(Master->Slave):主设备是主控制设备,控制从设备的选取和时钟驱动。
同步方式(synchronize):根据时钟信号同步数据的收发。
交换数据方式(exchange):在每个时钟周期CLK内,主从SPI设备都会发送并接受一个bit大小的数据。
2.SPI工作方式
如下图:
Bus-Width :即上图寄存器Tx_Data到SSPBUF总线位宽。
Channel-Width:即上图SDO->SDI的数据带宽,也可以理解为主设备到从设备或从设备到主设备每次发送的数据宽度,一般是一个字节。
3.阅读芯片资料理解MC9S08DZ60的SPI
大家可以到百度网盘下载该芯片的中英文的资料https://pan.baidu.com/s/1dgVbkE https://pan.baidu.com/s/1o9qFU5c
进入第十三章 串行外围接口SPI(Serial peripheral Interface)
a.从Figure 13-1. MC9S08DZ60 Block Diagram节中,加黑部分总览SPI模块及其接口。该芯片中提供一路SPI接口,接口还将占用端口E的4个I/O口。
b. 13.1.1 Features节中特性 目前普遍拥有SPI通信模块芯片的基本特性,这里说明下MSB和LSB。
最高有效位(MSB),指二进制中代表最高值的比特位,这一位对数值的影响最大。例如,在二进制的1001(十进制的9) 中,最左边的“1”对数值影响最大:1到9的变化幅度。而最右边的1仅会让数值产生8到9的变化,故该位称也为最低有效位LSB(Least Significant Bit)。
如果设置为MSB发送模式,那么一个byte数据在从SDO->SDI过程,是先发送最左边的bit位,如果是LSB,那么相反。这里还有个概念,叫着大小端。在嵌入式网络开发中,经常提到。有兴趣的读者可以通过互联网搜索等方式,了解这个大小端的概念。
c. 13.1.2.2 SPI Module Block Diagram 这里面讲了很多(芯片资料建议看英文的,中文部分有误),最简单的就理解这句话就行“In the external SPI system, simply connect all SPSCK pins to each other, all MISO pins together MOSI pins together. Peripheral devices often use slightly different names for these pins.”在硬件层面,主从设备把相同名字的接口连接即可。至于SPI模块内部的route(接收或发送的线路选择),能理解就理解。
d. 13.1.3 SPI Baud Rate Generation 这小节介绍了Baud波特率的时钟源,看下图,时钟源来源于BUS CLOCK总线时钟,在本系列博文中《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》有介绍,且该单片机的SPI时钟源只能来源于总线时钟。BUS CLOCK时钟来源于MCGOUT的时钟,且BUS CLOCK为MCGOUT时钟的一半。这里将利用《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》中代码设置好的时钟作为SPI的驱动时钟。其中MCGOUT为40mHz,那么BUS CLOCK就是20mHz。
总线时钟BUS CLOCK经过预分频PRESCALER和时钟速率除数CLOCK RATE DIVIDER,最终才得到SPI的驱动时钟。波特率一般用位每秒(bit/s)作为单位,通俗的理解就是:一秒钟能发送多少位。举个例子:假如分频后SPI的驱动时钟为T=1ms(1kHz),那么波特率为baud=1000bps————一秒钟可以传输1000bit的数据。