【STM32】IIC使用中DMA传输时 发送数据总少一个的问题

问题描述

在使用STM32 I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。当对I2C接收到的数据进行DMA传输时,没有异常。

关于I2C的DMA传输,STM32技术参考手册部分有这么一段话:

在这里插入图片描述
意思是说当DMA产生EOT标志后,(如果开启了EOT相关中断就进中断程序,没有开启就进行软件查询做后续处理)关闭DMA请求,然后等待BTF事件,之后执行STOP操作。

这里的BTF事件就是I2C数据收发过程中的数据字节是否传输完成的的事件。SR寄存器中的一个位
在这里插入图片描述

查看关于I2C发送代码,发现他在检测到DMA产生EOT标志后,他首先就是做的STOP操作,然后关闭相关DMA请求。代码里没有检测BTF标志的过程。

这样做就会导致个问题。在最后一次DMA数据传输完成后,数据刚放进I2C的DR寄存器,还没来得及把这个新数据通过I2C发送出去,因为用户程序立即做了STOP操作,最后那个数据无法传输。

STM32F103是意法半导体推出的一款高性能Cortex-M3内核的32位微控制器,具有丰富的外设资源,包括IIC接口和DMA功能。下面将简要介绍STM32F103IICDMA发送和接收操作。 首先,IIC接口是一种具有高速度和广泛应用的串行通信接口,适用于微控制器与外设之间的数据传输STM32F103的IIC接口支持主机和从机模式,并能够通过硬件I2C控制器配置和驱动IIC外设。 在STM32F103使用DMA(Direct Memory Access)可以在不占用CPU资源的情况下实现数据的高速传输DMA控制器是一种特殊的硬件设备,可以在外设和存储器之间直接传输数据,提高数据传输效率。 具体实现IICDMA发送和接收操作的步骤如下: 发送操作: 1. 配置IIC发送模式和相关参数,包括传输速率、地址等。 2. 配置DMA控制器,指定源数据地址和目标寄存器地址,并设置传输长度和传输方向。 3. 启动DMA传输并等待传输完成。 接收操作: 1. 配置IIC的接收模式和相关参数,包括传输速率、地址等。 2. 配置DMA控制器,指定源寄存器地址和目标数据地址,并设置传输长度和传输方向。 3. 启动DMA传输并等待传输完成。 4. 读取目标数据地址的接收数据。 需要注意的是,使用DMA进行数据传输需要合理配置DMA通道和断,可以通过DMA断来判断传输是否完成,并及处理传输结果。 综上所述,通过配置IIC接口和DMA控制器,可以实现在STM32F103上进行IIC数据的高速发送和接收操作,提高数据传输效率和系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值