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

    文章

    1346

    浏览量

    120808
  • 数据收发
    +关注

    关注

    0

    文章

    8

    浏览量

    7742

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

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

收藏 人收藏

    评论

    相关推荐

    CYPD3171怎么配置I2C地址?

    请教下,i2c地址怎么配置那描述的 在上面文档没有找到,抽空帮指点下,谢谢!
    发表于 02-27 06:32

    CX3 I2C启动失败的原因?怎么解决?

    为 Z1Z 还是 1ZZ,系统都无法I2C 启动。 使用逻辑分析仪测试 I2C 信号。 启动时可以读取第一帧的数据。 与 AN76405 相比,
    发表于 02-23 06:53

    TC275操作I2C读操作时陷入while循环无法退出怎么解决?

    TC275作为主芯片,通过I2C读取EEPROM芯片数据,在调用iLLD库的IfxI2c_I2c_read函数时,偶发程序卡在以下while循环中无法退出。 发现是PIRQSS寄存器
    发表于 02-02 06:52

    如何配置TC38x I2C中断?

    配置I2C中断? 有没有关于它的演示? 下面的代码是关于 irq 的 下面的代码是关于 I2C 寄存器的 如何配置中断处理函数
    发表于 01-29 07:42

    使用两片ADU360进行I2C通信,当与从机进行通信时,从机无法进入I2C中断是为什么?

    问题说明:使用两片ADU360进行I2C通信,主机使用IO口模拟方式,从机使用内部外设 主机IO口模拟方式,确认是可行,当与从机进行通信时,从机无法进入I2C中断 以下为I2C初始化
    发表于 01-15 06:47

    ADIS16488数据接口只能支持SPI协议吗?能否配置I2C

    ADIS16488数据接口只能支持SPI协议吗?能否配置I2C? 还有引脚1、2、7、9,是DIO3 DIO4 DIO1 DIO2数字输入
    发表于 01-01 07:55

    ADE7880使用I2C读取数据,怎么设置I2C为快速模式?

    ADE7880使用I2C读取数据问题,怎么设置I2C为快速模式,谢谢。
    发表于 12-26 07:41

    DSP Sharc SC589 I2C Register无法写入的原因?

    在调试SPORT的功能时,SPORT相关的寄存器写入正常。 调试I2C时,I2C相关寄存器无法写入 想了解,什么情况下,I2C寄存器无法
    发表于 11-28 07:27

    lpc1114的i2c监听模式怎么配置

    lpc1114监听i2c总线上的数据怎么配置,不作为通讯用,把总线上数据通过串口传输到电脑
    发表于 10-07 06:53

    lpc1114如何设置监控i2c数据

    有一条正常通讯的i2c总线,想截取通讯内容,看手册好像是可以用lpc1114监听,然后想用串口输出数据,那么单片机i2c需要怎么配置
    发表于 09-27 07:07

    全面掌握面试必考题I2C协议 - 第12节

    I2C协议
    充八万
    发布于 :2023年09月01日 19:07:43

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第2

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:03:33

    基于 FPGA 的模拟 I2C协议系统设计

    接口在很多工程中有广泛的应用,如数据采集领域的串行 AD,图像处理领域的摄像头配置,工业控制领域的 X 射线管配置等等。除此之外,由于 I2C 协议占用的 IO 资源特别少,连接方便,
    发表于 08-14 18:21

    I2C与DRM启动顺序异常怎么解决?

    问题:我使用4.14.98版本的内核,i2c先后drm启动,这样使用bridge(it6161)可以正常工作,启动流程作为附件。当我使用5.4.70版本的内核时,drm启动先于i2c,这样引导
    发表于 06-02 09:49