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

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

3天内不再提示

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

聚沃科技 2024-02-23 09:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。

那么为什么会出现I2C BUSY?硬件I2C真的不如软件I2C吗?怎么让硬件I2C也稳得一批,让我们来一探究竟。

首先我们从I2C时序分析下I2C总线挂死是如何产生的。

我们来看下I2C的时序和流程:

wKgZomXX9piAC-JfAABf-fjP0y0517.png

wKgaomXX9p6AdZ9vAABj3Ag6XSg389.png

所以总线挂死可能会有几个原因:

1、主机信号挂死了:

主机IO口损坏、I2C状态机异常软件死机

2、主机程序异常:

I2C通信需要主机来主导,主机软件本身异常了I2C信号也不会继续产生。

3、从机拉死了总线:

I2C是线与的,所以从机拉低后总线也挂了,主机无法再次拉高发起新的通信。这种情况一般在信号被干扰时从机丢失clock或者增加了clock导致双方时序没对齐,从机还维持住一个发送0 bit的状态就把SDA拉低了。

首先原因1和2是和程序相关,I2C的状态机流程较多,自行编写驱动确实容易出现问题,只要使用成熟驱动就可以。大家可以直接使用红枫派的I2C驱动就避免这类问题,红枫派的驱动可靠性不比原厂驱动低,经受RTOS、多中断、干扰等全方面打击。

wKgZomXX9qSAORzqAAAowZ6DO9Y088.png

对于原因3,既然是干扰多了clock和少了clock导致从机维持拉低SDA的状态,那我们补齐clock结束这次异常通信不就可以了?

其实这个方法在最新的I2C协议标准中也有说明,不管I2C当前丢失或增加几个clcok,我们只要让主机连续补齐9个clock,在9个clock内时序一定会补齐到ACK环节,此时主机维持SDA高状态就可以让这次通信以NACK进行结束,从机自然会释放总线,这个比强制用推挽模式拉高SDA更安全合理。

那么这个异常恢复在红枫派的驱动里也已经为大家考虑好了,当总线状态出现异常时,驱动里会自动进行处理恢复总线。

wKgaomXX9qyAeRWWAABEaGqe-dI730.png

那么软件I2C的弊端在哪里呢?

软件I2C一般通过IO口控制和延时进行模拟,这意味着整个通信过程会完全依靠并占用CPU,如果我们运行RTOS、或者有高频中断就会出现模拟时序过程被打断,波形会出现频率变化,波形中途停止等情况,一方面是降低通信效率,另外也可能导致主机没有在关键时间采样或者输出数据,出现通信错误。

