SSP (synchronous Seril Port)同步串行端口控制器,可支持SPI、TI和Microwire协议,一条总线允许有多个从机,但某一个时刻只允许有一个主机和一个从机进行通信。多应用于EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间(而I2C多用于同一单片机不同芯片之间的短距离通信)。
SPI支持全双工通信,而I2C仅支持半双工,Uart也支持全双工通信。
SPI通信是数据交换的过程,数据通过移位寄存器进行交换。
主机发送时,将一位数据写入TxFIFO移入移位寄存器,数据通过MOSI移出主机,从机通过MOSI移入从机,从机同时会从移位寄存器中移出一位数据到主机,如果是只写操作,主机则可以忽略读取到的数据,通过Dummy = LPC_SSP1->DR假装读取进行忽略。
主机接收数据时,主机首先要发送一个指令启动从机发送,如高电平(0xFF),从机接收到后发送数据到移位寄存器中。每次接收主机都需要发送数据触发从机发送数据。
SPI硬件有4根信号线:SCK(串行时钟线)、CS(片选信号)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)
其中,CS通过拉低来选择从机设备,数据在SCK时钟的边沿跳变时进行数据采样和数据的读取和发送。具体规则由CPOL和CPHA控制。
CPOL:1——空闲状态时SCK为高电平 0——空闲状态时SCK为低电平
CPHA:1——数据在第一个跳变沿采样 0——数据在第二个跳变沿采样
故共有4种组合:
CPOL=0,CPHA=0,数据在第一个上升沿时采样,第一个下降沿读取/发送
CPOL=0,CPHA=1,数据在下降沿时采样,上升沿读取/发送
CPOL=1,CPHA=0,数据在第一个下降沿时采样,第一个上升沿读取/发送
CPOL=1,CPHA=1,数据在上升沿采样,下降沿读取/发送
SPI中断:
ROR ---- Rx FIFO状态为满时另外一帧被完全接收了,写入ICR清除中断
RT ---- Rx FIFO不为空且超过超时周期没有被读取,写入ICR清除中断
RX ---- Rx FIFO为至少半满状态,读取正确的FIFO可清除中断
TX ---- Tx FIFO为至少半空状态,写入正确的FIFO可清除中断
SPI Clock:位频率=PCLK/(CPSDVSR × [SCR+1])
在这章接触到一个新的函数和变量——Dummy
Dummy函数是一个空函数,函数体内没有语句,常常用于后期扩充功能,执行Dummy();时,什么工作也不做;
同样的,Dummy变量也有相似的意思,既是没有意义的一个变量或者空变量。在SPI的配置过程中,使能SPI前,可以将Rx FIFO中的数据清除干净,就可以采用Dummy = LPC_SSPx->DR的方式清空。