SPI的基本概念
串行外设接口SPI是原摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器和外围扩展芯片之间的串行连接,目前已发展为一种工业标准。
目前各半导体公司推出大量带有SPI接口的芯片,为用户的外围扩展提供灵活和廉价的选择。
SPI一般使用4条线:串行时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和从机选择线SS。
主机与从机:一个SPI系统,由一个主机和一个或多个从机构成,主机启动一个与从机的同步通讯,从而完成数据的交换。提供SPI串行时钟线的SPI设备称为SPI主机或主设备,其他设备则称为SPI从机或从设备。
主出从入引脚MOSI与主入从出引脚MISO:
主出从入引脚MOSI即主机输出、从机输入数据线。
主入从出引脚MISO即主机输入、从机输出数据线。
SPI串行时钟引脚SCK:
控制主机与从机之间的数据传输。串行时钟信号由主机的内部总线时钟分频获得,主机的SCK引脚输出给从机的SCK引脚,控制整个数据的传输速度。
时钟极性与时钟相位:
时钟极性表示时钟信号在空闲时是高电平还是低电平。
时钟相位表示时钟信号SCK的第一个边沿出现在第一位数据传输周期的开始位置还是中央位置。
从机选择引脚SS:
一些芯片带有从机选择引脚SS,也称为片选引脚。若一个MCU的SPI工作于主机方式,则该MCU的引脚设为高电平。若一个MCU的SPI工作于从机方式,当SS=0时表示主机选中了该从机,反之则未选中该从机。
SPI的数据传输原理
一个SPI的基本连接图
从主机CPU发出启动传输信号开始,将要传输的信号装入8位移位寄存器,并同时产生8位时钟信号依次从SCK引脚送出。在SCK信号的控制下,主机中8位移位寄存器中的数据一次从MOSI引脚送出,到从机的MOSI引脚后送入他的8位移位寄存器;在此过程中,从机的数据也可通过MISO引脚传送到主机中。
SPI的时序
SPI的数据传输是在时钟信号SCK的控制下完成的,该过程涉及时钟极性和时钟相位,主机和从机必须使用一致的时钟极性和相位才能正常通信,
对时钟极性于时钟相位的设置总体要求:
确保发生数据在一周期开始的时刻上线,接收方在½周期的时刻从线上取数,这样是最稳定的通信方式。
对发送方编程必须明确要求:
接收方要求的时钟空闲电平是高电平还是低电平;接收方在时钟的上升沿取数还是下降沿取数。
时钟极性由CPOL控制,时钟相位由CPHA来控制。二者结合起来共有四种可能取值情况。
一、当CPOL=0,CPHA=0时
设置CPOL=0,表征空闲电平位低电平,然后设置CPHA=0,表征第一位数据提前半个时钟周期上线,这样设置保证了逐句与从机之间采用同样的时钟极性和时钟相位,才能正常通信。
二、当CPOL=0,CPHA=1时
三、当CPOL=1,CPHA=0时
四、当CPOL=1,CPHA=1时
SPI驱动构件及使用方法
初始化函数,发送一个字节函数,发送n个字节函数,接收一个字节函数,接收n个字节函数,关接收中断函数,开接收中断函数
SPI构件使用方法:
第一步:在SPI驱动构件头文件中宏定义引脚组
第二步:在主函数main中,初始化SPI模块,具体的参数包括SPI所用的口号,波特率,时钟极性,时钟相位;
第三步:开SPI1的接收中断
第四步:在主循环中,通过SPI发送一个字节函数,把一个字节数据通过主机发送出去,然后把数据加一
第五步:在中断函数服务例程中,通过SPI1:接收中断服务程序,接收主机发送过来的一个字节数据,然后就可以通过串口把接收到的数据发送到PC机。
即可实现主机从机通信,
实现简单的SPI数据传输主要涉及的寄存器:
控制寄存器(SPI0_C1):用于设置SPI中断使能,SPI使能,主/从模式的选择,时钟极性和时钟相位的配置
控制寄存器(SPII0_C2):用于硬件匹配中断功能使能和主模式故障功能使能的设置
波特率寄存器(SPI0_BR):用于为一个主机设定预定标器和位速率分频因子
状态寄存器(SPI0_S):用于判断SPI接收和发送缓冲区是否已满
数据寄存器(SPI0_D):主要完成数据的传输。读该寄存器返回接收寄存器中的数据,写该寄存器,把数据写入发送寄存器。