0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32U59 SPI DMA发送未产生传输完成中断问题分析

STM32单片机 来源:STM32单片机 作者:STM32单片机 2022-09-01 12:11 次阅读

1、前言

某客户发现修改代码后,STM32U59 SPI DMA 发送未产生传输完成中断,但修改的代码跟 SPI 以及 DMA 毫无关联。

2、调研

回退代码修改后问题消失,可以确认硬件正常。检查 SPI 发送对应的 DMA 句柄的ErrorCode,发现 HAL_DMA_ERROR_DTE(Date Transfer Error)置位。尝试修改软件,发现调整下某个全局变量初值,或屏蔽某些变量,都能解决问题。

为屏蔽 RTOS 及应用代码可能带来的影响,调整客户 SPI 和 DMA 初始化代码位置到紧跟 MCU 复位后配置时钟,初始化全局变量,并在初始化完成后立即发送一包数据,测试下来问题仍存在,说明问题和后续 RTOS 及应用代码代码无关。

为澄清全局变量初始化对 SPI 和 DMA 的影响,在全局变量初始化完成、初始化 SPI和 DMA 前、后,分别检查 RCC、SPI 和 DMA 寄存器,和正常时对比无差异。

3、分析

客户使用的是 GPDMA 的 Linked List 模式,此模式下 DMA 传输相关的 8 个寄存器不通过软件直接设置,而是需要软件把待设定的寄存器参数先放入缓冲区,再将缓冲区地址赋到 DMA 寄存器 CxLBAR(高 16 位)和 CxLLR(低 16 位),使能 DMA 时硬件自动将这些参数加载到 DMA 通道对应的寄存器中。

跟踪代码执行,在 DMA 使能前,查看参数缓冲区(地址:0x2001 FFF0)。确认DMA 参数缓冲区中源地址寄存器参数 0x200 e0618、目标地址寄存器参数 0x4001 3020都是正确的;使能 DMA 后,发现 DMA CxDAR 寄存器数据异常 0x1382 932e。

3d67c0b0-292c-11ed-ba43-dac502259ad0.png

3d8d5064-292c-11ed-ba43-dac502259ad0.png

查阅参考手册,找到其对对缓冲区限制的描述:必须 4 字节对齐,且不能跨 64Kbyte边界;而用户的缓冲区地址 0x2001 FFF0(32 字节)刚好跨了 64Kbyte 边界。链接器分配的地址范围是 0x2001 FFF0 ~ 0x2002 0010,而 GPDMA 实际访问的数据区间是0x2001 FFF0 ~ 0x2001 FFFF 和 0x20010000 ~ 0x2001000F,把 2001 0000 对应的数据加载到了 DAR 中,随即引发了 DTE 错误。

3daecd7a-292c-11ed-ba43-dac502259ad0.png

4、处理

处由于增减全局变量、修改变量初值为零或非零,都会影响最终链接结果,故通过设置预编译选项对所有 DMA 链表数据结构变量的地址作出限制,来满足 4 字节对齐且不跨64K Byte 边界这个约束条件,再次编译链接后进行测试,SPI DMA 功能恢复正常。

5、小结

对这种看似怪异的问题,需要仔细观察并记录整个数据传输过程,各个关键操作前后相关寄存器的变化来获取第一手资料,对比正常情况并结合参考手册寻找具体原因。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350973
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91498
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41469
  • dma
    dma
    +关注

    关注

    3

    文章

    560

    浏览量

    100544

