类I2C介绍 及需要应用注意事项

类I2C介绍

一般显示驱动芯片采用了类I2C接口,可通过MCU与显示驱动芯片进行通信,类I2C总线具有低功耗、抗干扰强、传输距离长等优点,相比于标准I2C,不需要寻址操作,操作更加简单。下面将对类I2C通信及注意事项进行说明。

分类

I2C接口有与标准I2C接口相同的start和stop信号,无从机地址,部分电路有与标准I2C接口相同的应答信号。主要分为以下两类:

  1. 无应答信号ACK位,以AiP1640、AiP33624、AiP33620等电路为例;

  1. 有应答信号ACK位,以AiP650、AiP1637等电路为例。

通信介绍

(1)无应答信号的类I2C介绍

以AiP33624为例:

◆start和stop信号

start信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

stop信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

◆数据位的有效性规定

在进行数据传送时,在SCL的上升沿锁存数据,SCL为高电平期间,SDA线上的数据必须保持稳定,只有在SCL线上的信号为低电平期间,SDA线上的数据状态才允许改变,且SDA线上的数据不能在SCL为下降沿改变。

◆单字节通信

单字节通信中8个时钟一个周期,高位在前。

◆多字节通信

在多字节通信时,第一个字节为指令,第二个字节开始是RAM的数据。第二个字节开始,数据会从地址0x00开始,依次存入RAM中。

(2)有应答信号的类I2C介绍

以AiP650为例:

AiP650电路与AiP33624相比,有相同的start、stop信号和数据位有效规定。AiP650在传输数据的过程中,在时钟线的第九个时钟,芯片内部会产生一个应答信号ACK将DIO管脚拉低。无论是命令写入或者是数据写入读出时,在一个8位字节后的第9位都是ACK信号输出。

常见问题及处理办法

(1)ACK半高问题

◆ 常见不良现象

在有ACK应答信号的通讯波形中,会发现ACK信号存在“半高波形”,严重的会影响信号识别,例如AiP650电路应用中会存在ACK“半高”导致无显示问题。

◆原因

  • 若读取ACK时主控未将SDA端口设置为输入,而是保持为高电平输出,AiP650会在ACK应答时会返回低电平,因此会造成电平冲突存在半高波形,严重时甚至影响功能。

  • 若读取ACK信号时将SDA设为输入状态后,又通过指令SDA端口置高,同样造成电平冲突存在半高波形,导致ACK信号出现异常。

◆改善措施

在读取ACK时,需将主控的SDA端口设置为输入模式,建议设为高阻输入。

(2)初始化处理

◆常见不良现象

初始化第一条指令未识别,导致功能异常。例如AiP33624方案中曾出现第一条指令全局亮度未识别,导致整体亮度偏暗。AiP5908、AiP5916等电路需要注意此问题。

◆原因

初始化可能存在如下两个状态:

  • 当执行端口初始化程序时,为了执行子函数,在子函数运行前将SCL和SDA的端口置低,但该操作误写入一个start信号,如下图所示。

  • 整机上电时,MCU端口电平可能处于不可控状态,此时的SCL、SDA电平则有可能在通信初期识别为start信号,如下图所示。

前两种状态均在正常指令前多一个异常start信号,即:出现连续两个start信号。当识别第一个start信号时,总线被占用,后一个start信号则被识别为数据信号,导致第一条指令识别错误。常见的异常波形如下所示:

◆改善措施

  • 建议上电后第一条指令或初始化部分写2遍,做好防错机制,避免信号识别错误,增强抗干扰能力。

  • 可在第一条指令前增加1个结束信号,以释放通信总线。

(3)时钟频率注意事项

由于频率越快越容易受到干扰,建议时钟频率保持在1MHz以下,若说明书有特殊说明,请参照说明书。如AiP33624、AiP33620、AiP33616说明书注明建议时钟频率大于100KHz。

(4)AiP33624系列通信注意事项

在对AiP33624(AiP33620、AiP33616)电路进行通信时,第七个时钟和第八个时钟不可暂停通信。

上图所示标注时段,不管是从“指令RAM数据”或“RAM数据RAM数据”,从一组通信数据的第7个时钟开始,到下一组通信数据的第1个时钟上升沿期间,内部显示地址总线将被通信接口模块占用,此时将暂停显示。因此如果主机在第7和第8个时钟时暂停通信,会导致显示暂时关闭。

(5)推荐外围接法

建议通讯端口串联220Ω电阻,接100pF对地电容,10K上拉电阻,增强抗干扰能力;建议靠近IC放置。

(6)初始化中显示RAM区处理

