硬汉嵌入式论坛

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

[有问必答] stm32f103外部中断里使用硬件spi读cpld数据异常问题

[复制链接]

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2025-7-15 09:27:34 | 显示全部楼层 |阅读模式
本帖最后由 Clin 于 2025-7-16 16:50 编辑


在STM32F103上进行裸机开发,使用硬件SPI与一个CPLD芯片通信时,遇到了一个奇怪的问题:
SPI的写入操作在各种环境下都正常,但读取操作在外部中断服务函数(EXTI ISR)内部调用时出现异常,而在主循环(main)或定时器中断(TIM ISR)中调用则完全正常。
写入操作(所有场景):  成功将数据写入CPLD的指定地址。硬件SPI和软件SPI都正常。
读取操作(主循环或定时器中断):  使用硬件SPI能成功从CPLD的指定地址读取回正确的数据值。
读取操作(外部中断中):  使用 相同的硬件SPI代码 在EXTI ISR内部读取CPLD数据时,返回的值 不是预期的数据,而是之前写入的地址值(地址addr) 。例如,在EXTI ISR中调用 data = SPI_ReadCPLD(0xA5) 后,data 的值是 0xA5 而不是CPLD实际返回的数据。
软件SPI(所有场景):  如果在外部中断服务函数中使用软件模拟的SPI(即通过GPIO手动控制时钟和数据线)进行读写操作,则 读取和写入都完全正常 ,能正确写入地址并读回数据。

后面通过在外部中断里设置标志位,把所有的读写操作全都移到主函数里处理了,没发现问题。
但是还是想知道为什么?
/***************************************** 新添补充 **********************************************/

1.  主函数里硬件SPI写CPLD指令,CPLD触发一个高电平输入到MCU的外部中断
2.  外部中断里硬件SPI写CPLD、读CPLD,写正常,读异常
3.  示波器测得波形如下,读回来数据片选被自动拉高了(在其他情况正常)

图1

图1
企业微信截图_17526552149222.png

硬件SPI写CPLD的最后有一个等待总线空闲延时,再拉高片选,但是图1却没拉高,直接进入外部中断里进行下一指令操作。
初步怀疑是主函数里写CPLD还在等待总线空闲,片选还没拉高就触发外部中断,执行外部中断3里写指令、读指令,然后不知道什么原因导致读回来数据(图2最后16bit)的片选被自动拉高了。
后面在读函数里一进入就先关闭SPI的使能,延迟2us再打开使能,测试正常。
不知道能不能这样子操作,感觉有点问题,不知道为什么片选会拉高。










回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-15 17:21:09 | 显示全部楼层
是不是存在外部中断触发后不能立即读取。试试中断后,强行延迟一会读取。仅用于测试。如果也不行的话,看下读取后SPI的状态寄存器。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2025-7-16 10:43:22 | 显示全部楼层
eric2013 发表于 2025-7-15 17:21
是不是存在外部中断触发后不能立即读取。试试中断后,强行延迟一会读取。仅用于测试。如果也不行的话,看下 ...

挖槽还真是,NB啊,延时200ms左右就可以读到了,但是这也太长了吧。
还有点疑问请教一下
1.为什么外部中断触发后不能立即读取
2.延时需要200ms这么久,差资料说外部中断响应较快,但是定时器中断里却可以,但也不应该要延时这么久吧
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2025-7-16 10:51:17 | 显示全部楼层
eric2013 发表于 2025-7-15 17:21
是不是存在外部中断触发后不能立即读取。试试中断后,强行延迟一会读取。仅用于测试。如果也不行的话,看下 ...

真逆天,之前是外部中断3(PE3)读失败;现在换了PB9外部中断9里面读就正常
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-7-16 12:21:05 | 显示全部楼层
不应该先逻辑分析仪抓包,确认一下是 cpld 的 bug 还是 mcu 的 bug 吗
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2025-7-16 16:02:48 | 显示全部楼层
dukelec 发表于 2025-7-16 12:21
不应该先逻辑分析仪抓包,确认一下是 cpld 的 bug 还是 mcu 的 bug 吗

没有逻辑分析仪,用示波器测了,波形确实有问题
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2025-7-18 09:13:43 | 显示全部楼层
测试出来发现:就是主函数硬件SPI写指令没执行完(等待接收数据时),由于外部中断响应太快了,从写入数据到就跳入外部中断里20多us左右,然后又在外部中断里继续读写,可能spi混乱了导致中断里读出错。但是具体原因还是没搞明白
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 23:48 , Processed in 0.044885 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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