红枫派开发板上板载了一个I2C的EEPROM,欢迎大家在软件极其严苛、硬件I2C接口随机进行干扰下验证例程,体验下稳得一批的硬件I2C。

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

    关注

    6074

    文章

    45340

    浏览量

    663480
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328782
  • 硬件
    +关注

    关注

    11

    文章

    3555

    浏览量

    68741
  • IIC
    IIC
    +关注

    关注

    11

    文章

    308

    浏览量

    40377
  • GD32
    +关注

    关注

    7

    文章

    429

    浏览量

    26937
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入剖析I2C协议

    I2C也是种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备,I2C的出现主要是用来实现不同集成电路组件之间的控制功能,比如通过
    的头像 发表于 08-21 15:10 3273次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    基于RT-Thread的I2C(软件) 实践 | 技术集结

    、软硬件介绍(I2C(软件)I2C种广泛应
    的头像 发表于 05-06 18:44 754次阅读
    基于RT-Thread的<b class='flag-5'>I2C</b>(<b class='flag-5'>软件</b>) 实践 | 技术集结

    飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动之Linux下的I2C驱动简介

    I2C协议的基本功能的软件硬件实现。它通常包括对I2C总线的初始化、数据传输、时序控制和错误处理等功能的支持。I2C核心提供了
    发表于 04-15 10:19

    I2C总线复用

    帝晶智慧屏I2C总线复用
    的头像 发表于 03-11 17:20 1853次阅读

    I2C总线通信原理 如何设计I2C总线电路

    I2C总线通信原理 I2C(Inter-Integrated Circuit)总线是种用于集成电路之间进行通信的串行通信协议。它最早由飞利浦公司(现被恩智浦电子收购)于1982年推出,是
    的头像 发表于 01-31 15:01 1878次阅读

    I2C总线的优缺点分析

    设备之间的通信,这大大减少了所需的引脚数量,降低了硬件成本。此外,由于其简单性,I2C总线也易于实现和维护。 2. 多主机和多从机支持 I2C总线支持多个主机和多个从机,这意味着在同
    的头像 发表于 01-17 15:50 1763次阅读

    I2C总线与Arduino的接口示例

    在现代电子设计中,I2C总线因其简单性和灵活性而广受欢迎。它允许多个设备共享同通信线路,从而节省空间和成本。Arduino,作为个多功能的微控制器平台,自然也支持I2C通信。
    的头像 发表于 01-17 15:34 2359次阅读

    I2C总线的工作模式介绍

    在现代电子系统中,I2C总线作为种多主机、多从机的串行通信协议,扮演着至关重要的角色。它允许多个设备共享同总线,进行数据传输,从而简化了系统设计并降低了成本。 I2C总线的基本特性
    的头像 发表于 01-17 15:32 1635次阅读

    I2C总线协议详细解析

    1. I2C总线简介 I2C总线由Philips Semiconductor(现为NXP Semiconductors)在1980年代初期开发。它是种多主机总线,允许多个设备共享同
    的头像 发表于 01-17 15:22 1571次阅读

    I2C总线故障排除技巧

    I2C总线是种广泛使用的串行通信协议,它允许多个设备在两条线上(数据线SDA和时钟线SCL)进行通信。由于其简单性和灵活性,I2C总线在嵌入式系统中非常流行。然而,当I2C总线出现问
    的头像 发表于 01-17 15:20 3863次阅读

    I2C总线与单片机的连接

    在现代电子系统中,单片机(MCU)是核心控制单元,而I2C总线作为种多主机、多从机的串行通信协议,因其简单、高效和节省引脚的特性而被广泛应用于各种电子设备中。 I2C总线概述
    的头像 发表于 01-17 15:18 1969次阅读

    I2C总线设备地址设置方法

    通常是个7位或10位的数字,用于标识总线上的每个设备。在7位寻址模式下,地址范围是0x00到0x7F,而在10位寻址模式下,地址范围是0x000到0x3FF。I2C地址的最低位(LSB)通常用于指示读/写操作。 硬件地址设置
    的头像 发表于 01-17 15:17 6959次阅读

    I2C总线应用实例分析

    在现代电子系统中,I2C总线因其简单、灵活和高效的特点而被广泛应用于各种设备之间的通信。 I2C总线概述 I2C总线由Philips(现为NXP)在1980年代初期开发,最初用于音频和
    的头像 发表于 01-17 15:09 1242次阅读

    I2C总线与SPI总线的比较

    在现代电子系统中,微控制器与各种外设之间的通信是必不可少的。I2C和SPI是两种流行的串行通信协议,它们各自具有独特的特点和应用场景。 I2C总线 I2C
    的头像 发表于 01-17 15:08 1714次阅读

    I2C总线上拉电阻阻值如何确定?

    导读I2C总线在产品设计中被广泛应用,尽管其结构简单,但经常发生上拉电阻设计不合理的问题。本文将对I2C上拉电阻的选择进行简要分析。根信号线上,通过电阻连接个固定的高电平VCC,信
    的头像 发表于 12-27 11:34 2395次阅读
    <b class='flag-5'>I2C</b>总线上拉电阻阻值如何确定?