首页 > 编程知识 正文

ht16c21驱动电路,I2C接口协议

时间:2023-05-04 16:25:24 阅读:185247 作者:1478

        之前工作中使用了一些常见的接口协议,为了防止遗忘和加深记忆,后续会陆陆续续讲解分析各种常见的接口协议(如:I2C、SPI、USART等)。由于最近项目需求,需要使用HT16C22液晶驱动芯片,而这款芯片和MCU通信使用的是I2C接口,所以本文首先以HT16C22入手,分析I2C接口协议。

        对于初学者你是不是也有这种疑惑,这些常见接口协议看那些协议的资料总是云里雾里,不知所云,看了就忘。本人刚学也有这种困惑,为了解决这种现状你必须得实际动手去实践,在实践中摸索分析才能真正理解。

一、何为I2C接口协议

        在这里我不详细解释何为I2C,大家可以去参考其他人写的博客有具体分析I2C。这里我们以实际应用中分析I2C是如何实现在不同IC之间通讯。

        你可能需要的两个最基本的概念:

起始信号:当 SCL 线是高电平时 SDA 线从高电平向低电平切换。 
停止信号:当 SCL 线是高电平时 SDA 线由低电平向高电平切换。

二、I2C驱动常用的几个基本函数

2.1  起始信号代码

//产生IIC起始信号void IIC_Start(void){SDA_OUT(); IIC_SDA=1; IIC_SCL=1;delay_us(4); IIC_SDA=0; delay_us(4);IIC_SCL=0; //钳住I2C总线,准备发送或接收数据}

2.2  停止信号代码

//产生IIC停止信号void IIC_Stop(void){SDA_OUT();IIC_SCL=0;IIC_SDA=0; delay_us(4);IIC_SCL=1; IIC_SDA=1;delay_us(4); }

2.3  CPU产生一个ACK信号

//等待应答信号到来//返回值:1,接收应答失败// 0,接收应答成功uint8_t IIC_Wait_Ack(void){uint8_t ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA=1; delay_us(1); IIC_SCL=1; delay_us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0 return 0; }

2.4  CPU向I2C总线设备发送一个字节(8bit)数据

//IIC发送一个字节//返回从机有无应答//1,有应答//0,无应答 void IIC_Send_Byte(uint8_t txd){ uint8_t t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { if((txd&0x80)>>7) { IIC_SDA=1; } else IIC_SDA=0; txd<<=1; delay_us(2); IIC_SCL=1;delay_us(2); IIC_SCL=0;delay_us(2); } }

        除了以上几个基本函数外,还有几个常用函数在这里由于不参与分析就不列举了。 在以上几个函数的基础上,我们再来具体分析HT16C22的初始化过程。 

三、HT16C22初始化过程分析

        首先用示波器抓取HT16C22初始化过程的波形曲线:

HT16C22初始化过程波形曲线 //HT16C22初始化void HT16C22_Init(void){ IIC_Start(); IIC_Send_Byte(HT16C22_Address); IIC_Wait_Ack(); IIC_Send_Byte(0x8C);// DrvModeSet 0x8C 80Hz,turn on sys and LCD bias,1/3 bias IIC_Wait_Ack(); IIC_Send_Byte(0xC0);// Blink 0xC0 //关闭闪烁 IIC_Wait_Ack(); IIC_Stop();}

我们可以把上面这个过程拆分为10个阶段 。

①  起始空闲阶段。

这个阶段中SCL和SDA都处于高电平;

②起始信号(MCU开始往HT16C22发送数据)

这个阶段中,SCL保持高电平不变,而SDA由高电平跳变至低电平;

③发送HT16C22的器件地址和I2C写数据指令

在这个阶段中,SCL每次跳变至高电平时,会将SDA数据发送给HT16C22。从图中可以看出发给HT16C22的数据为01111110。其中第一位至七位为HT16C22器件地址(0x7E),第一位为0表示:写数据指令。

④等待返回Ack

这个阶段中,MCU等待HT16C22返回低电平表示数据接收成功。

⑤发送0x8C

这个阶段将数据0x8C发送给HT16C22,至于为什么是0x8C感兴趣可以翻看HT16C22手册。

⑥等待返回Ack

同第④

⑦发送0xC0

这个阶段将数据0xC0发送给HT16C22,至于为什么是0xC0感兴趣可以翻看HT16C22手册。

⑧等待返回Ack

同第④

⑨结束信号

这个阶段中,SCL保持高电平不变,而SDA由低电平跳变至高电平;

⑩空闲阶段

此阶段同起始空闲阶段;

 

自此,HT16C22初始化数据成功被MCU发送给HT16C22。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。