IIC与E2PROM通信实验
IIC工作逻辑图
IIC中事件标志

从发送器
在接收到地址和清除ADDR位后,从发送器将字节从DR寄存器经由内部移位寄存器发送到SDA 线上。

说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,
EVx=事件(ITEVFEN=1时产生中断)
| 事件名称 |
事件产生原因 |
含义 |
如何清除事件标志位 |
| EV1 |
ADDR=1,收到地址且地址匹配 |
地址已被发送(主模式)/地址匹配(从模式) |
读SR1然后读SR2将清除该事件(即先读SR1后读SR2这样ADDR就会被置位0) |
| EV3-1 |
TxE=1,移位寄存器空,数据寄存器空 |
未发送任何数据或者刚发送完地址数据(在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设置该位) |
软件写数据到DR寄存器可清除该位;或在发生一个起始或停止条件后 |
| EV3 |
TxE=1,移位寄存器非空,数据寄存器空 |
正在将DR数据寄存器存储的数据通过移位寄存器转移至SDL数据总线上,即正在发送数据 |
写DR数据寄存器将清除该事件 |
| EV3-2 |
AF=1,应答失败,数据传输中断 |
停止数据传输(当没有返回应答(返回NACK空应答信号)时,硬件将置该位为’1’) |
在SR1寄存器的AF位写’0’可清除AF位,或者当我们再次使能IIC设备时,AF位自动清除 |
注意:
① EV1和EV3-1拉长了SCL低电平时间,也就是说如果我们不清除这两个事件的标志位,那么从发送器是不会发送信息的,如果我们不清除这两个事件,那么SCL上的电平会被无限拉低,这导致信息发送不出去;
② AF位不用手动清除也是可以的,AF标志一旦出现说明我们的IIC传输已经结束,IIC传输再次使能建立时,AF位可以被自动清除;
③ EV3事件标志只会在数据传输时出现,一个字节数据传输完后,EV3事件会自动消失。
| 事件标志 |
事件名称 |
介绍 |
| 从发送 |
||
| I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED |
EV1 |
成功发送地址 |
| I2C_EVENT_SLAVE_BYTE_TRANSMITTED |
|
成功传输一个字节数据 |
| I2C_EVENT_SLAVE_BYTE_TRANSMITTING |
EV3 |
正在传输一个字节 |
| I2C_EVENT_SLAVE_ACK_FAILURE |
EV3_2 |
应答失败/停止传输 |
从接收器
在接收到地址并清除ADDR(为了清除EV1事件标志)后,从接收器将通过内部移位寄存器从SDA线接收到的字节存进DR 寄存器。

说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应, EVx=事件(ITEVFEN=1时产生中断)
| 事件名称 |
事件产生原因 |
含义 |
如何清除事件标志位 |
| EV1 |
ADDR=1(在接收时,当数据寄存器不为空,该位被置’1’。在接收地址阶段,该位不被置位) |
成功接收发送器地址,建立数据传输联系 |
读SR1然后读SR2将清除该事件 |
| EV2 |
RxNE=1(数据寄存器非空(接收时)) |
接收数据非空 |
读DR数据寄存器将清除该事件 |
| EV4 |
STOPF=1(停止条件检测位(从模式)) |
检测到停止条件 |
读SR1然后写CR1寄存器将清除该事件 |
| 事件标志 |
事件名称 |
介绍 |
| 从接收 |
||
| I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED |
EV1 |
从模式下,成功接收地址 |
| I2C_EVENT_SLAVE_BYTE_RECEIVED |
EV2 |
从模式下,成功接收一个字节数据 |
| I2C_EVENT_SLAVE_STOP_DETECTED |
EV4 |
从模式下,接收停止 |
主发送器

