STM32H7使用CubeMX生成的I2S驱动存在BUG

项目场景:

MCU型号:STM32H743IIT6 & STM32H750VBT6 & STM32F103VET6
I2S芯片型号:TLV320AIC3204
开发工具:STM32CubeMX V6.2.0 & MDK5 V5.34.0.0
固件包版本:STM32Cube_FW_H7_V1.9.1 & STM32Cube_FW_F1_V1.8.4
功能:I2S + DMA 半双工主机读模式


问题描述:

最近在做一个STM32H7通过I2S接口驱动TLV320AIC3204芯片达到测量驻波比的项目,期间遇到了一个神奇的现象:
使用CubeMX快速生成I2S驱动并移植后,发现数据可以正常读取(DMA接收中断均正常),但是数据全是0x00,但是用示波器测量后发现数据并非全为0x00,如下图:
在这里插入图片描述
SD信号代表有实时数据并且非0,而且DMA接收中断的频率也和采样频率能对应上。

实在找不到头绪,只能参考成功案例,发现STM32F103VET6的板子在相同的配置下竟然可以成功驱动并且读到数据!这就有意思了,于是开始了漫长的对比之路。。。

考虑到H7和F1有一个最大的不同:H7带有MPU保护和Cache缓存。于是尝试将MPU和Cache都关闭,DMA接收缓存对应的RAM区选择D3域,结果还是失败。
检查I2S配置寄存器,均正常,但是发现一个反常现象:H7的I2S对应SPI的接收寄存器一直没变化,说明问题出在SPI&I2S上。

总结下来的现象就是:数据波形是正常的,I2S配置正确,DMA也能正常接收,但是仿佛一直在接收空气。。。

原因分析:

抓住接收空气这个反常的点,开始猜想是不是因为引脚配置错误的原因。
CubeMX配置的SD信号走的是SPI的MOSI引脚(即主机MCU发送,从机接收),但是本着试一试的心态,尝试将引脚改接到MISO引脚,结果奇迹发生了!DMA接收缓存开始绿了!
在这里插入图片描述
但此时的我一脸懵逼,半双工I2S的SD引脚不是既可以作为发送也可以作为接收吗?而且引脚也是根据CubeMX配置的半双工接收来定义的,F103的CubeMX配置也是相同,用的也是MOSI作为SD引脚。如下图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解决方案:

将SD的通信接口从PA7(MOSI)改为PA6(MISO)即可正常读取数据。
在这里插入图片描述
后来尝试将CubeMX的版本更新至最新的V6.5.0版本,发现这个BUG已经修复了:
在这里插入图片描述

总结:

事实证明,以后用工具一定要先检查一下是不是最新的。

此文章献给像我一样因为这个问题而困扰的“攻城狮”们!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值