接口/总线/驱动
大家好,这里是程序员 杰克 。一名平平无奇的嵌入式软件工程师。
上篇推文对I2C总线的特性进行了介绍和描述。对于开发者而言,最重要的是编码I2C的读写时序驱动。本篇推文主要总结和分享I2C总线主机端通信的编程实现思路,并不对应特定MCU的硬件I2C外设,此处需要加以区分。
下面正式进入本章推送的内容。
01 I2C读写时序分析
I2C读写时序操作
上篇推文已对I2C主机的读写时序进行了描述。对I2C基本读写时序如图所示:
在上图I2C总线(主机)的读写时序中,无论读/写操作,操作如下所示:
I2C读写时序拆解
对于软件开发者而言,编码上实现原则“高内聚低耦合”,即按模块独立编码。对上节的I2C总线(主机)的读写操作分析,主机需要单独实现如下操作:
02 I2C实现思路
对于I2C总线主机端的编码实现,主要是产生 起始信号 、 停止信号 、 应答/无应答信号 、 数据串行移位(读/写),下面便对各个实现进行描述。
生成起始和停止信号
起始信号和停止信号描述
I2C总线空闲时SDA和SCL皆为高电平,而起始信号和停止信号便是有别于空闲状态的特殊情况,如下图所示:
编程伪代码
//产生起始信号伪代码
void I2C_Start(void)
{
SCL = 1, SDA = 1;
持续一段时间;
SCL = 1, SDA = 0;
持续一段时间;
}
//产生停止信号伪代码
void I2C_Stop(void)
{
SCL = 0, SDA = 0;
持续一段时间;
SCL = 1;
SDA = 1;
持续一段时间;
}
应答信号/无应答信号
I2C总线通信中读/写1字节(8bit)数据操作后,会有应答/无应答信号。应答/无应答的时序如下图所示:
I2C总线主机端的应答信号/无应答信号的操作根据读时序/写时序有两种情况,主机实现以及伪代码如下所示:
读取1字节,主机发起应答/无应答信号给从机
写入1字节,主机等待从机的应答/无应答信号
数据串行移位(读/写)
对于数据的串行移位,其实现主要是在时钟SCL的驱动下,SDA信号线按MSB(高位在前、低位在后)将1字节(8bit)数据移位便可,如下图框内所示。此处不详细描述。
03 文章总结
本篇主要是分享杰克对I2C的读写时序以及编码实现思路。后续会总结和分享在FPGA、STM32上实现I2C的示例。
全部0条评论
快来发表一下你的评论吧 !