第五课 MC9S08DZ60之串行外围设备接口SPI

    本章节将浅析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工作方式

如下图:


先往 Master 的 Tx-Data 寄存器写入将要发送出去的数据(有时为了读取从设备可以发送dummy数据), 这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO  管脚传给 Slave-SDI 管脚,  Slave-SSPSR 则把从  Slave-SDI 接收到的数据移入 Slave-SSPBUF 里.  与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.

 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的数据。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值