stm32 模拟I2C

news2025/2/26 3:52:26

目录

简介

I2C 物理层

协议层

①②:起始信号和结束信号

③ 应答和非应答信号

④数据有效性

⑤数据传输

⑥空闲状态


简介

I2C 物理层

        一个 I2C 总线两条线组成,一个双向串行数据线SDA用来表示数据,一个串行时钟线SCL用于数据收发同步

        “总线”指多个设备共用的信号线,在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机

        多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线

       每个连接到总线的设备(主、从机)都有一个独立的地址,主机可通过该地址来访问不同设备

        总线通过上拉电阻接到电源,当挂在I2C中某设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平

        具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式,一般用快速模式
 

因为I²C协议比较简单,常常用GPIO来模拟I²C时序,这种方法称为模拟I²C。如果使用MCU的I²C控制器,设置好I²C控制器, I²C控制器就自动实现协议时序,这种方式称为硬件I²C。因为I²C设备的速率比较低,通常两种方式都可以,模拟I²C方便移植,硬件I²C工作效率相对较高

协议层

        协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环
节,这里主要讲起始、停止信号、发送、接收、应答、数据有效性、地址及数据

 ①②:起始信号和结束信号

        起始 (S) 和停止 (P) 信号是两种特殊的状态,表示开始通信和停止通信。当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始;当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

/*起始信号: 初始SCL\SDA 为高,然后SDA\SCL由高拉低开始,H高L低*/
void i2c_start(void)
{
    SDA_H();
    delay();
    SCL_H();
    delay();
/*必须先拉低SDA再拉低SCL*/
    SDA_L();
    delay();
    SCL_L();
    delay();
}
/*停止信号:初始 SCL 为高,然后SDA由低拉高结束*/
void i2c_stop(void)
{
    SDA_L();
    delay();
    SCL_H();
    delay();
    SDA_H();
    delay();
}

③ 应答和非应答信号

        I²C每次传输的8位数据后需要从机反馈一个应答位,以确认从机是否正常接收了数据。应答信号为低电平时,规定为有效应答位(ACK 简称应答位);应答信号为高电平时,规定为非应答位(NACK)。当设备 (无论主从机) 接收到 I2C 传输的一个字节数据或地址后,若希望对方继
续发送数据,则需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端
希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个
停止信号,结束信号传输。

        在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制SDA,若 SDA 为高电平,表示非应答信号 (NACK),低电平表示应答信号 (ACK)

/*I2C发出应答/非应答信号*/
void i2c_ack(uint8_t AckBit)
{
    if(1 == AckBit)
        SDA_H();/*表示不应答*/
    else
        SDA_L();/*表示应答*/
    delay();
    SCL_H();/*读取应答*/
    delay();
    SCL_L();
    delay();
}

④数据有效性

        SDA为高电平表示“ 1”,低电平表示“0”;SCL为高电平时表示有效数据(读取SDA数据),为低电平时表示无效数据,等SDA会进行电平切换(可能是1可能是0),为下次数据表示做准备。

 ⑤数据传输

         在 SCL 串行时钟的配合下,在SDA 上逐位地串行传送每一位数据

        I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址来查找从机,设备地址一般是7 位的地址应用比较广泛。地址之后紧跟的一个数据位用来表示数据传输方向,数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据;发送完之后从机就会等待主机的应答信号。

