当前位置: 首页 > news >正文

江科大STM32入门——SPI通信笔记总结

wx:嵌入式工程师成长日记

(一)简介

  • 四根通信线:SCK、MOSI、MISO、SS(片选信号)
  • 同步(同步通信是一种通信模式,在这种模式下,发送方和接收方在同一时刻进行数据传输。),全双工

  • 支持总线挂载多设备(仅一主多从),会有多根SS线

限制通讯速度100、400KHz


相对于I2C,SPI的优缺点:

①SPI协议并没有严格规定最大传输速度,其取决于芯片厂商需求。

②全双工,SPI硬件开销大,通讯过程中经常会有资源库浪费现象。

图片

(二)硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起

    • SCK:

      时钟线完全由主机掌控

    • MOSI:主机输出,从机输入

    • MISO:主机输入,从机输出

  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚

  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

图片

SPI的输入输出引脚是固定的,基本不会出现冲突,因此可以使用推挽输出。但SPI仍有可能在MISO线上多个从机推挽输出造成冲突,因此SPI规定从机未被选中时候的MISO引脚必须为高阻态

(三)移位示意图

移位寄存器随着SCK的频率触发移位,会将箭头方向移出去的一位放到引脚上。在SCK频率触发的间隔,主机和从机都进行数据采集,获取移除位所在的引脚的电平存放到各自箭头方向连接的寄存器上。

图片

图片

多次后就完成了一个字节的数据交换。只收或只发的情况下,只需要忽略掉发送或者接收信号即可。

(四)SPI时序基本单元

  • 起始条件:SS从高电平切换到低电平

  • 终止条件:SS从低电平切换到高电平

图片

如果CPOL被清'0',SCK引脚在空闲状态保持低电平;如果CPOL被置'1',SCK引脚在空闲状态保持高电平。

如果CPHA(时钟相位)位被置'1',SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为'1'时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。

如果CPHA位被清'0',SCK时钟的第一边沿(CPOL位为'0'时就是上升沿,CPOL位为'1'时就是下降沿)进行数据位采样,数据在第一个时钟边沿被锁存。 

【交换一个字节(模式0)】

  • (时钟极性)CPOL=0:空闲状态时,SCK为低电平

  • (时钟相位)CPHA=0:SCK第一个下降沿移入数据,第二个下降沿移出数据

图片

MISO不发送数据时候为高阻态(中间线),只要SS不置高,可以一致重复交换数据。

【交换一个字节(模式1)】(常用、高速)

  • CPOL=0:空闲状态时,SCK为低电平

  • CPHA=1:SCK第一个下降沿移出数据,第二个下降沿移入数据

图片

【交换一个字节(模式2)】

  • CPOL=1:空闲状态时,SCK为高电平

  • CPHA=0:SCK第一个上升沿移入数据,第二个上升沿移出数据

图片

【交换一个字节(模式3)】

  • CPOL=1:空闲状态时,SCK为高电平

  • CPHA=1:SCK第一个上升沿移出数据,第二个上升沿移入数据

图片

(五)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) 
http://www.lryc.cn/news/517703.html

相关文章:

  • 微信小程序map组件所有markers展示在视野范围内
  • 深度解析 tanh ⁡ tanh 激活函数
  • 嵌入式入门Day38
  • 探索Rancher服务发现机制:容器世界的“导航仪”
  • 【ROS2】Qt事件循环和ROS2订阅机制一起使用有什么注意事项?
  • donet (MVC)webAPI 的接受json 的操作
  • Qt 界面外观
  • aws(学习笔记第二十二课) 复杂的lambda应用程序(python zip打包)
  • HTML课堂之搜索工具箱/讲师duluo
  • 当歌 - RSS 订阅分发平台开发
  • 学习threejs,导入wrl格式的模型
  • 使用GitLab+Jenkins搭建CICD执行环境
  • 使用vue-pdf预览pdf和解决pdf电子签章显示问题
  • 【Rust自学】11.3. 自定义错误信息
  • 05、Docker学习,常用安装:Mysql、Redis、Nginx、Nacos
  • RabbitMQ高级篇之MQ可靠性 数据持久化
  • leetcode 2274. 不含特殊楼层的最大连续楼层数 中等
  • Tauri教程-基础篇-第二节 Tauri的核心概念上篇
  • 大风车excel:怎么把题库导入excel?题库导入excel
  • Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息
  • 电脑硬盘系统迁移及问题处理
  • 网关 + Nacos配置管理
  • 《Spring Framework实战》6:核心技术 4.1.IoC 容器
  • ModuleNotFoundError: No module named ‘audioop‘
  • STM32-笔记38-I2C-oled实验
  • 人大金仓实现主键自增.
  • h264之多视点mvc编码及解码过程(JMVC平台举例)
  • 小程序学习08—— 系统参数获取和navBar组件样式动态设置
  • 数据库环境安装(day1)
  • 网络安全-web渗透环境搭建-BWAPP(基础篇)