通信协议之IIC协议(eeprom)_通俗易懂篇!

本文详细介绍了IIC协议的工作原理,包括其主从结构、控制信号(SCL和SDA)、数据传输流程(如写入EEPROM的步骤)。重点讲解了如何通过控制字、地址和ACK机制来完成数据交换,并提到了时钟信号的生成和三态门的使用。最后概述了EEPROM的其他操作命令和结束信号逻辑。

1、IIC(Inter-Integrated Circuit),是IICBus简称,是一种串行通信总线

2、IIC协议:遵循主机master和从机slave的主从关系机制,区别于SPI通信协议,IIC协议存在应答机制,即当主机发送控制、地址、或数据时,需要从机回复ACK确认消息(在sda总线上回复)。

3、IIC协议:控制两根信号线SCL时钟信号线(一种理解方式)和sda数据总线,即可完成对从机的控制、输入、输出。

4、IIC协议访问eeprom为例(执行byte写命令):访问时存在“开始位”,“控制byte”,“应答位”, “高位地址位”, “应答位”,“低位地址位”, “应答位”,“数据位”, “应答位”,“停止位”。(byte写:eeprom的一种写入方式,一次写入一个字节的数据)

        “开始位”, “应答位”,“停止位”单拍。

        “控制byte”,“高位地址位”,“低位地址位”,“数据位”为8bit。

         “控制byte”:的组成是由control code操作码4位+cs片选3位+write/read命令位1位=8位

         control code: eeprom 为1010

         cs片选信号: 可以片选eeprom内的8个存储单元(片选即激活某个存储单元,可进行读写等)

         write/read命令:0表示写命令;1表示读命令。

          高+低地址位:共计16位,取低13位为有效位,高三位 don't care

           ACK:   从机的应答信号,当scl为高电平时,sda被从机拉低位0,表示从机确认,反之不确认NACK。(注意当发完8bit的数据后,三态门的控制,下面6说明三态门)

5、SCL时钟信号线的产生,是利用晶振时钟的上升沿或下降沿翻转产生,注意IIC使用的时钟的频率不要超过400khzHZ。(IIC高速模式下可达3.4Mbit/s,查看器件芯片手册是否支持),如果利用上升沿产生scl信号,那么电路驱动时钟采用下降沿有效,always @ (negedge clk)。

6、sda信号是主机和从机共用的一根数据总线,命令,数据、地址、等都在这根总线上传输,需要采用三态门,切换主机和从机对sda总线的控制权。无控制权的一方输出高阻态(即控制方发什么,总线sda就发什么,不会产生干扰)

7、开始位:当scl为高电平时,将sda拉低(sda初始是高电平,非工作时间保持高电平状态),表示开始,随即将在scl为低时,将控制位8bit信息发送出去。(注意主机数据的发送只能在scl为低电平时发送,实际就是并转串的过程),当发送完成后,在scl低电平时,将三态门使能拉低,将sda的控制(赋值主动权)给到从机。

8、ACK位:在scl为高电平时,对sda的状态做判断,为0时,表示从机ACK,为1时表示从机未确认。当ACK时,三态门的使能拉高,开始发送高位地址。

9、后续同理依次发送低位地址和数据,需要注意三态门的及时拉高和拉低切换sda的从机或主机的控制权。

10、当数据发送完成,并且收到从机反馈的ACK确认信息后,需要立即获得主机主动权,在scl为低时,拉低sda。

11、在scl为高时,拉高sda,这是stop停止位,结束操作的结束时序命令(在scl为低时,拉低sda,在scl为高时,拉高sda)。

附写仿真图,包含写的开始、控制byte、ack、高位地址位:

结束语:以上就是IIC协议的基本概念和在eeprom的应用实例。eeprom还可以实现page写,current read、random read,sequential read等命令,有兴趣的小伙伴可以私信。下面附一张读完后的结束仿真图,random read读完后进入stop状态的信号逻辑(注意:读完数据后反馈的是NACK)。

 

 

 

