第8章 第8章 SPI I2C与I2S.docx
- 文档编号:12587530
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:43
- 大小:1.60MB
第8章 第8章 SPI I2C与I2S.docx
《第8章 第8章 SPI I2C与I2S.docx》由会员分享,可在线阅读,更多相关《第8章 第8章 SPI I2C与I2S.docx(43页珍藏版)》请在冰豆网上搜索。
第8章第8章SPII2C与I2S
第8章SPI、I2C与I2S
本章导读:
SPI(SerialPeripheralInterface)、I2C(Inter-IntegratedCircuil)和I2S(IntergratedInterchipSound)是嵌入式设计中常用的同步串行通信接口,MCU通过这些接口与各种各样的传感器模块、控制模块甚至是其他的MCU进行通信。
相对于异步串行通信,同步串行通信具有更高的传输速率,但同样对时序的要求也就更高。
掌握这些接口的编程模型,将能有效地扩展嵌入式系统的功能。
本章的主要知识点有①SPI接口的基本原理及编程模型;②I2C接口的基本原理及编程模型;③I2S接口的基本原理及编程模型。
8.1SPI模块的驱动构件设计
8.1.1SPI基础知识
1.SPI基本概念
SPI是飞思卡尔公司推出的一种同步串行通信接口,用于微处理器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准。
目前,各半导体公司推出了大量带有SPI接口的芯片,为用户的外围扩展提供了灵活而廉价的选择。
SPI—般使用4条线:
串行时钟线SCK、主机输入/从机输出数据线MIS0、主机输出/从机输入数据线M0SI和从机选择线。
在阐述SPI的特性之前,我们先来了解几个概念。
(1)主机-从机:
SPI系统是典型的“主机-从机”(Master-Slave)系统。
一个SPI系统,由一个主机和一个或多个从机构成,主机启动一个与从机的同步通信,从而完成数据的交换。
提供SPI串行时钟的SPI设备称为SPI主机或主设备(Master),其他设备则称为SPI从机或从设备(Slave)。
在MCU扩展外设结构中,仍使用主机-从机(Master-Slave)概念,此时MCU必须工作于主机方式,外设工作机从机方式。
(2)从机选择引脚:
一些芯片带有从机选择引脚(SlaveSelect),也称为片选引脚。
若一个MCU的SPI工作于主机方式,则置该MCU的弱为高电平。
若一个MCU的SPI工作于从机方式,当=0时表示主机选中了该从机,反之则未选中该从机。
对于单主单从(OneMasterAndOneSlave)系统,可以采用图8-1所示的接法。
对于一个主MCU带多个从属MCU的系统,主机MCU的接高电平,每一个从机MCU的接主机的I/O输出线,由主机控制其电平高低,以便主机选中该从机。
图8-1SPI全双工主-从连接
(3)主出从入引脚M0SI:
主出从入(MasterOut/SlaveIn,M0SI)引脚是主机输出/从机输入数据线。
对于MCU被设置为主机方式,主机送向从机的数据从该引脚输出。
对于MCU被设置为从机方式,来自主机的数据从该引脚输入。
(4)主入从出引脚MIS0:
主入从出(MasterIn/SlaveOut,MIS0)引脚是主机输入/从机输出数据线。
对于MCU被设置为主机方式,来自从机的数据从该引脚输入主机。
对于MCU被设置为从机方式,送向主机的数据从该引脚输出。
(5)SPI串行时钟引脚SCK:
SPI串行时钟(SerialClock,SCK)引脚用于控制主机与从机之间的数据传输。
串行时钟信号由主机的内部总线时钟分频获得,主机的SCK引脚输出给从机的SCK引脚,控制整个数据的传输速度。
在主机启动一次传送的过程中,从SCK引脚输出自动产生的8个时钟周期信号,SCK信号的一个跳变进行一位数据移位传输。
(6)主出主入(M0MI)引脚:
主出主入(MasterOut/MasterIn,M0MI)引脚是单线传输时,主机的输入输出数据线,与M0SI引脚复用。
若MCU被设置为主机方式,该引脚发送或接收从机的数据。
(7)从入从出(SISO)引脚:
从入从出(SlaveIn/SlaveOut,SIS0)引脚是单线传输时,从机的输出输入数据线,与MIS0引脚复用。
若MCU被设置为从机方式,该引脚发送或接收主机的数据。
(8)时钟极性:
表示时钟信号在空闲时是高电平还是低电平。
(9)时钟相位:
决定数据是在时钟信号SCK的上升沿还是在SCK的下降沿进行采样。
2.SPI的数据传输
图8-1是SPI的主-从连接示意图,图中的移位寄存器为8位,所以每一工作过程相互传送8位数据,数据传输从主机CPU发出启动传输信号开始,此时要传送的数据装入8位移位寄存器,同时产生8个时钟信号从SCK引脚依次送出,在SCK信号的控制下,主机中8位移位寄存器中的数据依次从M0SI引脚送出,到从机的M0SI引脚后送入它的8位移位寄存器;在此过程中,从机的数据也可通过MIS0引脚传送到主机中。
所以,我们称之为全双工主-从连接(Full-DuplexMaster-SlaveConnections),其数据的传输格式是高位(MSB)在前,低位(LSB)在后。
主MCU和一个从MCU的连接也可以一个主MCU与多个从MCU进行连接形成一个主机多个从机的系统;还可以多个MCU互连构成多主机系统;另外也可以一个MCU挂接多个从属外设。
但是,SPI系统最常见的应用是利用一个MCU作为主机,其他处于从机地位,这样,主机的程序启动并控制数据的传送和流向,在主机的控制下,从属设备从主机读取数据或向主机发送数据。
至于传送速度、何时数据移入移出、一次移动完成是否中断、如何定义主机从机等问题,可通过对寄存器编程来解决,随后会阐述这些问题。
3.SPI模块的时序
SPI的数据传输是在时钟信号SCK(同步信号)的控制下完成的。
数据传输过程涉及时钟相位与时钟极性两个概念。
所谓时钟极性是指时钟信号在空闲时是高电平还是低电平,所谓时钟相位是指接收方从数据线上取数的时刻是在时钟信号SCK的上升沿还是在下降沿,这样组合起来就有四种情形。
以下讲解使用CPHA表示时钟相位,CPOL表示时钟极性。
四种可能情况分别如图8-2、图8-3、图8-4和图8-5所示。
从时序图上可以看出,CPOL为1或0时,时钟信号SCK的出现正好是反相关系,CPHA用来选择两种不同的定时协议中的一种。
主机和从机必须使用同样的时序模式,才能正常通信。
总体要求是:
确保发送数据在一周期开始的时刻上线,接收方在1/2周期的时刻从线上取数,这样是最稳定的通信方式。
如图8-2、图8-3所示,当CPHA=0时,MISO/MOSI引脚上输出的MSB位/LSB位在第一个SCK跳变沿前至少半个时钟周期就已经上线了,即一拉低就可以上线了,而在第一个跳变沿,锁存传送的数据位,第二个跳变沿,将该位移入移位寄存器。
之后,继续下一个数据位传送,依次进行。
XFRW=0时,SCK线共有16个跳变沿,完成8位(一个字节)传送;XFRW=1,SCK线共有32个跳变沿时,完成16位(一个字)传送。
在奇数个跳变沿时,锁存数据位,偶数个跳变沿时,移入移位寄存器,最后一位移入时才将数据转入数据寄存器。
主机的菇引脚要么为输出高电平口,要么为普通的输出口。
主机使能选择从机的引脚和从机的引脚在每两个传送数据之间至少有半个时钟周期是高电平。
空闲区一时钟眺变沿计数
图8-2CPHA=0时8位(XFRW=0)数据/时钟时序图
图8-3CPHA=0时16位(XFRW=1)数据/时钟时序图
如图8-4和图8-5所示,当CPHA=1时,第一个SCK跳变沿是启动数据开始传送的标志,该跳变沿在空闲结束后延迟半个时钟周期出现;在第二个跳变沿,锁存传送的MISO/MOSI引脚上输出的MSB位/LSB位数据位;在第三个跳变沿,将该位移入移位寄存器。
之后,继续下一个数据位传送,依次进行。
XFRW=0时,SCK线共有16个跳变沿,完成8位(一个字节)传送;XFRW=1时,SCK线共有32个跳变沿时,完成16位(一个字)传送。
在偶数个跳变沿时,锁存数据位;在奇数个跳变沿时,移入移位寄存器,最后一位移入时才将数据转入数据寄存器。
主机的引脚要么为输出高电平口,要么为普通的输出口。
CPHA=1这种传送方式,在连续传送时,薛引脚可以一直保持低电平,没有高电平。
图8-4CPHA=1时8位(XFRW=0)数据/时钟时序图
图8-5CPHA=1时16位(XFRW=1)数据/时钟时序图
注意:
SPI主设备的时钟极性和时钟相位选择依据从设备的时钟极性和时钟相位,因此在配置SPI接口时钟时,必须先了解从设备的时钟要求。
从设备何时接收/发送数据,是第一个时钟跳变沿还是第二个时钟跳变沿,是在时钟的上升沿还是下降沿?
由于主设备的接收引脚与从设备的发送引脚相连接,主设备的发送引脚与从设备的接收引脚相连接,即从设备接收的数据是主设备的发送引脚发出的,主设备接收的数据是从设备发送引脚发出的,因此主设备接收数据的极性跟从设备接收数据的极性相反,跟从设备发送数据的极性相同。
举例说明:
如果某从设备在时钟的上升沿输入(即接收)数据,在下降沿输出(即发送)数据。
那么,主机的SPI时钟配置应为在时钟的上升沿输出数据,下降沿输入数据。
但是主机和从机时序的极性和相位应该配置为一样,只是主机和从机的接收和发送时序会相差半个周期。
4.模拟SPI
对于不带SPI串行总线接口的MCU来说,可以使用软件来模拟SPI的操作。
举例说明,我们可以使用三个普通I/O口,分别定义为pin_SCK、pin_MISO、pin_MOSI,用来模拟SPI器件的SCK、MISO、MOSI。
对于不同碎串行接口外围芯片,它们的时钟时序可能有所不同。
我们假设某SPI外围芯片在SCK的上升沿输入数据和在下降沿输出数据,则我们初始化pin_SCK=1,在MCU正常工作后,置pin_SCK=0。
这样,MCU在输出1位SCK时钟的同时,SPI外围芯片串行左运一位,从而输出1位数据至MCU的pin_MISO线。
然后置SCK为1,则MCU的pin_MOSI线输出1位数据(先高位,隹低位)到SPI外围芯片。
至此,模拟1位数据输入/输出便完成了。
此后再置SCK=0,模拟下1位数据的输入/输出,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。
对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应初始化pin_SCK=0,在MCU正常工作后,置SCK=1,使SPI器件输出1位数据(MCU备收1位数据),之后再置SCK=1,使SPI外围芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。
8.1.2K60的SPI模块概要与编程要点
1.SPI模块概述
图8-6为K60的SPI模块结构框图,K60的SPI模块主要特性如下。
图8-6K60的SPI模块结构框图
(1)全双工,四线同步传输。
(2)支持主机与从机模式,主机模式支持最高达25Mbps的传输速率,从模式支持最高达12.5Mbps的传输速率。
(3)缓冲的发送操作使用TXFIFO,接收操作使用RXFIFO,深度可达4。
(4)TX和RXFIFO能被独立关闭,用于SPI序列的低延时更新,TX和RXFIFO的可视化更便于调试。
(5)基于帧的可编程传输特性。
(6)根据SPI实例和封装,最多支持6个外设芯片,使用外部分路器可扩展到64个。
(7)当数据増加到发送FIFO和从接收FIFO移除数据时,可使用DMA。
(8)可以产生多个类型的中断。
(9)具有低功耗模式。
表8-1列出了一些引脚,可以根据需要进行相应的连接。
表8-1SPI引脚描述
引脚
描述
IO
PCS0/
主机模式:
外设芯片选择0输出;从机模式:
从机选择输出
I/O
PCS[3:
1]
主机模式:
外设芯片选择1~3;从机模式:
无用
O
PCS4
主机模式:
外设芯片选择4;从机模式:
无用
O
PCS5/
主机模式:
外设芯片选择5或闪频;从机模式:
无用
O
SIN
串行数据输入
I
SOUT
串行数据输出
O
SCK
主机模式:
串行时钟(输出);从机模式:
串行时钟(输入)
O
2.SPI模块寄存器
K60的SPI模块共有3组通道,分別是SPI0、SPI1和SPI2。
每组SPI模块具有18个相关寄存器。
本节具体介绍其中的控制寄存器以及状态寄存器。
1)DSPI配置寄存器(SPIx_MCR)
SPIx_MCR包含多个DSPI控制位,用来配置DSPI运行参数。
其中,无论DSPI模块是处于运行状态还是非运行状态,HALT位和MDIS位的值可以随意更改,但是更改的结果只有到下一帧数据到来时才能生效。
MCR其他位的值在DSPI处于运行状态时不能被更改。
其中,x取值为0、1和2,分别对应SPI0、SPI1、SPI2。
MSTR——主从模式选择。
0:
DSPI为从机模式;1:
DSPI为主机模式。
CONT_SCKE——SCK连续模式使能。
0:
SCK连续模式禁能;1:
SCK连续模式使能。
DCONF——DSPI配置。
00:
SPI模式;01:
保留;10:
保留;11:
保留。
FRZ——休眠。
当设备进人调试模式时,在下一帧数据传输边沿使能DSPI的传输停止功能。
0:
在调试模式下,不停止数据传输;
1:
在调试模式下,停止数据传输。
MTFE——格式更改使能位。
使能该位将改变下一帧数据的传输格式。
0:
禁能SPI传输格式更改;1:
使能SPI传输格式更改。
PCSSE——片选探针使能。
使能PCS[5]/PCSS探针输出信号。
0:
PCS[5]/PCSS作为片选信号PCS[5];
1:
PCS[5]/PCSS作为低功耗探针信号PCSS。
ROOE——接收FIFO溢出写覆盖使能。
在RXFIFO溢出的情况下,该位用于配置DSPI是忽略新来的数据还是覆盖已经存在的数据。
如果在RXFIFO已满的情况下又接收了一个新数据,此时将产生溢出,新到的数据将被忽略或移位到移位寄存器中。
0:
新来的数据将被忽略;
1:
新来的数据将被移位到移位寄存器中。
PCSIS[5:
0]——片选x不使能的状态选择。
在没有数据传输时,选择PCSx的电平是髙还是低。
0:
PCSx为低电平时,片选不使能;
1:
PCSx为高电平时,片选不使能。
DOZE——休眠使能。
提供外部控制的低功耗休眠模式。
0:
休眠模式无效;
1:
休眠模式有效(将停止DSPI的运行)。
MDIS——模块禁能。
停止DSPI的时钟供应,使DSPI处于软件可控的低功耗状态。
复位之后,MDIS的值默认为0.
0:
使能DSPI的时钟;1:
允许外部逻辑禁能DSPI的时钟。
DIS_TXF——禁用发送FIFO。
TXFIFO被禁用后,DSPI的数据传输将以简化的双缓冲的SPI方式运行。
该位在MDIS位被淸除的情况下才能写人。
0:
使能DSPI的时钟;1:
允许外部逻辑禁用DSPI的时钟。
DIS_RXF——禁用接收FIFO。
RXFIFO被禁用后,DSPI的数据传输将以简化的双缓冲的SPI方式运行。
该位在MDIS位被淸除的情况下才能写人。
0:
使能DSPI的时钟;1:
允许外部逻辑禁能DSPI的时钟。
CLR_TXF——淸除TXFIFO。
向该位写1淸除TXFIFO计数器的值。
读该位的值将始终返回0。
0:
不淸除TXFIFO计数器的值;1:
淸除TXFIFO计数器的值。
CLR_RXF——淸除RXFIFO。
向该位写1清除RXFIFO计数器的值。
读该位的值将始终返回0。
0:
不淸除RXFIFO计数器的值;1:
淸除RXFIFO计数器的值。
SMPL_PT——采样点选择。
在可更改传输格式的传输模式下,控制DSPI主机采样SIN信号。
只有CTAR寄存器的CPHA位为0时,该位才有效。
00:
在SCK边沿对SIN信号采样;
01:
在与SCK边沿相差1个系统时钟处,对SIN信号采样;
10:
在与SCK边沿相差2个系统时钟处,对SIN信号采样;
11:
保留。
HALT——停止。
开始或停止DSPI传输。
0:
开始传输;1:
停止传输。
2)DSPI传输计数寄存器(SPIx_TCR)
TCR寄存器中含有一个计数器,用来显示SPI传输的次数。
传输计数器用于辅助传输队列的管理。
在DSPI处于运行状态时,禁止向TCR中写入数据。
SPI_TCNT——SPI传输计数器。
记录DSPI已经进行的SPI传输次数,每当SPI帧的最后一位被发送后,SPI_TCNT的值就会加1。
预先设置SPI_TCNT的值,此后SPI_TCNT将以此值为基准计数。
当DSPI的CTCNT位被设置时,如果SP1_TCNT的值超过最大值65535,那么SPI_TCNT的值将重罝为0。
3)DSPI时钟与传输特性寄存器(主机模式)(SPIx_CTARn)
DBR——双倍波特率,使有效的SCK时钟频率加倍,该位只有在主机模式下设置才有效。
0:
SCK不加倍;1:
SCK加倍。
当该位被置位时,SCK的占空比与CPHA、PBR的配置有关,它们的关系如表13-7所列。
表SPI的DBR和PBR设置
FMSZ——数据帧大小。
每一帧数据的大小等于FMSZ的值加1,且FMSZ的最小值为3。
CPOL——SCK时钟极性。
选择SCK无效状态时的电平高低,该位在主机或从机模式下都能被分别设置。
0:
SCK无效状态为低电平;1:
SCK无效状态为高电平。
CPHA——SCK时钟相位。
选择数据在SCK的哪个边沿改变以及在哪个边沿采集数据。
0:
在SCK的第一个边沿采样数据,在下一个边沿改变数据;
1:
在SCK的第一个边沿改变数据,在下一个边沿采样数据。
LSBFE——LSB优先。
配置传输的数据是低字节先传递(LSB)还是髙字节先传递(MSB)。
0:
MSB优先;1:
LSB优先。
PCSSCK——PCS与SCK延时预分频器。
设置从SCK的第一个边沿起到PCS有效之间的延时预分频值。
00:
PCS到SCK的预分频值为1;01:
PCS到SCK的预分频值为3;
10:
PCS到SCK的预分频值为5;11:
PCS到SCK的预分频值为7。
PASC—SCK后延时预分频器。
设置从PCS无效开始,到SCK最后一个边沿之间的延时预分频值。
00:
传输后延时的预分频值为1;01:
传输后延时的预分频值为3;
10:
传输后延时的预分频值为5;11:
传输后延时的预分频值为7。
PDT——传输后延时预分频器。
设置上一帧数据PCS无效到下一帧数据PCS有效之间的预分频值。
00:
传输后延时的预分频值为1;01:
传输后延时的预分频值为3;
10:
传输后延时的预分频值为5;11:
传输后延时的预分频值为7。
PBR—一波特率预分频器。
选择合适的波特率预分频值,波特率为SCK的频率,该位只有在主机模式下才有效。
00:
波特率预分频值为1;01:
波特率预分频值为3;
10:
波特率预分频值为5;11:
波特率预分频值为7。
CSSCK——PCS到SCK延时分频器。
PCS到SCK的延时是指PCS有效到SCK的第一个边沿之间的延时时间,为系统时钟的整数倍,可以通过下面的公式来计算:
延时分频器的值如表13-8所列。
表SPI的延时分频
ASC——SCK后延时分频器。
设置从PCS无效开始,到SCK最后一个边沿之间的延时分频值。
它的值可通过下面的公式计算:
DT——传输后延时分频器。
设罝上一帧数据PCS无效到下一帧数据PCS有效之间的分频值。
它的值可通过下面的公式计算:
BR——波特率分频器。
选择波特率的分频值,该分频值的计算公式如下:
波特率的分频值如表所示。
表SPI的波特率分频值
3.SPI编程基本方法
在进行SPI编程时,首先必须进行SPI系统初始化。
SPI的初始化,主要是对SPI模块配置寄存器SPIx_MCR、SPI时钟与传输属性寄存器SPIx_CTARn进行设置,定义SPI工作模式、时钟的空闲电平及相位、允许SPI等,并根据传送速度计算波特率;其次定义主机发送操作的功能函数;再次定义从机接收操作的功能函数。
详细编程方法如下。
1)SPI初始化
对SPI进行初始化,一般有以下几个步骤。
(1)将有SPI功能的引脚复用为SPI功能。
(2)设置SPI时钟与传输属性寄存器,定义SPI总线波特率、传输相位、极性。
(3)设置SPI控制寄存器,选择主机/从机模式。
(4)设置SPI状态寄存器,使能传输队列FIFO满标志位。
(5)设置SPI中断请求选择及使能寄存器,禁止中断。
2)主机发送一个字节
(1)设置SPI控制寄存器为主机模式,将HALT位清0,开始传输。
(2)将所要发送数据存放到发送队列寄存器中,注意时钟与传输属性选择位的配置。
(3)将SPI控制寄存器HALT位置1,结束传输。
3)从机接收一个字节
(1)设置SPI控制寄存器为从机模式,将HALT位清0,开始接收。
(2)当接收队列溢出标志被置位时,将接收数据存放到接收队列寄存器中。
(3)将SPI控制寄存器HALT位置1,结束传输。
8.1.3SPI驱动构件设计
SPI具有初始化、接收和发送三种基本操作。
按照构件的思想,可将它们封装成几个独立的功能函数,初始化函数完成对SPI模块的工作属性的设定,接收和发送功能函数则完成实际的通信任务。
对SPI模块进行编程,实际上已经涉及对硬件底层寄存器的直接操作,因此,可将初始化、接收和发送三种基本操作所对应的功能函数共同放置在命名为hw_spi.c的文件中,并按照相对严格的构件设计原则对其进行封装,同时配以命名为hw_spi.h的头文件,用来定义模块的基本信息和对外接口。
具体程序如下。
1.SPI构件头文件(hw_spi.h)
2.SPI程序文件
3.SPI中断文件
8.1.4SPI驱动构件测试实例
本节应用上节给出的SPI构件,以两个相同的K60MCU为例,分别将其设计为主机模式与从机模式进行两个MCU之间的SPI通信,SPI测试功能分两个主要部分,由SPI0通道(作为主机)向SPI1通道(作为从机)发送数据。
8.2I2C模块的驱动构件设计
8.2.1I2C基础知识
1.I2C总线的历史概况与特点
I2C总线主要用于同一电路板内各集成电路模块(Inter-Integrated,IC)之间的连接。
I2C采用双向二线制串行数据传输方式,支持所有IC制造工艺,简化IC间的通信连接。
I2C是Philips公司于20世纪80年代初提出的,其后Philips和其他厂商提供了种类丰富的I2C兼容芯片。
目前I2C总线标准已经成为世界性的工业标准。
1)I2C总线标准的历史概况
从飞利浦公司提出I2C总线标准到现在,I2C已经发展了二十多年。
1992年Philips首次发布I2C总线规范Version1.0,并取得专利。
1998年Philips发布I2C总线规范Version2.0,至此标准模式和快速模式的I2C总线已经获得了广泛应用,标准模式传输速率为100kbps,快速模式传输速率为400kbps。
同时,I2C总线也由7位寻址发展到10位寻址,满足了更大寻址空间的需求。
随着数据传输速率和应用功能的迅速增加,2001年Philips又发布了I2C总线规范Version2.1,完善和扩展了I2C总线的功能,并提出了传输速率可达3.4Mbps的高速模式,这使得I2C总线能够支持现有及将来的高速串行传输,如EEPR0M和Flash存储器等。
目前I2C总线已经被大多数的芯片厂家所采用,较为著名的有STMicroelectronics、TexasInstruments、Xicor、Intel、Maxim、Atmel、AnalogDevices和InfineonTech
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第8章 SPI I2C与I2S I2C I2S