说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应, EVx=事件(ITEVFEN=1时产生中断)。
| 事件名称 |
事件产生原因 |
含义 |
事件标志位如何清除 |
| EV5 |
SB=1 |
起始条件以发送,已占用总线 |
读SR1然后将地址写入DR寄存器将清除该事件 |
| EV6 |
ADDR=1,地址发送成功 |
主模式下,第一个含有地址传输方向的数据发送成功 |
读SR1然后读SR2将清除该事件 |
| EV8_1 |
TxE=1(在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设置该位),移位寄存器空,数据寄存器空 |
主模式下,刚发送完地址数据,还未发送正式的数据 |
写DR数据寄存器 |
| EV8 |
TxE=1(在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设置该位),移位寄存器非空,数据寄存器空 |
主模式下,表示数据已写入数据寄存器并正在移出 |
写入DR寄存器将清除该事件 |
| EV8_2 |
TxE=1,BTF=1,请求设置停止位 |
不想发送数据了,等待停止信号,即一个字节传输完成后传输出现间隔 |
TxE和BTF位由硬件在产生停止条件时清除 |
注意:
① EV6,EV8_1和EV5如果不清楚对应的事件标志位,那么该事件就会一直存在,EV5事件标志不清楚就无法进行“地址与传输方向”数据的传输,EV6和EV8_1事件标志位不清楚就无法进行以后的正常数据传输;
② EV6事件的检测如果加上BTF一个字节传输完成标志可以更加精确的判断第一个字节数据已经发送完毕;
③ 当TxE或BTF位置位时,停止条件应安排在出现EV8_2事件时,即当我们判断EV8_2事件发生时,我们可以发送停止传输信号;
④ 在DR寄存器中写入最后一个字节后,通过设置STOP位产生一个停止条件(见图245的EV8_2), 然后I2C接口将自动回到从模式(M/S位清除)-I2C默认工作在从模式;
⑤ EV8_2也比EV8更适合于最后一次数据传输的测试(停止条件生成之前)。
⑥ ADDR被置1的条件:
⑴ 7位地址模式时,当收到地址的ACK后该位被置’1’(主模式);
⑵ 当收到的从地址与OAR寄存器中的内容相匹配;
⑦ 主发送模式通信关闭方式:
在DR寄存器中写入最后一个字节后,通过设置STOP位产生一个停止条件(见图245的EV8_2), 然后I2C接口将自动回到从模式(M/S位清除)。
| 事件标志 |
事件名称 |
介绍 |
| 主发送 |
||
| I2C_EVENT_MASTER_MODE_SELECT |
EV5 |
模式为“主模式” |
| I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED |
EV6 |
模式为“主发送” |
| I2C_EVENT_MASTER_BYTE_TRANSMITTED |
EV8_2 |
主模式下,字节传输完毕 |
| I2C_EVENT_MASTER_BYTE_TRANSMITTING |
EV8 |
主模式下,一个字节正在发生 |
主接收器