<think>好的,我现在需要帮助用户解析和使用名为`bit UserCommonEepromWrite`的函数进行EEPROM的数据写入,并且要考虑不同的硬件配置。首先,我得回顾一下用户提供的引用资料,看看有没有相关的实现或者函数结构可以参考。 用户提到了三个引用,其中引用[1]和[3]是关于STM32使用硬件I2C读写EEPROM的内容,而引用[2]是基于STC8H系列单片机的EEPROM操作。这两个不同的硬件平台可能在函数实现上有差异,比如STM32可能使用HAL库的函数,而STC8H可能直接操作寄存器或者有自己的库函数。 首先,我需要确定`UserCommonEepromWrite`这个函数可能的实现方式。通常,EEPROM的写操作需要考虑几个步骤:初始化I2C总线、发送设备地址、发送要写入的内存地址、发送数据,以及处理可能的等待时间(因为EEPROM写入需要一定时间完成)。此外,不同的EEPROM可能有不同的页写入限制,需要分页写入。 接下来,根据引用[3]中的示例,STM32使用HAL库的`HAL_I2C_Mem_Write`函数,这可能需要设备地址、内存地址、数据长度和数据内容。而引用[2]中的STC8H单片机可能有自己的函数,比如`EepromWrite`,需要地址和数据作为参数。 所以,通用的`UserCommonEepromWrite`函数可能需要根据不同的硬件平台进行条件编译或者使用不同的底层函数。例如,使用宏定义来区分不同的硬件,或者通过函数指针调用不同的底层驱动。 然后,考虑函数的参数和返回值。通常,这样的函数可能需要传入要写入的地址和数据,返回一个状态(成功或失败)。用户提到的返回类型是`bit`,可能是指一个位变量,用来表示操作是否成功,这在某些嵌入式系统中常见,比如Keil C51中使用`bit`类型。 接下来,我需要考虑可能的错误处理,比如I2C总线是否繁忙、ACK是否收到、写入后的延迟等。例如,在写入后需要等待EEPROM完成内部写周期,可以通过查询或者延时实现。 此外,不同EEPROM的地址长度可能不同,比如有的使用16位地址,有的使用8位地址。函数需要处理不同的地址长度,可能通过参数类型或者硬件配置选项来区分。 现在,我需要将这些思考整合成一个通用的函数框架,并解释如何根据不同的硬件配置进行适配。可能需要举例说明在STM32和STC8H上的不同实现方式,或者如何通过条件编译来切换底层驱动。 最后,用户可能想道如何调用这个函数,以及在不同情况下需要注意的事项,比如分页写入、地址对齐、错误重试机制等。这些都需要在回答中详细说明,确保用户能够正确使用该函数进行EEPROM写入操作。</think>### 解析`UserCommonEepromWrite`函数实现 #### 一、函数基本结构 典型的EEPROM写操作函数需包含以下核心要素: ```c bit UserCommonEepromWrite(uint addr, uchar data) { // 1. 总线启动与地址验证 // 2. 发送设备地址+写模式 // 3. 发送目标存储单元地址 // 4. 写入数据字节 // 5. 总线终止与延时等待 // 返回操作状态(成功=1/失败=0) } ``` #### 二、多硬件平台适配方案 ##### 1. STM32硬件I2C模式(引用[1][3]) 使用HAL库函数实现底层操作: ```c bit UserCommonEepromWrite(uint addr, uchar data) { HAL_StatusTypeDef status; status = HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDR, addr, I2C_MEMADD_SIZE_16BIT, &data, 1, HAL_MAX_DELAY); return (status == HAL_OK) ? 1 : 0; } ``` **注意点**: - `I2C_MEMADD_SIZE_16BIT`需匹配EEPROM地址长度[^3] - 设备地址需左移1位(HAL库自动处理R/W位) - 写入后需延时5-10ms(AT24C02要求) ##### 2. STC8H内置EEPROM(引用[2]) 直接操作特殊功能寄存器: ```c bit UserCommonEepromWrite(uint addr, uchar data) { EepromWrite(addr, data); // 调用厂商库函数 EA = 0; // 关闭总中断 IAP_TRIG = 0x5A; // 触发写入操作 IAP_TRIG = 0xA5; EA = 1; // 恢复中断 return (IAP_CONTR & 0x08) ? 0 : 1; // 检测写状态 } ``` **特性**: - 无I2C协议层操作 - 需严格遵循时序要求[^2] - 擦除操作需单独执行(字节写入前自动擦除) #### 三、通用封装建议 ```c bit UserCommonEepromWrite(uint addr, uchar data) { #if defined(STM32_PLATFORM) // HAL库实现 #elif defined(STC8H_PLATFORM) // 寄存器级操作 #else #error "Unsupported hardware platform" #endif // 统一错误处理 if(/* 超时检测 */) return 0; // 写入后延时 Delay_ms(10); return 1; } ``` #### 四、使用示例 ```c // 写入配置参数到0x100地址 bit result = UserCommonEepromWrite(0x0100, 0xAA); if(result) { // 写入成功处理 } else { // 错误处理流程 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值