这次的主题基于CSD202,CSD202是high voltage bi-directional的Power monitor,使用的IIC接口,所以我们这次从IIC开始讲起。CSD202的简要介绍如图1所示,
图1:CSD202 Subtitle
为了让程序尽可能的通用我们选择使用IO模拟的方式实现IIC便于大家移植。因为本程序基于无实物的模拟。
IIC的时序
图2:IIC 传输数据
图3:IIC启动/停止
用C语言模拟IIC时序
使用C语言模拟IIC时序代码如图4所示
图4: C语言模拟IIC数据传输
参考代码如下所示:
参考代码1:
#include <stdio.h>
|
运行以上代码后的执行结果如下所示:
SDA h SCL h SDA l IIC/Start /* 开始iic 传输,当SCL=1时候 SDA从1 到0 */
IIC Write Data SCL l SDA l SCL h SCL l SDA l SCL h SCL l SDA l SCL h SCL l SDA h SCL h SCL l SDA l SCL h SCL l SDA l SCL h SCL l SDA l SCL h SCL l SDA h SCL h /* 当SCL=0时候将数据准备好,在将SCL拉高 */
IIC/Stop
SDA l SCL h SDA h
/* 在SCL 等于0时候将SDA从0拉到1 */
进程已结束,退出代码0 |
代码运行结果
以上代码运行结果不等于实际,实际上还有个ACK信号,若是从机接受到主机的信号表示自己收到了,那么他会发个ACK出来,告诉你 “朕,知道了!”。在CSD203中完整的时序如图5所示:
图5:CSD203 Timing Diagram
在最开始的时候IIC先Start,然后开始写7位地址,第8位表示自己是要读还是要写,第9位是从机的应答。需要注意的是等待ACK的时候需要将SDA拉高后从机才可以拉低SDA表示自己接收到了。
但我们也不能无限制的等待ACK,等一段时间就不用等他了,他可能睡不醒了()。
我们继续在改进我们的代码直到能用。改进后的代码如下图6所示:
图6:改进后的代码
参考代码2:
u_int8_t IIC_Write(u_int8_t Data)
|
运行结果如下图所示:
图7:IIC 当R_SDA=0时候的运行结果
图8:IIC 当R_SDA=1时候的运行结果
以上ACK不ACK我们基本搞完了,我们可以开始传输完整的数据了,根据图5完整的传输流程得出以下代码,
参考代码3:
/* |
图9;参考代码3完整的CSD203传输流程
因为IIC的读取无法模拟,所以我们只能看0X00或者0XFF,所以我们就直接凭空捏造一个。
参考代码4:
u_int8_t IIC_Read(void)
|
图10:IIC 读取8bit 数据
图11:IIC读取运行结果
根据上面的结果得出IIC读取没啥问题,我们在去根据图12:去组合IIC的read 程序
图12:IIC读取时序
根据图12我们一步步去分解, //第一步,先写个地址,//第二步,先读取8bit数据并且发送ACK信号//第三步,继续读取8bit 在去发送ACK信号。
参考代码5:
/*
|
图13:IIC根据地址读取16bit数据
以上,IIC的时序就全部搞定了,后续咱们就按照这个去搞Analogysemi Power monitor,今天就先聊到这,以下是类比半导体Power Monitor的选型手册,种类较为丰富,大家自选!
参考文档
CSD203 Datasheet- Analogysemi
Analogysemi 选型手册
I2C-bus specification and user manual –NXP