写在前面的话
好久没有来这边唠叨两句了,最近有好长一段时间都很烦躁,最主要的原因还是工作的事情,看见软件部的一些同事都走了,而且感觉公司在走向萧条,好久都没有什么新项目了,大家基本都很怠慢,而且有一年多了都没有涨薪,自己也感觉在这样呆下去,前途渺茫啊…
也一度积极地投递简历,搞得自己很忙的样子,而且久久也不能平静,最后获得了两家面试机会,或许初来咋到,对于跳槽没有什么概念,然后直接就被pass了一家,还有一家谈得很好获得了offer,一度心情激动地打算去,最后还是因为种种因素留了下来; 在工作中有这么一段插曲,或许也算正常,这对于个人的职业规划该有一个新的思考:谁都想找到那个成功的捷径,但捷径也需要沉淀,对于有些问题的思考真的还是不够…
在纠结,彷徨,迷茫中度过了很长一段时间, 是时候清醒了.
让我们回到正题吧, 前段时间, 有个项目用到一个正负压芯片:DCDC ISL98607EIAZ-T
, 这是一个通过I2C信号输入来控制芯片的电压输出大小的, 像我们调屏的, 遇到这么一个I2C控制器件, 肯定是一件好事了,在一个公司的职能分得很细的公司, 要多干点活, 还真是不太容易呢. 在我第一时间拿到板子时, 机械地开始调起来了, 缺少对新东西的思考, 总是走一步算一步, 这样是不对的, 往往会因为各种问题而碰壁.
GPIO模拟I2C的设计
其实在很多时候都不需要用GPIO来模拟I2C, Linux内核中对I2C支持很好, 只要稍微配置一下I2C地址就可以了, 也可以在内核已提供了I2C操作方法等基础上配置一下GPIO来实现模拟; 这个正负压芯片是LCD的供电设备, 只要使能了这个设备, 然后向该I2C设备地址写入某个值, 使输出电压达到LCD的供电要求, 然后再调试LCD的MIPI配置, 看看波形, 改改初始化代码和配置知道LCD点亮就OK了, 这基本就是我的工作.
I2C就两根线: SDA和SCL, 要实现模拟就需要两个GPIO分别模拟SDA和SCL, 然后按照I2C协议分别对GPIO1和GPIO2进行输入输出配置和拉高拉低设置:
- 起始和停止条件;
- 数据传输条件(接受和发送字节);
- 应答信号的处理;
下面是i2c的读写操作的时序队列:
主要实现的函数有
1. GPIO设置与清除
2. I2C的起始与停止
3. I2C的读写
4. I2C的应答
5. 实现I2C根据地址读写命令函数
6. 方法的调用
代码具体实现如下