/*发送一个字节,data: 要发送的数据*/
void send_byte( unsigned char data)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if(data & (0x80 >> i))/*每次移位获取对应的数据位判断SDA是发0还是发1*/
        {
            SDA_H();/*拉高,发1*/
        }
        else{
            SDA_L();/*拉低,发0*/
        }
       
        SCL_H();/*读取数据*/
        delay();   
        SCL_L();
        delay();     
    }

}
/*I2C读出一个字节*/
unsigned char iic_read_byte(void)
{
    unsigned char i,data = 0x00;
    SDA_H();
    delay();
    for(i=0;i<8;i++)
    {
        SCL_H();/*拉高开始读取数据*/
        delay();
        /*使用库函数去读取SDA的GPIO引脚电平,通过返回值进入循环*/
        if(/*读取SDA的电平 == 1*/)
        {
            data |= (0x80 >> i);/*通过读取电平进行置1*/
        }/*如果是0就不用进入if语句,因为data初始位0000 0000,通过上面对对应的位置1即可*/
        SCL_L();/*等待读取数据*/
        dalay();
    }

    return data;
}
/*I2C等待从机的应答信号,应答信号SDA为低*/
uint8_t i2c_wait_ack(void)
{
    unsigned char  wait_time=0;
    /*发送完数据等待应答信号的状态*/
    SDA_H();/*释放SDA,让发送应答信号方控制*/
    delay();
    SCL_H();/*开始读出SDA*/
    delay();
    while(/*使用库函数去读取SDA的GPIO引脚电平,通过返回值进入循环*/)/*等待应答*/
    {
        /*如果读取引脚电平为高,即1,表示不应答*/
        wait_time++;/*等待时间*/
        if(wait_time > 250)
        {
            /*认为从机没有发送应答信号*/
            SCL_L();
            return 1;/*表示接收失败*/
        }
        
    }
    /*没进入循环,表示SDA拉低了,表示应答*/
    SCL_L();
    return 0;
}

⑥空闲状态

        IIC 总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进口跨境电商商城源码(海关179接口+支持多平台搭建+提供多终端支持)

海关179接口 进口跨境电商商城源码提供了与海关179接口的集成&#xff0c;实现了便捷的报关操作。海关179接口是跨境电商进口的关键链接&#xff0c;通过该接口可以快速准确地完成商品的报关手续。进口商可以通过商城源码直接与海关进行数据交互&#xff0c;减少了繁琐的人工操…

taro微信小程序不支持热重新的一种解决思路

使用taro开发我觉得是挺好的&#xff0c;但是也有一个缺点&#xff0c;就是暂时使用不了微信的热重载功能&#xff0c;每次更新代码之后&#xff0c;都要手动重新编译才可以看到效果&#xff0c;这就很麻烦了&#xff0c;所以一种解决思路就是先开发h5的页面&#xff0c;因为h5…

【力扣】2127. (分类讨论 + 拓扑排序)参加会议的最多员工数

【力扣】2127. &#xff08;分类讨论 拓扑排序&#xff09;参加会议的最多员工数 文章目录 【力扣】2127. &#xff08;分类讨论 拓扑排序&#xff09;参加会议的最多员工数1. 题目介绍2. 思路&#xff08;**分类讨论 拓扑排序**&#xff09;3. 解题代码4. Danger参考 1. 题…

为什么时间跟踪对企业和员工很重要?

时间是每个企业主最宝贵的资产。如果员工不能正确管理自己的时间&#xff0c;就会出现延误&#xff0c;项目也会超出预算。 为了让员工获得公平的时间补偿&#xff0c;就必须记录他们的工作时间。工时管理系统可以帮助企业和员工更好地组织工作、提高效率和生产力&#xff0c;…

100量子比特启动实用化算力标准!玻色量子重磅发布相干光量子计算机

2023年5月16日&#xff0c;北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;在北京正大中心成功召开了2023年首场新品发布会&#xff0c;重磅发布了自研100量子比特相干光量子计算机——“天工量子大脑”。 就在3个月前&#xff0c;因“天工量子大脑”在…

redis 集群配置

1 . 存在的问题 单台redis容量限制&#xff0c;如何进行扩容&#xff1f;继续加内存、加硬件么&#xff1f;单台redis并发写量太大有性能瓶颈&#xff0c;如何解决&#xff1f;redis3.0中提供了集群可以解决这些问题。 2 . 什么是集群 redis集群是对redis的水平扩容&#xff…

Whisper 从0安装教程 windows

这里写自定义目录标题 Whisper 从0安装教程 windows安装过程安装python3.11安装Anaconda在Anaconda里面安装whisper安装 ffmpeg第一次运行whisper检查GPU 一些弯路 Whisper 从0安装教程 windows 因为需要把语音变成文字稿&#xff0c;问了做语言相关的朋友&#xff0c;决定使用…

基于51单片机的智能手机充电器设计

**单片机设计介绍&#xff0c;1660【毕设课设】基于51单片机和MAX1898的智能手机充电器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 51单片机智能手机充电器设计介绍 51单片机智能手机充电器是一种可以实现智能快速充电的…

stm32中断

