打印
[PIC®/AVR®/dsPIC®产品]

使用MCC学习PIC单片机 – MSSP主同步串行端口(SPI主模式)

[复制链接]
2284|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

串行外设接口(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);





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

190

帖子

11

粉丝