STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9

         以前接触的都是车规级芯片,最近了解了一下STM32F1,用到了其IIC。听说STM32F1库函数的IIC有许多坑,很多人都推荐用IO模拟IIC,只能说这很“51”。上手两天发现,官方库函数的IIC是可以用的,这里介绍一下我解题思路。

        初调IIC,很容易陷入库函数中的死循环,为啥呢。EV5,EV6,EV7是啥,死循环干什么;查询了芯片手册,对症下药,一步一步调试,对症下药。

        芯片手册中有IIC的传送时序图,很重要。

主要介绍一下主模式,从模式可以下载芯片手册了解。

主模式涉及到了EV5,EV6,EV7,EV8,EV9等;【从模式涉及到了EV1,EV2,EV3,EV4等】

EV5:    SB=1,读SR1然后将地址写入DR寄存器将清除该事件。

EV6:    ADDR=1,读SR1然后读SR2将清除该事件。

EV6_1:  没有对应的事件标志,只适用于接受1个字节的情况。恰好在EV6之后,要清除响应和停止条件的产生位。

EV_7:  RxNE=1,读DR寄存器清除该事件。

EV7_1:  RxNE=1,读DR寄存器清除该事件。设置ACK=0和STOP请求。

EV8_1:  TxE=1,移位寄存器空,数据寄存器空,写DR寄存器。

EV8:    TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件。

EV8_2:  TxE=1,BTF=1,请求设置停止位。TxE,BTF位由硬件在产生停止条件时清除。

EV9: ADDR10=1, 读SR1然后写入DR寄存器将清除该事件。

EV_9:ADDR10=1,读SR1然后写入DR寄存器将清除该事件。

注:EV5,EV6,EV9,EV8_1,EV8_2事件拉低SCL低的事件,直到对应的软件序列结束。

EV7,EV8的软件序列必须在当前字节传输结束前完成。

EV6_1       或EV7_1的软件序列必须在当前传输字节的ACK脉冲之前完成。

STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9_第1张图片

STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9_第2张图片

 

STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9_第3张图片

STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9_第4张图片

STM32F1的IIC硬件调试之EV5,EV6,EV7,EV8,EV9_第5张图片

测试一段时间,没有出现陷入死循环的情况;

考虑安全性和可靠性,可以加入软件循环跳出,以防万一。

 

 

 

你可能感兴趣的:(嵌入式,程序开发,IIC通信,STM32F1,IIC,EV6,EV5)