【SPI】STM32 SPI 双机通信,SPI从机模式使用

这篇具有很好参考价值的文章主要介绍了【SPI】STM32 SPI 双机通信,SPI从机模式使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近要用到STM32的SPI从机模式,从其他板子读SPI数据过来,踩了2天坑,记录一下过程。

(因为hal库提供了三种函数,我调试的过程是阻塞、中断、DMA依次来调试学习的,这份代码为使用DMA方式的代码。

软件:keil5、STM32CubeMX

硬件:两块STM32F103C8T6最小系统

实现功能:两块板子进行SPI通信,一主一从,都是使用的SPI1。

代码下载github:https://github.com/wyfroom/SPI_Master_Slave_STM32(第一次编程过程中使用git管理代码)

代码下载蓝奏云:https://wwzr.lanzout.com/b04885ouf 密码:372j

强调!!!!!!!!!!!强调!!!!!!!!!!!!强调!!!!!!!!!!!!!

如果你SPI通了,但是莫名其妙数据乱码、能发不能收等问题,啥都别干了,先把杜邦线换新,一共5根线,一根共地线,四根SPI线。

spi从机,stm32,嵌入式硬件,单片机

一、SPI主机配置

基础的工程配置,这边就不贴图了,可以看这个有详细的步骤:http://t.csdn.cn/Wpcpk

spi从机,stm32,嵌入式硬件,单片机

直接看spi的配置,主要注意以下几点:

  • SPI模式选择
  • 片选选择
  • 大端小端选择
  • 通信速率
  • 采样模式配置(CPOL、CPHA)
  • CRC选择

spi从机,stm32,嵌入式硬件,单片机

如果要用SPI中断,要勾选中断。

spi从机,stm32,嵌入式硬件,单片机

如果要用DMA,要对DMA进行配置。

spi从机,stm32,嵌入式硬件,单片机

补充:片选还是要选,不然高速传输会出问题。

spi从机,stm32,嵌入式硬件,单片机

二、SPI从机配置

从机配置仅模式选择和主机不同,其他都一样且必须一样。

spi从机,stm32,嵌入式硬件,单片机

如果使用中断,要勾选:

spi从机,stm32,嵌入式硬件,单片机

DMA配置:(和主机一样)

spi从机,stm32,嵌入式硬件,单片机

补充:片选还是要选,不然高速传输时会出问题。

spi从机,stm32,嵌入式硬件,单片机

三、双机通信

HAL库提供了三种SPI调用方式。都试了一遍,最后还是选用了DMA,高效,简洁。

//阻塞方式使用SPI
HAL_SPI_Transmit()
HAL_SPI_Receive()
HAL_SPI_TransmitReceive()
//中断方式使用SPI
HAL_SPI_Transmit_IT()
HAL_SPI_Receive_IT()
HAL_SPI_TransmitReceive_IT()
//DMA方式使用SPI
HAL_SPI_Transmit_DMA()
HAL_SPI_Receive_DMA()
HAL_SPI_TransmitReceive_DMA()

spi从机,stm32,嵌入式硬件,单片机

1 轮询+中断(低速)

主机轮询,从机中断。

这个我就不演示了,就正常流程,注意就行,在main里启动中断,在中断函数里再次启动中断。

//main里启动中断
HAL_SPI_TransmitReceive_IT(&hspi1, sendData, receiveData, 8);

//中断回调函数
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
  // 数据发送完成回调函数
	if (hspi == &hspi1)
	{
		HAL_SPI_TransmitReceive_IT(&hspi1, sendData, receiveData, 8);
	}
}

2 轮询+DMA(低速)

