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

STM32 SPI通信协议2——SPI功能选项设置

在上篇文章中,已经对STM32的四个引脚进行了GPIO的基本配置,现在开始SPI外设进行配置。

SPI_InitTypeDef SPI_InitStructure; 
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
SPI_InitStructure.SPI_CRCPolynomial = 7; 
SPI_Init(SPI1, &SPI_InitStructure);

SPI_Direction:设置SPI单向或者双向的数据模式。参数可取值如下图:

SPI_Direction的参数值
SPI_Mode描述
SPI_Direction_2Lines_FullDuplex

SPI设置为双线双向全双工

SPI_Direction_2Lines_RxOnlySPI设置为双线单向接收
SPI_Direction_1Line_RxSPI设置为单线双向接收
SPI_Direction_1Line_TxSPI设置为单线双向发送

        建议写双线双向全双工,没用到也无所谓,以后要是用到了,也不用去改。

 SPI_Mode:设置SPI的工作模式(这个SPI_Mode和上面的只是名字一样,其他完全不同)。

SPI_Mode的参数值
SPI_Mode描述
SPI_Mode_Master设置为主SPI
SPI_Mode_Slave设置为从SPI

SPI_DataSize:设置SPI的数据大小。

SPI_DataSize的参数值
SPI_DataSize描述
SPI_DataSize_16bSPI发送接收16位帧结构
SPI_DataSize_8bSPI发送接收8位帧结构

        看一下连接什么样的外设,在对应的手册里可以找到是多少帧的。 

SPI_CPOL:选择串行时钟的稳态。

SPI_CPOL的参数值
SPI_CPOL描述
SPI_CPOL_High时钟悬空高
SPI_CPOL_Low时钟悬空低

         看外设空闲的时候是低电平还是高电平。

 SPI_CPHA:设置为捕获的时钟活动沿。

SPI_CPHA的参数值
SPI_CPHA描述
SPI_CPHA_2Edge数据捕获于第二个时钟沿
SPI_CPHA_1Edge数据捕获于第一个时钟沿

         CPHA已经在上一章已经详细介绍过了。

SPI_NSS:指定NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理。

SPI_NSS的参数值
SPI_NSS描述
SPI_NSS_HardNSS由外部管脚管理
SPI_NSS_Soft内部NSS信号有SSI位控制

SPI_BaudRatePrescaler:设置波特率预分配的值(用于设置发送和接收的SCK时钟)。

SPI_BaudRatePrescaler的参数值
SPI_NSS描述
SPI_BaudRatePrescaler2波特率预分频值为2
SPI_BaudRatePrescaler4波特率预分频值为4
SPI_BaudRatePrescaler8波特率预分频值为8
SPI_BaudRatePrescaler16波特率预分频值为16
SPI_BaudRatePrescaler32波特率预分频值为32
SPI_BaudRatePrescaler64波特率预分频值为64
SPI_BaudRatePrescaler128波特率预分频值为128
SPI_BaudRatePrescaler256波特率预分频值为256

         凡是串行通信就肯定有波特率,因为波特率决定了串行通信的速度,而串行通信的速度越快stm32接收的速度也就越快。如果你想让32工作的快一点,采集的频率快一点,那么可以让分频系数小一些,波特率就会变大。

        分频系数是指UART模块将时钟频率进行分频后得到的用于传输数据的实际时钟频率,其计算公式为:分频系数 = UART时钟频率 / (波特率 x 16)。例如,当UART时钟频率为16MHz,波特率为9600时,分频系数为104.1667。

 SPI_FirstBit:设置数据传输从MSB开始,还是从LSB开始。

SPI_FirstBit的参数值
SPI_FirstBit描述
SPI_FirstBit_MSB数据传输从MSB位开始
SPI_FirstBit_LSB数据传输从LSB位开始

        MSB:数据的高位。

        LSB:数据的低位。

        外设的手册里面也有要求。

SPI_CRCPolynomial:定义了用于CRC值计算的多项式。

以下是关于SPI通信中CRC校验的计算方法:

  1. 首先,我们需要准备好要发送的数据,假设为data。

  2. 然后,我们需要定义一个生成多项式,假设为0x1021。

  3. 接下来,我们需要将data和一个16位的初始值0xFFFF进行异或运算,得到一个新的16位值。

  4. 然后,我们需要将这个16位值的最高位(即第15位)设置为0,然后将这个16位值左移一位。

  5. 如果这个16位值的最高位为1,则需要将其与生成多项式进行异或运算。

  6. 重复步骤4和5,直到左移了16次,此时得到的16位值就是CRC校验码。

下面是一个Python实现的例子:

def spi_crc(data):crc = 0xFFFFpoly = 0x1021for byte in data:crc ^= (byte << 8)for _ in range(8):if crc & 0x8000:crc = (crc << 1) ^ polyelse:crc <<= 1return crc & 0xFFFF

其中,data为要发送的数据,返回值为CRC校验码。

SPI的配置基本上全都看外设的要求是什么,照搬就可以了。 

最后使能一下SPI就可以了

SPI_Cmd(SPI1,ENABLE);

相关文章:

  • ChatGPT和文心一言哪个好用?
  • vscode mysql cmake windows 常见问题和推荐文章
  • Jsqlparser简单学习
  • HCIA——14题目-2章选择、解答
  • 【目标跟踪】跨相机如何匹配像素
  • 【重点】【DP】300. 最长递增子序列
  • 链表练习 Leetcode234.回文链表
  • 通过浏览器判断是否安装APP
  • MacBook安装Storm与启动
  • Jenkins-Maven Git
  • 2023极客大挑战web小记
  • Android Traceview 定位卡顿问题
  • Angular系列教程之zone.js和NgZone
  • 在 SpringBoot中的WebSocket使用介绍
  • Nginx+Tomcat负载均衡、动静分离以及Nginx负载均衡和四层代理
  • Android Studio:GIT提交项目到远程仓库
  • Docker容器管理
  • Docker下部署自己的LNMP工作环境
  • go语言学习初探(一)
  • HTML5新特性总结
  • js算法-归并排序(merge_sort)
  • MQ框架的比较
  • mysql外键的使用
  • python 装饰器(一)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 前端性能优化——回流与重绘
  • 使用docker-compose进行多节点部署
  • 使用parted解决大于2T的磁盘分区
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (day6) 319. 灯泡开关
  • (done) 两个矩阵 “相似” 是什么意思?
  • (solr系列:一)使用tomcat部署solr服务
  • (补)B+树一些思想
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net FrameWork总结
  • .NET MVC 验证码
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net开发引用程序集提示没有强名称的解决办法
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .net专家(张羿专栏)
  • @Bean有哪些属性
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [.net]官方水晶报表的使用以演示下载
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器