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

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

3天内不再提示

教你如何有效解决I2C配置顺序引发无法收发数据问题

STM32单片机 来源:未知 作者:佚名 2017-11-12 08:55 次阅读

前言

在参考Cube软件包中I2C例程后, 根据应用需要新增了一路I2C接口,结果新增I2C无法收发数据。本文主要对问题进行描述,分析产生原因,提供解决方法。

问题描述

如前言所述,现象表现为I2C无法收发数据。得无法理解之处,在于之前已经完成了I2C的移植工作,并且运行正常。现在遵照正确的方式,新添一路I2C接口,只是更改了对应的I2C接口及引脚,为什么无法收发数据。简化测试程序如下。

GPIO_InitTypeDef GPIO_InitStruct;

/* Enable GPIOTX/RX clock */

I2Cx_SCL_GPIO_CLK_ENABLE();

I2Cx_SDA_GPIO_CLK_ENABLE();

/* Enable I2Cxclock */

I2Cx_CLK_ENABLE();

/*##-2- Configureperipheral GPIO ###########*/

/* I2C TX GPIOpin configuration */

GPIO_InitStruct.Pin= I2Cx_SDA_PIN;

GPIO_InitStruct.Mode= GPIO_MODE_AF_OD;

GPIO_InitStruct.Pull= GPIO_PULLUP;

GPIO_InitStruct.Speed= GPIO_SPEED_HIGH;

GPIO_InitStruct.Alternate= I2Cx_SCL_SDA_AF;

HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT,&GPIO_InitStruct);

GPIO_InitStruct.Pin= I2Cx_SCL_PIN;

HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT,&GPIO_InitStruct);

I2cHandle.Instance= I2Cx;

I2cHandle.Init.ClockSpeed= 100000;

I2cHandle.Init.DutyCycle= I2C_DUTYCYCLE;

I2cHandle.Init.OwnAddress1= 0;

I2cHandle.Init.AddressingMode= I2C_ADDRESSINGMODE_7BIT;

I2cHandle.Init.DualAddressMode= I2C_DUALADDRESS_DISABLE;

I2cHandle.Init.OwnAddress2= 0;

I2cHandle.Init.GeneralCallMode= I2C_GENERALCALL_DISABLE;

I2cHandle.Init.NoStretchMode= I2C_NOSTRETCH_DISABLE;

if(HAL_I2C_Init(&I2cHandle)!= HAL_OK)

{

/* InitializationError */

Error_Handler();

}

while(1)

{

HAL_I2C_Master_Transmit(&I2cHandle,(uint16_t)I2C_ADDRESS,

(uint8_t*)aTxBuffer, TXBUFFERSIZE, 10000);

}

二 现象分析

将上述程序在STM32F469i-Disco板上实现,复现现象并寻找规律。发现规律如下:

分析上表可以发现问题的产生与硬件设计有一定关系。观察发现,如果I2C没有外部上拉时,会导致问题产生。

通过单步调试,定位于HAL_I2C_Master_Transmit(),在这个函数中调用的I2C_WaitOnFlagUntilTimeout()无法执行异常,返回HAL_BUSY,导致了I2C写功能失败。在I2C_WaitOnFlagUntilTimeout函数内部,是对忙标志位BUSY@I2Cx_SR2检测。通过对参考手册的阅读(如下截图所述),如果在未占用I2C总线时,SDASCL引脚存在低电平,则意味着总线处于忙状态。这种检测机制在I2C接口失能时依然工作。

结合程序中调用顺序,在I2C3时钟使能时,虽然I2C3没有使能,但是忙状态检测已经开始。由于对应的SCL引脚上无上拉电阻,并且由于还未对I2C3SCL引脚进行配置。此时SCL引脚为浮空输入状态,实际测量发现为低电平,BUSY标志被置位。

三 解决方法

通过现象及分析,可了解到问题可通过硬件或者软件解决。

硬件方面,为SDASCL引脚提供外部的I2C上拉电阻,问题不在出现。

软件方面,发现在对SCLSDA引脚配置时会启用内部上拉。通过将I2C时钟使能代码放于I2C引脚配置语句后面,问题也不再出现。

需要注意, I2CSDASCL引脚内部上拉电阻,为弱上拉。使用者可以通过对应型号STM32的数据手册,查看对应引脚的上拉电阻,以便判断是否能够满足应用需要。如下为STM32F469上拉电阻信息截图。

==================================


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

    关注

    28

    文章

    1472

    浏览量

    122944
  • 数据收发
    +关注

    关注

    0

    文章

    8

    浏览量

    7750

原文标题:I2C配置顺序引发的异常案例

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

