STM32单片机SPI从机通讯程序故障和解决

 背景:

公司开发的产品,需要主机和一个从传感器设备进行SPI通讯,自己编写SPI从机的单片机程序,然后让主从机通讯。可以实现主机SPI挂载最多2个流量计模块。

运行开发环境介绍

硬件环境

STM32F030F4P6TR

J-LINK  V11

软件开发环境

KEIL 5.14

VSCODE 

软件支持包ST官方标准库

遇到的问题:

我编写的程序之前1对1通讯已经好用了,后来新项目要使用两个我开发的模块,就发现了问题,只插入一个模块的时候可以读取。插入两个后都异常了。

解决方法:

1.修改1

 将我开发的SPI丛机程序中SPI的CS引脚的GPIO外部中断修改为  下降沿中断

 将SPI初始化里面的   CS引脚改为  硬件NSS

2.验证结果:

当主板通过SPI  一拖二带 两个DUSTFLOW 模块的时候  邵哥发现,虽然两个SPI都能读出数据

但是总是频繁的报校验和错误。

3.修改2

 然后将SPI发送中断中增加如下内容

验证2:

OK了 这样可以了。

关于SPI通讯:

之前我一直以为,只要将SPI主从两段的SPI的

波特率预分频值

数据帧结构   

同步时钟的空闲状态

数据采样位置

数据传输大小端 

CRC 

	SPI_I2S_DeInit(COMM_SPI_X);	
	SPI_InitStructure.SPI_Direction 	= SPI_Direction_2Lines_FullDuplex;  					//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode 			= SPI_Mode_Master;										//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize 		= SPI_DataSize_8b;										//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL 			= SPI_CPOL_High;										//串行同步时钟的空闲状态为高电平
	SPI_InitStructure.SPI_CPHA 			= SPI_CPHA_2Edge;										//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS 			= SPI_NSS_Soft;											//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;						//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit 		= SPI_FirstBit_MSB;										//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;													//CRC值计算的多项式
	SPI_Init(COMM_SPI_X, &SPI_InitStructure);  													//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

上述参数设置为相同的,就算是速度对应了

(这目前也只是我的猜测)

但是实际上,还需要注意的是,因为单片机的每一个SPI都挂载在不同的时钟总线上,不同时钟线的速率是不一样的

而最终的SPI通讯波特率还取决于SPI丛属的总线的速率

这是邵工的说法。

后面我再系统的写篇文章。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: LTC4150是一种基于STM32单片机的库伦计数器模块,用于测量电量消耗。 在编写LTC4150库伦计数器模块的参考例程时,我们首先需要了解STM32单片机的相关知识,包括GPIO口的配置和使用、定时器的配置和使用等。 然后,我们需要导入LTC4150库伦计数器模块的相关驱动和函数库。这些库文件通常可以从官方网站或其他资源中获得。 接下来,我们需要初始化STM32单片机的GPIO口和定时器,并进行相关配置,以便与LTC4150库伦计数器模块进行通信。 在主程序中,我们可以使用定时器来定期读取LTC4150库伦计数器模块的数据。通常情况下,我们可以设置一个定时器中断,每隔一段时间触发一次中断函数,在中断函数中读取LTC4150库伦计数器模块的数据,并将数据进行处理和展示。 同时,我们还可以根据具体应用的需求,设置一些额外的功能,比如报警功能。当电量消耗达到一定阈值时,我们可以通过GPIO口控制蜂鸣器或者发送报警信息给外部设备。 在编写参考例程时,我们要注意按照LTC4150库伦计数器模块的要求进行配置和操作,确保数据的准确性和稳定性。 综上所述,基于STM32单片机的LTC4150库伦计数器模块的参考例程涉及到STM32单片机的GPIO口和定时器的配置与使用,以及LTC4150库伦计数器模块相关驱动和函数库的导入与调用,主要包括初始化配置、数据读取、数据处理和功能扩展等。 ### 回答2: 基于STM32单片机的LTC4150库伦计数器模块参考例程用于实现对LTC4150电荷计数器的控制和读取。LTC4150是一种广泛应用于电池管理和电源监控系统的精密电荷计数器。以下是一个简单的参考例程,以便使用STM32单片机与LTC4150进行通信和交互。 首先,需要在STM32单片机上配置串行通信接口(如SPI或I2C)与LTC4150进行连接。在例程的初始化部分,需要对串行通信接口进行初始化,并设置相应的通信参数,如波特率和数据格式。 在主循环中,我们可以使用STM32单片机发送指令给LTC4150,并读取其返回的数据。首先,我们可以发送一个读取电荷寄存器的指令,通过读取电荷寄存器的值来获取当前的库伦计数。然后,可以发送一些控制指令来配置LTC4150的工作模式和参数,例如设置电流和电压的范围。 除了读取电荷计数器的值,还可以使用STM32单片机发送指令来检查LTC4150的状态寄存器。例如,可以检测充电状态、输出状态和故障情况,并相应地采取措施。 需要注意的是,具体的例程代码可能因使用的STM32单片机型号和开发环境而有所不同。因此,在使用该例程时,需根据实际情况进行相应的配置和调整。 总之,基于STM32单片机的LTC4150库伦计数器模块参考例程可用于快速实现与LTC4150的通信和控制,使用户能够轻松读取当前的库伦计数并监控电池管理和电源监控系统的状态。 ### 回答3: 基于STM32单片机的LTC4150库伦计数器模块参考例程是一种用于计算电池或电源中电荷的数量的解决方案。LTC4150是一种非常精确和灵敏的电荷计数器芯片,可通过SPI接口与STM32单片机通信。 这个参考例程提供了一种使用STM32单片机与LTC4150芯片进行通信的方法。在这个例程中,我们首先初始化STM32SPI接口,并设置相应的时钟、数据格式和通信模式。 然后,我们通过SPI接口向LTC4150芯片发送特定的命令来读取计数器的值。LTC4150芯片会将计数器的当前值以字节的形式返回给STM32单片机。 接下来,我们可以将接收到的字节转换为实际的电荷值。LTC4150芯片通常以典型值为单位进行计数,因此我们需要根据数据手册中给出的转换公式来计算出实际的电荷值。 最后,我们可以使用STM32单片机的UART或LCD显示模块将计算得到的电荷值输出到显示设备上,以便用户实时监测电池或电源中的电荷变化。 总之,这个基于STM32单片机的LTC4150库伦计数器模块参考例程提供了一种方便、可靠的方法来计算电池或电源中的电荷数量,并且可以灵活地与其他系统集成。这对于需要准确监测电荷变化的应用场景非常有用,如电动车、太阳能电池板等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z文的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值