易烊千玺个人网站入口,自媒体账号注册平台,品牌建设什么意思,ps软件下载电脑版要钱吗wx#xff1a;嵌入式工程师成长日记 #xff08;一#xff09;简介
四根通信线#xff1a;SCK、MOSI、MISO、SS(片选信号) 同步#xff08;同步通信是一种通信模式#xff0c;在这种模式下#xff0c;发送方和接收方在同一时刻进行数据传输。#xff09;#xff0c;全…wx嵌入式工程师成长日记 一简介
四根通信线SCK、MOSI、MISO、SS(片选信号) 同步同步通信是一种通信模式在这种模式下发送方和接收方在同一时刻进行数据传输。全双工 支持总线挂载多设备仅一主多从会有多根SS线
限制通讯速度100、400KHz
相对于I2CSPI的优缺点
①SPI协议并没有严格规定最大传输速度其取决于芯片厂商需求。
②全双工SPI硬件开销大通讯过程中经常会有资源库浪费现象。 二硬件电路 所有SPI设备的SCK、MOSI、MISO分别连在一起 SCK 时钟线完全由主机掌控 MOSI主机输出从机输入 MISO主机输入从机输出 主机另外引出多条SS控制线分别接到各从机的SS引脚 输出引脚配置为推挽输出输入引脚配置为浮空或上拉输入 SPI的输入输出引脚是固定的基本不会出现冲突因此可以使用推挽输出。但SPI仍有可能在MISO线上多个从机推挽输出造成冲突因此SPI规定从机未被选中时候的MISO引脚必须为高阻态
三移位示意图
移位寄存器随着SCK的频率触发移位会将箭头方向移出去的一位放到引脚上。在SCK频率触发的间隔主机和从机都进行数据采集获取移除位所在的引脚的电平存放到各自箭头方向连接的寄存器上。 多次后就完成了一个字节的数据交换。只收或只发的情况下只需要忽略掉发送或者接收信号即可。
四SPI时序基本单元 起始条件SS从高电平切换到低电平 终止条件SS从低电平切换到高电平 如果CPOL被清0SCK引脚在空闲状态保持低电平如果CPOL被置1SCK引脚在空闲状态保持高电平。
如果CPHA(时钟相位)位被置1SCK时钟的第二个边沿(CPOL位为0时就是下降沿CPOL位为1时就是上升沿)进行数据位的采样数据在第二个时钟边沿被锁存。
如果CPHA位被清0SCK时钟的第一边沿(CPOL位为0时就是上升沿CPOL位为1时就是下降沿)进行数据位采样数据在第一个时钟边沿被锁存。
【交换一个字节模式0】 时钟极性CPOL0空闲状态时SCK为低电平 时钟相位CPHA0SCK第一个下降沿移入数据第二个下降沿移出数据 MISO不发送数据时候为高阻态中间线只要SS不置高可以一致重复交换数据。
【交换一个字节模式1】常用、高速 CPOL0空闲状态时SCK为低电平 CPHA1SCK第一个下降沿移出数据第二个下降沿移入数据 【交换一个字节模式2】 CPOL1空闲状态时SCK为高电平 CPHA0SCK第一个上升沿移入数据第二个上升沿移出数据 【交换一个字节模式3】 CPOL1空闲状态时SCK为高电平 CPHA1SCK第一个上升沿移出数据第二个上升沿移入数据 五SPI配置代码
1.初始化
SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; //双线双向全双工SPI_InitStructure.SPI_Mode SPI_Mode_Master; //主 SPISPI_InitStructure.SPI_DataSize SPI_DataSize_8b; // SPI 发送接收 8 位帧结构SPI_InitStructure.SPI_CPOL SPI_CPOL_High;//串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge;//第二个跳变沿数据被采样SPI_InitStructure.SPI_NSS SPI_NSS_Soft; //NSS 信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_256; //预分频 256SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; //数据传输从 MSB 位开始SPI_InitStructure.SPI_CRCPolynomial 7; //CRC 值计算的多项式SPI_Init(SPI2, SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器
2.使能SPI
SPI_Cmd(SPI2, ENABLE); //使能 SPI 外设SPI2_ReadWriteByte(0xff); //启动传输主机发一个字节进行一次传输可以启动传输
3.SPI传输数据
//发送数据函数 void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) //接收数据函数 uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)
4.查看 SPI 传输状态函数
判断数据是否传输完成发送区是否为空
SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)
判断接收是否完成接收区是否空
SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)