目录 简介 什么是NVIC 中断优先级 EXTI 简介 总结 hal库初始化代码 标准库初始化代码 简介 什么是中断&#xff1f;正常情况下&#xff0c;微处理器根据代码内容&#xff0c;按顺序执行指令。执行过程中&#xff0c;如果遇到其它紧急的事件需要处理&#xff0c;则先暂停当…

CodeWhisperer 初体验-手把手教导 给你飞一般的体验!

文章作者&#xff1a;燛衣 CodeWhisperer 有以下几个主要用途&#xff1a; 解决编程问题&#xff1a;CodeWhisperer 可以帮助您解决遇到的编程问题。您可以描述您的问题或需求&#xff0c;CodeWhisperer 将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻…

ardupilot开发 --- SLAM 篇

1. 视觉SLAM 1.1 深度相机的种类 结构光相机&#xff0c;如 Kinect1.0、RealSenseTOF相机&#xff0c;如 Kinect2.0双目相机&#xff0c;如 ZED详细参考&#xff1a;https://zhuanlan.zhihu.com/p/282776636 1.2 视觉SLAM算法 2D slam 与3D slam 应用场景有哪些不同&#x…

高通财报分析:恶劣环境将导致高通股价在财报后大幅下跌

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;根据我们的分析&#xff0c;高通(QCOM)的股价在上个季度下跌了近16%&#xff0c;预计在本季度财报后还将继续下跌。 &#xff08;2&#xff09;在恶劣的环境下&#xff0c;高通…

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法 如下图所示,精智触摸屏使用U盘下载程序时报错: Application CTLPNL. EXE encountered a serious error and must shut down 出现这种情况时,可以尝试从以下几方面进行逐个排查: 断电重启,更换U盘…

知了汇智2024届“天府人才·校招行”启动,这些岗位急招...

知了汇智作为数字经济新业态下的产教融合服务型平台机构&#xff0c;大力构建企业与高校的交流平台&#xff0c;旗下全资子公司成都知聊人才服务有限公司&#xff0c;致力于为企业提供数字技术、数字营销方面的人才招聘、人才输送、人才定制等服务&#xff1b;为求职者提供个人…

三氧化二铁纳米片

&#xff08;西&#xff09;三氧化二铁纳米片 &#xff08;安&#xff09;名称&#xff1a;三氧化二铁纳米片 &#xff08;瑞&#xff09;CAS&#xff1a;1309-37-1 &#xff08;禧&#xff09;分子式&#xff1a;Fe2O3 &#xff08;生&#xff09;外观&#xff1a;白色粉末…

怎么让照片内存变小?三个方法轻松搞定!

让照片内存变小可以节省存储空间、提高传输速度、优化图片质量和降低流量消耗等&#xff0c;对于设备性能和用户体验都有积极的影响。下面介绍了三种简单有效的方法&#xff0c;一起来看看吧~ 方法一&#xff1a;通过嗨格式压缩大师压缩照片让内存变小 通过压缩照片&#xff0…

avi怎么转mp4?

avi怎么转mp4&#xff1f;如今市面上涌现了各种多样的视频格式&#xff0c;其中AVI作为一种音频视频交错格式&#xff0c;虽然使用较少但相对常见。它的优点在于占用空间较小&#xff0c;但画面质量并不是很出色。然而&#xff0c;AVI格式也存在一个明显的缺点&#xff0c;即兼…

企业软文推广的时机有哪些?媒介盒子告诉你

软文成本低、效果持续&#xff0c;能够为企业带来品牌曝光&#xff0c;实现品牌增值&#xff0c;但是企业也不是每时每刻都需要进行软文推广&#xff0c;接下来媒介盒子就告诉大家&#xff0c;企业进行软文推广的时机有哪些&#xff1f; 一、 为新品造势 一般企业发布新品时就…

基于区域边缘控制器的智慧管廊安全监测方案

区域边缘控制器是一种集成了PLC、网关、数据采集、协议兼容、多设备联动控制等丰富功能的智能设备&#xff0c;基于高性能工业级处理器&#xff0c;内置边缘计算策略和设备控制逻辑&#xff0c;从而代替PLC&#xff0c;实现对边缘物联网设备的智能自主感知和控制&#xff0c;适…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇一)

python实现MC协议&#xff08;SLMP 3E帧&#xff09;的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模…