硬汉嵌入式论坛

 找回密码
 立即注册
查看: 478|回复: 8
收起左侧

[SPI/QSPI] 关于SPI接口挂载两个设备工作不正常的问题

[复制链接]

8

主题

50

回帖

79

积分

初级会员

积分
79
发表于 2023-11-6 13:36:07 | 显示全部楼层 |阅读模式
各位大佬,我采用stm32H743作为主控,采用了SPI1接口接两个从设备的情况,用于CS引脚区分不同的设备,使用了ThreadX系统。


从机1采样率较高,为100Hz,相当于10ms就要调用一次SPI读数据;
从机2用了FIFO,160ms调用SPI读数据;

这个数据读取均为中断方式,在中断只读取数据,其他显示等处理工作则各开了1个任务。

问题是这样的,当只使用一个从机时(把另外个从机不初始化,相当于不工作),都能正常读取数据,但是两个从机都工作时,运行几秒后就会进入HAL_SPI_Transmit函数的Error_Handler(__FILE__, __LINE__),然后就卡死了。

我想问下这个是不是两个从机处于同时工作的原因,有什么办法可以解决一下了?
回复

使用道具 举报

8

主题

50

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2023-11-6 19:01:04 | 显示全部楼层
我参考V7开发板用户手册SPI章节,通过占用和释放SPI总线防止SPI读取数据时被打断,效果一样的,工作几秒就卡死了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2023-11-7 08:12:05 | 显示全部楼层
是不是没有有效的区分片选状态,正常的情况下,一个SPI器件不使能片选,这个器件的SPI引脚是高阻态的。可以这样试试,一个片选,另一个取消片选后,等待1秒操作。
回复

使用道具 举报

8

主题

50

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2023-11-7 14:22:05 | 显示全部楼层
eric2013 发表于 2023-11-7 08:12
是不是没有有效的区分片选状态,正常的情况下,一个SPI器件不使能片选,这个器件的SPI引脚是高阻态的。可以 ...

可能是跟我读数据的方式有关,两个从设备都是通过各自的中断引脚读数据的,中断来了必须得读,然后万一SPI出现两个都要读的情况就死掉了,我把采样率较低的那个从设备改成任务里查询方式读取了,貌似好了很多,回头再长时间工作测试一下。
回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2023-11-7 16:03:35 | 显示全部楼层
wling597074509 发表于 2023-11-7 14:22
可能是跟我读数据的方式有关,两个从设备都是通过各自的中断引脚读数据的,中断来了必须得读,然后万一SP ...

有没有可能是任务读取时发送冲突枪战了哟,建议加上互斥信号量看看  100ms-160ms 貌似有些快吧 ??
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-11-7 16:07:36 | 显示全部楼层
先尝试在一个线程里去轮询读两个设备,不知道你是不是在两个线程里去操作SPI了,加个锁吧
回复

使用道具 举报

8

主题

50

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2023-11-7 22:01:48 来自手机 | 显示全部楼层
hpdell 发表于 2023-11-7 16:03
有没有可能是任务读取时发送冲突枪战了哟,建议加上互斥信号量看看  100ms-160ms 貌似有些快吧 ??

应该是冲突了,主要是数据采集,另外一个从机没有fifo,10ms就得读一次。现在参考的v7开发板的例程做的spi互斥。
回复

使用道具 举报

8

主题

50

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2023-11-7 22:03:23 来自手机 | 显示全部楼层
tovinz 发表于 2023-11-7 16:07
先尝试在一个线程里去轮询读两个设备,不知道你是不是在两个线程里去操作SPI了,加个锁吧

一个线程和两个线程都试过了,最后发现可能还是两个都用IO中断指示读数据可能不太好。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-11-8 08:43:09 | 显示全部楼层
wling597074509 发表于 2023-11-7 22:03
一个线程和两个线程都试过了,最后发现可能还是两个都用IO中断指示读数据可能不太好。

我用过用一个SPI挂两个WK2124拓展8串口,每个2124有一个中断线,在中断里发的信号量给线程,在线程中操作的SPI,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 23:33 , Processed in 0.258673 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表