串行外设接口(SPI)总线是以全双工模式工作的同步串行数据通信总线。可以使用MSSP 外设实现SPI主、从通信。本帖介绍SPI主模式。
MCC界面:
对照数据手册上的SPI信号时序图,理解各个设定的参数对SPI通信的影响。
时钟信号SCK
SPI通信时由SPI主机提供时钟。MCC设置上,先选择时钟源,再填入分频值,MCC就会自动计算出SPI时钟频率,显示在页面上。
根据空闲时时钟的电平和SDO上数据的采样(数据有效)边沿,确定了四种时钟模式:
- 空闲时为L,下降沿采样/数据有效
- 空闲时为H,上升沿采样/数据有效
- 空闲时为L,上升沿采样/数据有效
- 空闲时为H,下降沿采样/数据有效
要想正常通信,主机和从机的时钟模式需要设置相同。
数据信号SDI/SDO
SPI物理上为全双工接口,有单独的输入SDI和输出SDO引脚。信号要交叉相连,即主机的SDI/SDO分别与从机的SDO和SDI相连。这样才能形成数据移位的环路。
SDO时序需要与选定的时钟模式一致,由外设模块自动保证。
主机SDI的采样时刻,可以选择在数据中间采样(与SCK采样边沿相同),可以选择在数据末端采样。
从机选择信号
对于SPI主机,需要采用IO口来控制从机的选通(输出低有效)。
可以容易实现单主机多从机的通信。多从机的方式,有普通的多从机并联方式,也可以菊花链连接。
MCC代码
初始化
void SPI1_Initialize(void);
发送1字节数据,返回值为回读数据。
uint8_t SPI1_Exchange8bit(uint8_t data);
发送数据块,返回值为实际发送数据长度
uint8_t SPI1_Exchange8bitBuffer(uint8_t *dataIn, uint8_t bufLen, uint8_t *dataOut);
判断缓冲区中是否接收新数据,尚未读取
bool SPI1_IsBufferFull(void);
判断是否有写冲突。在当前字节发送结束前,不能向缓冲寄存器写入新的数据,否则触发写冲突。
bool SPI1_HasWriteCollisionOccured(void);
清冲突标志。
void SPI1_ClearWriteCollisionStatus(void);
|