在上电完成后,需对所有的显示RAM进行数据写入,然后再开显示,避免因显示RAM数据未清导致的显示异常。

(7)SDA、SCL边沿问题

◆常见不良现象

SDA在SCL的上升沿变化时,容易导致数据识别错误。

◆原因

SDA在SCL的边沿变化,SDA与SCL边沿存在交叉,若交叉点位于翻转电平附近,易受干扰导致数据识别错误。如图所示:

◆改善措施

建议SDA在SCL低电平变化,避免在SCL边沿变化,增强抗干扰能力。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STC8G1K08A是深圳曙光微电子有限公司推出的一款8051系列单片机,它内置了I2C总线控制器,可以实现与其他I2C设备的通信。下面是一个关于STC8G1K08A的I2C范例程序的回答: STC8G1K08A的I2C范例程序主要是为了帮助开发者快速上手使用I2C总线功能。I2C是一种串行通信协议,适用于系统内部芯片之间的通信。范例程序通常包含了初始化I2C控制器、设置相关参数、发送和接收数据的代码片段。 在STC8G1K08A的I2C范例程序中,你可以找到以下内容: 1. 引入相关头文件和宏定义:范例程序中可能会引入一些与I2C相关的头文件,以及定义一些宏、常量等。 2. I2C初始化:范例程序会调用相关函数对I2C控制器进行初始化,设置相关的时钟、波特率等参数。 3. 数据发送和接收:范例程序通常会包含数据发送和接收的代码,用来测试与其他I2C设备的通信。 4. 错误处理:范例程序可能会加入一些错误处理机制,以确保程序的健壮性和稳定性。 5. 示例代码:范例程序中可能会包含一些示例代码,以演示如何使用I2C总线控制器进行读写操作等。 通过阅读这个范例程序,你可以了解到如何在STC8G1K08A上配置和使用I2C总线控制器,并了解到一些常见的操作和注意事项。但需要注意的是,范例程序通常只是给出一个基本的示例,实际使用时可能需要根据具体的应用场景进行适当的修改和优化。 ### 回答2: STC8G1K08A是一款单片机芯片,支持I2C通信协议。以下是一个I2C通信的范例程序: ```c #include <reg52.h> #include <intrins.h> sbit SDA = P2^0; // I2C数据线 sbit SCL = P2^1; // I2C时钟线 void I2C_Start() { SDA = 1; _nop_(); // 延时一个时钟周期 SCL = 1; _nop_(); SDA = 0; _nop_(); SCL = 0; } void I2C_Stop() { SDA = 0; _nop_(); SCL = 1; _nop_(); SDA = 1; _nop_(); } void I2C_SendByte(unsigned char byte) { unsigned char i; for (i = 0; i < 8; i++) { SDA = (byte & 0x80) ? 1 : 0; byte <<= 1; _nop_(); SCL = 1; _nop_(); SCL = 0; } // 等待从设备的应答 SDA = 1; _nop_(); SCL = 1; _nop_(); if (SDA == 1) { // 应答错误 } SCL = 0; } unsigned char I2C_ReceiveByte() { unsigned char byte = 0x00; unsigned char i; SDA = 1; _nop_(); for (i = 0; i < 8; i++) { SCL = 1; _nop_(); byte = (byte << 1) | SDA; SCL = 0; _nop_(); } return byte; } void I2C_Ack() { SDA = 0; _nop_(); SCL = 1; _nop_(); SCL = 0; _nop_(); SDA = 1; } void I2C_Nack() { SDA = 1; _nop_(); SCL = 1; _nop_(); SCL = 0; } void main() { unsigned char dataToSend = 0x55; unsigned char receivedData = 0x00; I2C_Start(); I2C_SendByte(0xA0); // 设备地址 + 写命令 I2C_Ack(); I2C_SendByte(0x00); // 写入数据的地址 I2C_Ack(); I2C_SendByte(dataToSend); // 写入数据 I2C_Ack(); I2C_Stop(); _nop_(); _nop_(); I2C_Start(); I2C_SendByte(0xA0); // 设备地址 + 写命令 I2C_Ack(); I2C_SendByte(0x00); // 读取数据的地址 I2C_Ack(); I2C_Start(); I2C_SendByte(0xA1); // 设备地址 + 读命令 I2C_Ack(); receivedData = I2C_ReceiveByte(); // 读取数据 I2C_Nack(); I2C_Stop(); while (1) { // 循环执行其他任务 } } ``` 以上是一个简单的I2C通信范例程序,主要实现了单片机向从设备写入字节数据,并读取从设备返回的数据。请根据具体的硬件电路和设备的I2C协议规范进行相应的修改和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值