说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应, EVx=事件(ITEVFEN=1时产生中断)
| 事件名称 |
事件发生条件 |
含义
|
事件标志为清楚方式 |
| EV5 |
SB=1 |
起始条件发送成功 |
读SR1然后将地址写入DR寄存器将清除该事件 |
| EV6 |
ADDR=1,地址发送完成标志置位 |
接收地址成功与目标地址匹配 |
读SR1然后读SR2将清除该事件 |
| EV7 |
RxNE=1(在接收时,当数据寄存器不为空,该位被置’1’。在接收地址阶段,该位不被置位),接收数据非空 |
正在接收数据 |
读DR寄存器清除该事件 |
| EV7_1 |
RxNE=1(在接收时,当数据寄存器不为空,该位被置’1’。在接收地址阶段,该位不被置位),接收数据非空 |
最后一个字节正在发送,接下来应该设置ACK=0和STOP请求了 |
读DR寄存器清除该事件 |
注意:
① 主机必须等待事件EV7完成,然后读取从设备接收的数据(I2C_ReceiveData()函数);
② EV7主模式一个字节传输完成事件检测的同时应检测,是否已经完成传输一个字节(检查SR1状态寄存器的BTF标志);
③ 主接受模式通信关闭方式:
主设备在从从设备接收到最后一个字节后发送一个NACK。接收到NACK后,从设备释放对SCL 和SDA线的控制;主设备就可以发送一个停止/重起始条件。
● 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第 二个RxNE事件之后)必须清除ACK位;
● 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个 RxNE事件之后)设置STOP/START位;
● 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的 产生位。 在产生了停止条件后,I 2 C接口自动回到从模式(M/SL位被清除);
| 事件标志 |
事件名称 |
介绍 |
| 主发送 |
||
| I2C_EVENT_MASTER_MODE_SELECT |
EV5 |
模式为“主模式” |
| I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED |
EV5 |
模式为“主接收” |
| I2C_EVENT_MASTER_BYTE_RECEIVED |
EV7 |
主模式下,一个字节接收完毕 |
IIC的状态标志
| 状态标志 |
状态位1/0代表的含义 |
| I2C_FLAG_TRA |
0:接收到数据; 1:数据已发送; |
| I2C_FLAG_BUSY |
0:在总线上无数据通讯; 1:在总线上正在进行数据通讯; |
| I2C_FLAG_MSL |
0:从模式; 1:主模式; |
| I2C_FLAG_TIMEOUT |
0:无超时错误; 1 : SCL 处于低已达到 25ms( 超 时 ) ;或者主机低电平累积时钟扩展时间超过 10ms(Tlow:mext);或从设备低电平累积时钟扩展时间超过25ms(Tlow:sext); |
| I2C_FLAG_AF |
0:没有应答失败; 1:应答失败; |
| I2C_FLAG_RXNE |
0:数据寄存器为空; 1:数据寄存器非空; |
| I2C_FLAG_STOPF |
0:没有检测到停止条件; 1:检测到停止条件; |
| I2C_FLAG_BTF |
0:字节发送未完成; 1:字节发送结束; |
| I2C_FLAG_ADDR |
0:地址不匹配或没有收到地址; 1:收到的地址匹配(从模式)/ 0:地址发送没有结束; 1:地址发送结束(主模式) |
| I2C_FLAG_SB |
0:未发送起始条件; 1:起始条件已发送 |
| I2C_FLAG_BERR |
0:无起始或停止条件出错; 1:起始或停止条件出错 |
| I2C_FLAG_OVR |
0: 无过载/欠载; 1: 出现过载/欠载 |
注:
① TIMEOUT—超时或Tlow错误,对应的处理方式:
⑴ 当在从模式下设置该位:从设备复位通讯,硬件释放总线;
⑵ 当在主模式下设置该位:硬件发出停止条件;
⑶ 该位由软件写’0’清除,或在PE=0(I2C失能)时由硬件清除;
② AF—应答失败,在那种情况下被置位:
当没有返回应答(NACK)时,硬件将置该位为’1’;
③ 如果使用I2C_ClearFlag函数清楚不了状态标志位,就仔细看看特定位的清楚方式,例如:ADDR位的清除方式是“读取SR1然后读取SR2”;
④ OVR状态标志位置位原因:
⑴ 在接收模式中当收到一个新的字节时(包括ACK应答脉冲),数据寄存器里的内容还未被读 出,则新接收的字节将丢失;
⑵ 在发送模式中当要发送一个新的字节时,却没有新的数据写入数据寄存器,同样的字节将被发送两次。
IIC的中断标志
| 中断标志 |
中断含义 |
| I2C_IT_TIMEOUT |
超时中断 |
| I2C_IT_AF |
应答失败/停止数据传输中断 |
| I2C_IT_TXE |
发送数据为空中断 |
| I2C_IT_RXNE |
接受数据为空中断 |
| I2C_IT_STOPF |
检测到停止信号中断 |
| I2C_IT_BTF |
一个字节发送完毕中断 |
| I2C_IT_ADDR |
地址发送成功(从模式)/地址接收成功且匹配(主模式)中断 |
| I2C_IT_SB |
起始位传输成功中断 |
| I2C_IT_BERR |
总线错误中断 |
| I2C_IT_OVR |
过载错误(欠过载/过载) |
注意:
① 如果用I2C_ClearITPendingBit函数清除不了对应的中断标志位,那就看看该中断涉及哪些状态标志位,然后了解这些状态标志位的清楚方式,例如:ADDR位的清除方式是“读取SR1然后读取SR2”;
② BERR总线错误标志位置位和清除方式:
⑴ 置位:当接口检测到错误的起始或停止条件,硬件将该位置’1’;
⑵ 置零:该位由软件写’0’清除,或在PE=0时由硬件清除;
③ OVR过载错误触发条件:

