GPIO模拟I2C快速入门 与程序实现
http://jinren1010.spaces.eepw.com.cn/articles/categorys/
/****************************************************************************************************************************************************************************/
LCD调试中的常见问题以及注意事项 2009-07-07 14:33:07
功能:Init、SleepIn、SleepOut、DisplayOn、DisplayOff 注意事项: LCD的调试中,延时特别重要,一定要确定延长的时间足够,特别是更改电压寄存器后面的延时。记得有一次屏幕出现抖动的现象,一直查不出原因,厂家从日本派了2次来人,都没解决;最后,把所有的时序测试出来,发现延时不足,影响延时的一个函数传递参数错了。 1. 初始化前需要一个延时(大概为10ms),使Reset稳定; 2. 如果出现花屏现象,很大的可能是总线速度问题; 3. 如果屏幕闪动比较明显,可以通过调整电压来稳定,一般调节的电压为VRL、VRH、VDV和VCM;这些电压也可以用来调节亮暗(对比度); 4. 调节对比度时,也可以通过调节Gamma值来实现,要调节的对象为:PRP、PRN、VRP、VRN等; 5. 注意数据是8位、16位时,写命令和数据的函数注意要变化; 6. 如果调试时发现LCD的亮度有问题,首先检查(考虑)提供给LCD的电流是否一致,再考虑调节电压。 7. 开机花屏问题,最简单的处理方式就是在INIT结束的地方增加一个刷黑屏的功能。 8. 如果随机出现白屏问题,一个可能是静电问题,把LCD拿到头发上擦几下,如果很容易出现白屏那肯定就是静电问题了。另外一个在有Backend IC的情况下,也有可能bypass没处理好。 9. 还碰到过一个问题,写PLL的寄存器写了2次,屏幕就抖动的很厉害。这个问题应该跟LCD内部实现有关了,并不是每个都会。 |
/****************************************************************************************************************************************************************************/
由于一般的I2C应用速率并不高(400kbps),使用处理器的IO口模拟I2C波形,完全可以胜任(处理器一般担任Master,占有I2C通信的控制权,无需担心随机的I2C通信服务中断其他任务的执行)。
处理器分配给I2C任务的IO口,要求可以输出高低电平,还能配置为输入端口。处理器根据总线规范以及从设备的时序要求,利用2条IO信 线,模拟I2C接口时序波形,进行I2C通信。
处理器发送数据时,通过IO口输出高电平,上升时间基本与外部上来电阻阻值无关,且比用外部上拉电阻上拉到高电平快很多。处理器在接受数据时,即便上拉电阻阻值选的大一些,从设备输出数据的波形上升沿缓慢,但由于处理器使用软件采样的而非硬件采样,因此,对数据传输的结果并不影响。也就是说,使用IO口模拟I2C时序时,上拉电阻阻值可以适当选的大一些。
需要指出的是,使用软件模拟最多只能完成单Master的应用,对于多Master应用,由于需要进行总线控制权的仲裁管理,使用软件模拟的方法很难完成。
I2C总线空闲的时候,两条信 线应该维持高电平。否则,上拉电阻上会有耗电。特别是在上电过程中,IO线上电平也应保持在高电平状态。也就是说:当Master的I2C使用的是IO软件模拟时,一定要保证该两个IO上电默认均为输入(或高阻)或者输出高电平,切不可默认为输出低电平。IO默认为输入时,可以通过外部上拉电阻将I2C信 线拉至高电平。
GPIO模拟I2C快速入门 与程序实现. I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信 线:SerialClock(简称SCL)和SerialData(简称SDA)。I2C是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。 在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,不发送ACK,有时可以起到减少系统开销的效果。 源码: /********************************************************************/ void i2c_init(void) SCL_high; /********************************************************************/ uint8 i2c_write(uint8 slave_address, uint8 *buffer, int byte_count, int freq) /* Set delay value based on frequency. */ slave_address = (slave_address & 0xFE); delay(2*D); /********************************************************************/ uint8 i2c_read(uint8 slave_address, uint8 *buffer, int byte_count, int freq) /* Set delay value based on frequency. */ slave_address = (slave_address | 0x01); delay(2*D); /********** Begin Read Procedure **********/ /* Release SDA and SCL to initiate transfer. */ for(i = 0; i < byte_count; i++) /* Write input byte to “read_buffer”. */ /* Standard protocol calls for the last read byte to /********************************************************************/ void i2c_start(void) PADAT_init; PADAT_init; /* Clock stretching wait. Wait until clock is released /********************************************************************/ uint8 i2c_stop(void) PADAT_init; /* Clock stretching wait statement. Wait until clock is released /********************************************************************/ void delay(int value) /********************************************************************/ |
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114025 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!