主机使用阻塞函数,从机使用DMA函数。(原因是我试了主从全部使用DMA的话,速度太快了,会卡死和数据传输乱码。解决啦,可以看问题一,这一部分还是演示轮询+DMA

主机:
spi从机,stm32,嵌入式硬件,单片机

从机:
spi从机,stm32,嵌入式硬件,单片机

debug测试:

spi从机,stm32,嵌入式硬件,单片机

3 DMA+DMA(高速)

之前高速使用时出现了程序卡死和数据乱码的现象。(高速使用:用阻塞函数while里不加延时、主从都用中断、主从都用DMA)

解决方法如下:

  • 1 片选要开启。我直接把两个板子的硬件片选打开,两边都使用DMA方式全双工发送读取,数据不在乱码,只是接收到的第一个数据不一定是发送的第一个数据。
  • 2 从机要比主机先启动程序。 解决上一步数据顺序不对的问题。在主机DMA程序启动前加一个延时2s。

spi从机,stm32,嵌入式硬件,单片机

spi从机,stm32,嵌入式硬件,单片机

直接Debug:(模拟实际上电,debug先点从机启动,再点主机启动)

spi从机,stm32,嵌入式硬件,单片机

4 开启CRC校验(自选)

CRC计算生成的校验值可以用于检测数据在传输或存储过程中是否发生了错误或损坏。
spi从机,stm32,嵌入式硬件,单片机

开启CRC后,使用DMA函数的话,SIZE要加一:

HAL_SPI_TransmitReceive_DMA(&hspi1, sendData, receiveData, 8+1);

spi从机,stm32,嵌入式硬件,单片机

四、遇到的问题

1 高速使用时,程序卡死,或者数据出错(已解决)

  • 主机中断模式发送,从机中断模式接收,不停的收发清空标志,数据就会乱,可能是传的太快了??想当于是全速的在收发? 非得主机用轮询的方式,间隔个1ms什么的来读取,那这SPI速度咋算的?

  • 主机DMA发,从机DMA收,直接死机,DMA中断被刷爆,while里的程序没机会执行,可以屏蔽掉DMA中断,程序不会在死机,但是,数据会乱。

    spi从机,stm32,嵌入式硬件,单片机

  • 加了CRC好像要好一点,但还是很多乱码,碰运气碰好的。这能行吗?是SPI就不是这么用的吗?还是说这事高速传输的共性问题。

  • 终于解决

    • 1 片选要开启。我直接把两个板子的硬件片选打开,两边都使用DMA方式全双工发送读取,数据不在乱码,只是接收到的第一个数据不一定是发送的第一个数据。
    • 2 从机要比主机先启动程序。 解决上一步数据顺序不对的问题。在主机DMA程序启动前加一个延时2s。
    • 3 CRC,开不开没影响。

    spi从机,stm32,嵌入式硬件,单片机

    spi从机,stm32,嵌入式硬件,单片机

    spi从机,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-580055.html

2 数据莫名其妙乱码,主机发送正常,接收乱码等

  • 杜邦线,真的会出问题的,换新,5根线,全部换新。再试试

到了这里,关于【SPI】STM32 SPI 双机通信,SPI从机模式使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32HAL库 G4 SPI 从机DMA可变长度接受数据乱码问题

    使用一个引脚当作SPI CS, 边沿触发; 在电平位0时候接受SPI数据20个字节 如果实际主机只发了小于20字节时候, 下一个帧就会错乱; 去老外找了之后,需要复位SPi RCC时钟才能复位掉SPI 下面的不行 正确的做法

    2024年02月10日
    浏览(36)
  • STM32使用SPI协议主从通信

    目录 前言 一、理论部分      SPI简介   SPI特征 SPI物理层 SPI协议层 SPI配置过程 SPI数据发送与接收过程 二、代码部分 主机代码 从机代码 这是一篇学习笔记,记录自己学习SPI通信。方便之后运用的时候回顾。参考《STM32中文参考手册》          SPI 协议是由摩托罗拉公

    2024年02月13日
    浏览(45)
  • 树莓派(主)与STM32(从)使用SPI通信(持续更新中)

    使用树莓派向 STM32 发送数据,STM32 收到数据后通过串口的方式将数据打印到电脑上,同时返回给树莓派数据。树莓派接收到数据后打印在控制台上。 SPI 的配置为 树莓派主机 STM32 从机 全双工 8 bit 传输 工作模式 0 :CPOL|CPHA = 00 MSB 优先 禁止 CRC 校验 SPI(Serial Peripheral Interfac

    2024年02月14日
    浏览(147)
  • STM32——SPI通信

    SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线 四根通信线: SCK(Serial Clock)【CLK或SCL或CK】、 MOSI(Master Output Slave Input)【DO(Data Output)】、 MISO(Master Input Slave Output)【DI(Data Input)】、 SS(Slave Select)【CS或NSS】 同步,全双工 支持总线挂载多设备

    2024年02月11日
    浏览(39)
  • 【【STM32-SPI通信协议】】

    STM32-SPI通信协议 •SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线 •四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select) •同步,全双工 •支持总线挂载多设备(一主多从) 既然是同步的,我们就会发

    2024年02月12日
    浏览(44)
  • STM32使用SPI通信时的一些常见问题及解决方法(主,从)

            最近在做一个多MCU的项目时,MCU之间的数据传输使用了SPI通信,在做从机时遇到了一些 “疑难杂症”,研究了半天,总算是把故障排除了,就又总结了一下SPI常遇到的几种问题写出来整理一下。 目录 一、SPI简介:  二、常见问题: 三、疑难杂症: Q1:使用的HAL库,

    2024年02月21日
    浏览(68)
  • 【STM32】学习笔记-SPI通信

    SPI通信(Serial Peripheral Interface)是一种同步的串行通信协议,用于在微控制器、传感器、存储器、数字信号处理器等之间进行通信。SPI通信协议需要使用4个线路进行通信:时钟线(SCLK)、主输入/主输出线(MISO)、主输出/主输入线(MOSI)和片选线(SS)。其中,SCLK由主设备提供,用于

    2024年02月09日
    浏览(45)
  • STM32开发(十)STM32F103 通信 —— SPI通信编程详解

    👈《上一篇》  🏡《主目录》  👉《下一篇》 本实验通过STM32F103 的SPI功能,实现对W25Q64JVSSIQ (Flash芯片)芯片擦除,读数据,写数据等操作。 本实验内容知识点: 1、SPI通信协议介绍 2、

    2024年02月07日
    浏览(51)
  • STM32硬件SPI通信详解-------附代码

    1.STM32内部集成了 硬件SPI收发电路 ,可以由 硬件自动执行时钟生成 、 数据收发 等功能, 减轻CPU的负担 2.可配置 8位/16位数据帧 、 高位先行/低位先行 3. 时钟频率 : fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 4.支持 多主机模型 、 主或从操作 5.可精简为 半双工/单工通信 6. 支持DMA 7. 兼

    2024年04月27日
    浏览(46)
  • 【正点原子STM32】QSPI四线SPI模式(Quad-SPI存储器、间接模式、状态轮询模式、内存映射模式、命令序列、QSPI基本使用步骤、SPI FLASH基本使用步骤)

    一、QSPI介绍 1.1、QSPI功能框图(双闪存模式禁止) 1.2、QSPI 时钟源 1.3、间接模式 1.4、内存映射模式 1.5、命令序列(间接模式 或 内存映射模式) 1.6、指令、地址、交替字节、空指令周期、数据各阶段 1.7、QSPI FLASH设置 1.8、QSPI 中断类型 二、QSPI相关寄存器介绍 三、QSPI相关

    2024年04月22日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包