占空比对于I2C的重要性
通常来讲,Clock 都是以占空比为 50%来输出的。前面提到过,I2C 通信过程中,SCL 为低电平时,SDA 的数据信号会进行改变;SCL 为高电平时,SDA 上保持数据信号。因此,若高电平持续时间过短,可能导致数据来不及读取,信号状态就发生了改变,因而数据传输不准确;若高电平持续时间过长,虽然保证了数据的有效性,但通信效率变低,所以合理的占空比对 I2C 通信是很重要的。
三种常见的IIC总线错误
BERR总线错误
在一个地址或数据字节传输期间,当I2C接口检测到一个外部的停止或起始条件则产生总线错误,即当传输数据的过程中,还未完成一次传输时,这时候来了一个起始信号或者停止信号。此时BERR错误产生,BERR错误产生后:
● BERR位被置位为’1’;如果设置了ITERREN位,则产生一个中断;
● 在从模式情况下,数据被丢弃,硬件释放总线:
─ 如果是错误的开始条件,从设备认为是一个重启动,并等待地址或停止条件。
─ 如果是错误的停止条件,从设备按正常的停止条件操作,同时硬件释放总线。
● 在主模式情况下,硬件不释放总线,同时不影响当前的传输状态。此时由软件决定是否要 中止当前的传输。
AF应答失败
当接口检测到一个无应答位(NACK)时,产生应答错误(AF)。此时:
● AF位被置位,如果设置了ITERREN位,则产生一个中断;
● 当发送器接收到一个NACK时,必须复位通讯:
─ 如果是处于从模式,硬件释放总线。
─ 如果是处于主模式,软件必须生成一个停止条件。
OVR过载错误
① 在从模式下,如果禁止时钟延长,I 2 C接口正在接收数据时,当它已经接收到一个字节 (RxNE=1),但在DR寄存器中前一个字节数据还没有被读出,则发生过载错误。此时:
● 最后接收的数据被丢弃;
● 在过载错误时,软件应清除RxNE位,发送器应该重新发送最后一次发送的字节。
② 在从模式下,如果禁止时钟延长,I2C接口正在发送数据时,在下一个字节的时钟到达之前,新 的数据还未写入DR寄存器(TxE=1),则发生欠载错误。此时:
● 在DR寄存器中的前一个字节将被重复发出;
● 用户应该确定在发生欠载错时,接收端应丢弃重复接收到的数据。
发送端应按I2C总线标准 在规定的时间更新DR寄存器。 在发送第一个字节时,必须在清除ADDR之后并且第一个SCL上升沿之前写入DR寄存器;如果 不能做到这点,则接收方应该丢弃第一个数据。
状态标志位+中断允许标志位=中断


E2PROM简介
E2PROM器件地址

我们知道,挂接在 I2C 总线上的器件是依赖其地址来进行定位的,器件地址由类型码 和地址码两部分所构成。对于 7 位地址模式的器件而言:
类型码(bit7~bit4)表明器件的类别,如 I2C EEPROM 为 1010,I2C 温度传感器类型 编码为 1001,这一部分由器件厂商生产时写入。
地址码(bit3~bit1):由用户进行电路设计时确定,如图 8-13 的连接关系,A2A1A0 (bit3~bit1)=000。
最低位 bit0 表示读写方向,bit0=1 时表示读,bit0=0 时表示写,因此不属于地址位。
因此,器件地址是0x.
E2PROM与I2C总线连接图

连接引脚以及引脚属性配置


EEPROM与IIC通信的代码讲解
EEPROM相关GPIO初始化
// 端口引脚定义 #define IIC_SCL_Pin GPIO_Pin_6 #define IIC_SDA_Pin GPIO_Pin_7 #define IIC_Port GPIOB // PB6,PB7引脚IIC初始化 void EEPROM_GPIO_InitConfig() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // GPIOB时钟使能 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Pin = IIC_SCL_Pin | IIC_SDA_Pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_Port, &GPIO_InitStructure); }
讯享网


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/65092.html