收藏 人收藏

    评论

    相关推荐

    RISC V的I2C操作

    函数功能,除了必须通过I2C主设备实现的功能:发送start和stop之外,函数本身并没有主从之分;当需要RISC V中的I2C做从设备时,只需监控总线状态(如是否接收到有效数据等)
    的头像 发表于 11-01 11:06 40次阅读

    I2C协议的基础知识

    本文从I2C协议的概述开始,描述协议的历史、不同速度模式、物理层和数据帧结构,最后介绍I2C混合电压系统中电平兼容性以及上拉电阻大小计算。
    的头像 发表于 10-22 15:51 150次阅读
    <b class='flag-5'>I2C</b>协议的基础知识

    I2C数据线切换延迟

    电子发烧友网站提供《I2C数据线切换延迟.pdf》资料免费下载
    发表于 09-20 09:11 0次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>数据</b>线切换延迟

    I2C基本指南

    电子发烧友网站提供《I2C基本指南.pdf》资料免费下载
    发表于 09-10 09:40 0次下载
    <b class='flag-5'>I2C</b>基本指南

    LMK1D1208I I2C配置低附加抖动LVDS缓冲器数据

    电子发烧友网站提供《LMK1D1208I I2C配置低附加抖动LVDS缓冲器数据表.pdf》资料免费下载
    发表于 08-20 09:43 0次下载
    LMK1D1208<b class='flag-5'>I</b> <b class='flag-5'>I2C</b>可<b class='flag-5'>配置</b>低附加抖动LVDS缓冲器<b class='flag-5'>数据</b>表

    不理解i2C?现在来教你

    的方式解释如下: 基本概念 双向二线制:I2C总线只使用两根线——一根数据线(SDA)和一根时钟线(SCL),就可以实现数据的双向传输。这种设计使得连接设备变得非常简单和节省空间。 串行通信:
    的头像 发表于 07-10 09:26 597次阅读
    不理解<b class='flag-5'>i2C</b>?现在来<b class='flag-5'>教你</b>

    具有中断输出和配置寄存器的PCA9554远程8位I2C和SMBus I/O扩展器数据

    电子发烧友网站提供《具有中断输出和配置寄存器的PCA9554远程8位I2C和SMBus I/O扩展器数据表.pdf》资料免费下载
    发表于 06-28 11:04 1次下载
    具有中断输出和<b class='flag-5'>配置</b>寄存器的PCA9554远程8位<b class='flag-5'>I2C</b>和SMBus <b class='flag-5'>I</b>/O扩展器<b class='flag-5'>数据</b>表

    PCA9554A具有中断输出和配置寄存器的远程8位I2C和SMBus I/O扩展器数据

    电子发烧友网站提供《PCA9554A具有中断输出和配置寄存器的远程8位I2C和SMBus I/O扩展器数据表.pdf》资料免费下载
    发表于 06-28 11:03 0次下载
    PCA9554A具有中断输出和<b class='flag-5'>配置</b>寄存器的远程8位<b class='flag-5'>I2C</b>和SMBus <b class='flag-5'>I</b>/O扩展器<b class='flag-5'>数据</b>表

    TCA9537具有配置寄存器的远程4位I2C和SMBus I/O扩展器数据

    电子发烧友网站提供《TCA9537具有配置寄存器的远程4位I2C和SMBus I/O扩展器数据表.pdf》资料免费下载
    发表于 06-24 10:05 0次下载
    TCA9537具有<b class='flag-5'>配置</b>寄存器的远程4位<b class='flag-5'>I2C</b>和SMBus <b class='flag-5'>I</b>/O扩展器<b class='flag-5'>数据</b>表

    使用CYT2CL进行I2C配置后,为什么无法进行传输?

    我们正在使用 CYT2CL 进行 I2C 配置。 我们使用的是 SDL 7.9.0 I2C 主模式示例,但我们无法进行传输。
    发表于 06-03 08:36

    使用CYT2CL进行I2C配置,写入不正常的原因?

    我们正在使用 CYT2CL 进行 I2C 配置。 我们使用的是 SDL 7.9.0 I2C 主模式示例,但我们无法进行传输。
    发表于 05-29 06:24

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。
    发表于 03-12 09:17 826次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b>总线的控制逻辑

    i2c接口由哪几根线组成 i2c接口可以接哪些器件

    I2C接口的线路可以适应不同的系统需求和器件规格,因此具体的线路配置可能会有所不同。但通常来说,时钟线(SCL)和数据线(SDA)是I2C接口的核心线路。
    的头像 发表于 03-05 16:55 3521次阅读
    <b class='flag-5'>i2c</b>接口由哪几根线组成 <b class='flag-5'>i2c</b>接口可以接哪些器件

    GD32 MCU硬件I2C不可靠不如软件I2C?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。
    的头像 发表于 02-23 09:37 2509次阅读
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如软件<b class='flag-5'>I2C</b>?来看看红枫派开发版的硬件<b class='flag-5'>I2C</b>驱动如何做到稳得一批

    I2C地址跳变问题的调试案例

    引言:I2C作为使用最为广泛的通讯接口,调试各类I2C器件,大家应该都很轻车熟路。一般对于外挂电阻配置器件的I2C地址,例如电阻上拉之后,器件的地址就会固定下来不再变动,但是今天给大家
    的头像 发表于 11-22 10:51 1395次阅读
    <b class='flag-5'>I2C</b>地址跳变问题的调试案例