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

文章介绍了在STM32上使用SPI从机模式进行通信的配置步骤,包括主机和从机的配置,以及不同通信方式如轮询、中断和DMA的使用。作者遇到了高速通信时的数据错误和程序卡死问题,通过开启硬件片选和调整启动顺序解决了问题。此外,还提到了杜邦线可能导致的数据乱码问题。
摘要由CSDN通过智能技术生成

最近要用到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线。

image-20230628105858537

一、SPI主机配置

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

image-20230627210413145

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

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

image-20230627211841705

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

image-20230627213345312

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

image-20230627212414628

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

image-20230628091705132

二、SPI从机配置

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

image-20230627213119402

如果使用中断,要勾选:

image-2023062721311940123

DMA配置:(和主机一样)

image-20230627213520055

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

image-20230628091658095

三、双机通信

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()

image-20230627215942390

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

主机:
image-20230628094249979

从机:
image-20230628094315973

debug测试:

image-20230628094523589

3 DMA+DMA(高速)

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

解决方法如下:

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

image-20230628092722959

image-20230628092806945

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

image-20230628093140796

4 开启CRC校验(自选)

CRC计算生成的校验值可以用于检测数据在传输或存储过程中是否发生了错误或损坏。
image-20230627220307966

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

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

image-20230627220412238

四、遇到的问题

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

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

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

    image-20230627215523991

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

  • 终于解决

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

    image-20230628091658095

    image-20230628091705132

    image-20230628091830064

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

  • 杜邦线,真的会出问题的,换新,5根线,全部换新。再试试
### 回答1: STM32F4系列芯片作为常用的微处理器之一,其SPI接口作为一种串行外设接口拥有广泛的应用场景。在双机通信方面,STM32F4的SPI接口可以用于同步传输数据,并且具有高可靠性、高效率等优点,因此被广泛应用于嵌入式系统、工业自动化、医疗设备等领域。 SPI接口是单主模式或多主模式的集成电路外围设备的通信协议,可以使用单线、双线或四线方式进行通信,其中四线方式通信具有传输速率快、可靠性高的特点。在STM32F4芯片中,SPI管理器包含两个SPI接口,在实现双机通信时通常采用其中一个作为主机,另一个作为从机,通过访问它们之间共享的数据缓存区,可以实现双向数据传输。 在STM32F4的SPI双机通信中,主机负责发起数据传输请求和接收从机的应答信息;而从机则负责接收主机的数据传输请求,并传送数据给主机。通常情况下,主机和从机之间的数据传输可以采用DMA方式进行,这样可以有效减少CPU的负载,提高系统的效率。 在使用STM32F4的SPI双机通信时,需要注意以下几点:首先,需要根据实际通信需求选择SPI接口的通信模式和数据格式;其次,需要配置SPI接口的时钟频率和时钟相位;最后,根据数据传输的类型选择合适的收发缓冲区、中断和DMA处理方式,以保证通信的可靠性和效率。 通过合理的配置和使用STM32F4芯片的SPI接口可以实现高效可靠的双机通信,为各种嵌入式系统提供核心支持。 ### 回答2: STM32F4是一款高性能的微控制器,拥有丰富的外设,包括SPISPI(Serial Peripheral Interface)是一种常用的串行通信接口,其工作原理是通过一个主控器和多个从设备之间进行通信。 在STM32F4中,如果要实现SPI双机通信,需要将一个STM32F4作为主控器,另一个作为从设备。首先,主控器需要将其SPI外设的主/从模式设置为主模式,并设置时钟频率、数据位数等参数。接着,从设备需要将其SPI外设的主/从模式设置为从模式,同样设置时钟频率、数据位数等参数。 在通信过程中,主控器会发送一个信号,用来表示开始通信,然后将要发送的数据通过SPI总线传输给从设备。从设备收到数据后进行读取,并将读取的数据再通过SPI总线发送回主控器,同时主控器也可以读取从设备传来的数据。 需要注意的是,在双机通信中,主从设备的参数设置需要保持一致,否则通信可能会失败。另外,SPI通信具有高速传输、低功耗等优点,但传输距离较短,只适合短距离通信。 综上所述,STM32F4的SPI双机通信需要主控器和从设备统一设置参数,并通过SPI总线进行数据传输,具有高速传输和低功耗等特点,并适用于短距离通信场景。 ### 回答3: STM32F4是一款高性能的微处理器,具有强大而灵活的SPI(串行外设接口)功能,其用途广泛,被广泛应用于工业控制、电子仪器、嵌入式系统、汽车电子等领域。 SPI双机通信是指两个或多个STM32F4芯片之间通过SPI接口进行数据交换的过程。在SPI通信中,一个芯片作为主设备,另一个芯片作为从设备。主设备通过SPI接口向从设备发送数据,从设备将接收到的数据返回给主设备。 在STM32F4的SPI接口配置中,需要设置每个设备的模式、时钟极性和相位、数据位数等参数,以确保正确的数据传输。一般而言,主设备的SPI时钟需要大于从设备,以保证数据可以正确的传输。 双机通信的具体实现需要在主设备的固件程序中编写发送数据的程序,而在从设备的固件程序中编写接收数据的程序,以实现两个设备之间的数据交换。此外,还可以加入检验位、重传机制等保证数据传输的可靠性。 总之,STM32F4具有强大的SPI通信功能,可以方便地实现双机通信,为各种应用提供高效、可靠的数据交换解决方案。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值