原文标题:工程师笔记|DMA 不产生传输完成中断

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用dma的方式来传输定时器输入捕获的数据,是不是每隔100ms会触发dma传输完成中断?

    目前使用dma的方式来传输定时器输入捕获的数据,内存数据大小为2,使用normal模式,100ms打开dma模式,请问,这种情况下,是不是每隔100ms会触发dma
    发表于 04-18 07:47

    STM32H743 DMA接收固定长度数据后,并未立即进入DMA传输完成中断,为什么?

    743 单工只接收SPI做从接收AD7768非标准SPI口数据时发现,DMA接收固定长度数据后,并未立即进入DMA传输完成
    发表于 05-30 08:21

    STM32SPIDMA传输问题

    我在做一个实验,两片STM32的单片机:其中一个做为SPI主机,只接收,另一个为SPI从机,只发送。两个都为DMA
    发表于 02-10 10:49

    STM32 SPIDMA传输多出16个时钟

    stm32f103开启SPIDMA传输SPI时钟4.5M,DMA按1B
    发表于 10-11 08:59

    STM32F4 DMA传输完成中断触发条件

    中断产生有详细描述,如下图。根据图知道传输完成中断的发生条件:1.DMA_SxBDTR计数器达到零(正常使用时用的就是这个)2.
    发表于 07-01 08:50

    HAL库SPI DMA的使用问题

    *pTxData, uint8_t *pRxData, uint16_t Size);此函数内需要对spi的状态量进行判断是否为ready,然后再将状态量变成busy,函数内使能了DMA的TC(传输完成
    发表于 04-01 11:47

    DMA传输完成中断用来配置ADM2483的管脚

    用的外设是PA9 PA10DMA选择的是DMA2_Channel6代码中还用了DMA传输完成中断,用来配置ADM2483的管脚。直接上代码了
    发表于 08-16 07:00

    STM32 SPI驱动增加信号量进行传输完成通知哪位兄弟做过这样的尝试吗

    当前的 STM32 SPI 驱动里,传输完数据后,会使用 while 进行等待传输完我修改了一下,给 SPI 增加了一个信号量。使用
    发表于 11-17 10:17

    STM32F407使用系统库函数DMA_GetITStatus获取中断状态的问题

    程序使用DMA传输,需要使用DMA传输完成中断,程序如下:void DMA2_Stream7_I
    发表于 12-04 17:21 7次下载
    <b class='flag-5'>STM32</b>F407使用系统库函数<b class='flag-5'>DMA</b>_GetITStatus获取<b class='flag-5'>中断</b>状态的问题

    stm32f103使用dma和fpga进行spi通信

    stm32作为从机,fpga作为主机。进行spi通信。stm32使用dma进行数据接收。在dma中断
    发表于 12-22 19:29 95次下载
    <b class='flag-5'>stm32</b>f103使用<b class='flag-5'>dma</b>和fpga进行<b class='flag-5'>spi</b>通信

    STM32L431 寄存器配置 USART+DMA发送+中断接收

    用的外设是PA9 PA10DMA选择的是DMA2_Channel6代码中还用了DMA传输完成中断,用来配置ADM2483的管脚。直接上代码了
    发表于 12-24 19:09 17次下载
    <b class='flag-5'>STM32</b>L431 寄存器配置 USART+<b class='flag-5'>DMA</b><b class='flag-5'>发送</b>+<b class='flag-5'>中断</b>接收

    DMA中断的内存到内存传输

    .c:处理中断信息。 DMA_XferCpltCallback:数据正确传输完成回调函数。 DMA_XferErrorC
    发表于 03-23 15:23 3129次阅读
    <b class='flag-5'>DMA</b>带<b class='flag-5'>中断</b>的内存到内存<b class='flag-5'>传输</b>

    DMA产生传输完成中断

    DMA产生传输完成中断
    的头像 发表于 10-18 16:44 1347次阅读
    <b class='flag-5'>DMA</b>不<b class='flag-5'>产生</b><b class='flag-5'>传输完成</b><b class='flag-5'>中断</b>

    stm32 HAL库spi接收的同时为什么有数据发送出去?

    stm32 HAL库spi接收的同时为什么有数据发送出去? 在STM32 HAL库中,SPI接口的数据收发是通过
    的头像 发表于 10-26 17:42 1851次阅读

    STM32 DMA传输的问题分析

    用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全
    的头像 发表于 12-01 09:19 2898次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>DMA</b><b class='flag-5'>传输</b>的问题<b class='flag-5'>分析</b>