[原创] Power Monitor by AnalogySemi

xutong   2022-10-2 09:04 楼主

这次的主题基于CSD202,CSD202是high voltage bi-directional的Power monitor,使用的IIC接口,所以我们这次从IIC开始讲起。CSD202的简要介绍如图1所示,

090258ptcd3yepdce11iic.png

图1:CSD202 Subtitle

为了让程序尽可能的通用我们选择使用IO模拟的方式实现IIC便于大家移植。因为本程序基于无实物的模拟。

IIC的时序

090258b776a74vb473744h.png

图2:IIC 传输数据

090258a1i8ggrxpuizgsuo.png

图3:IIC启动/停止

用C语言模拟IIC时序

使用C语言模拟IIC时序代码如图4所示

090258e87m7ex8ep7a7sgz.png

图4: C语言模拟IIC数据传输

参考代码如下所示:

参考代码1:

#include <stdio.h>
//#include "ADX122.h"
/* define pin*/
#define SCL_h printf(" SCL h \r\n")
#define SCL_l printf(" SCL l ")
#define SDA_h printf("SDA h")
#define SDA_l printf("SDA l")

void IIC_Start(void);
void IIC_Stop(void);
void IIC_Write(u_int8_t Data);

int main() {
IIC_Start();
IIC_Write(0x11);
IIC_Stop();
return 0;
}
void IIC_Start(void)
{
SDA_h;
SCL_h;
SDA_l;
printf("IIC/Start \r\n");
}
void IIC_Stop(void)
{
printf("IIC/Stop \r\n");
SDA_l;
SCL_h;
SDA_h;

}
void IIC_Write(u_int8_t Data)
{
printf("IIC Write Data\r\n");
for (int i = 0; i < 8; ++i) {
SCL_l;
if((Data&0X80)==0X80)
SDA_h;
else
SDA_l;
//Data左移一位
Data<<=1;
SCL_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所示:

090258k9ug70w0gvp7g9pp.png

图5:CSD203 Timing Diagram

在最开始的时候IIC先Start,然后开始写7位地址,第8位表示自己是要读还是要写,第9位是从机的应答。需要注意的是等待ACK的时候需要将SDA拉高后从机才可以拉低SDA表示自己接收到了。

但我们也不能无限制的等待ACK,等一段时间就不用等他了,他可能睡不醒了()。

我们继续在改进我们的代码直到能用。改进后的代码如下图6所示:

090258lsoyup7qigign0iy.png

图6:改进后的代码

参考代码2:

u_int8_t IIC_Write(u_int8_t Data)
{
// 设置一个wait等待ack信号
u_int8_t wait=0;
printf("IIC Write Data\r\n");
for (int i = 0; i < 8; ++i) {
SCL_l;
if((Data&0X80)==0X80)
SDA_h;
else
SDA_l;
//Data左移一位
Data<<=1;
SCL_h;
}
SCL_l;
SDA_h;
SCL_h;
while(R_SDA)
{
wait++;
if(wait==255)
{
//超时无应答关闭本次传输
IIC_Stop();
printf(" NACK\r\n");
return 1;
}
}
SCL_l;
printf("ACK \r\n");
return 0;
}

 

运行结果如下图所示:

090258cg8gzg8l8gy88unz.png

图7:IIC 当R_SDA=0时候的运行结果

090258un8mg38ag68gau67.png

图8:IIC 当R_SDA=1时候的运行结果

以上ACK不ACK我们基本搞完了,我们可以开始传输完整的数据了,根据图5完整的传输流程得出以下代码,

参考代码3:

/*
* IIC_DUT_W(u_int8_t DUT_ADDR,u_int8_t REG,u_int16_t Data)
* DUT ADDR 代表器件的地址 IIC总线上会有很多器件,如何确定他的地址通过
* DUT_ADDR 来锁定器件地址
* REG 代表CSD203的寄存器地址
* Data 代表要写入寄存器的数据
*/
void IIC_DUT_W(u_int8_t DUT_ADDR,u_int8_t REG,u_int16_t Data)
{
u_int8_t DataH,DataL;
//将高8位向右移8位
DataH=Data>>8;
//屏蔽掉高8位只保留低8位
DataL=Data&0X00ff;
//将最后1个bit设置为0表示对
//这个地址写数据
DUT_ADDR=DUT_ADDR&0XFE;
IIC_Start();
IIC_Write(DUT_ADDR);
IIC_Write(REG);
IIC_Write(DataH);
IIC_Write(DataL);
IIC_Stop();
}

090258bj5jlbc2bx782a3x.jpg

090258vrvzgvsgv90gzrgp.png

图9;参考代码3完整的CSD203传输流程

因为IIC的读取无法模拟,所以我们只能看0X00或者0XFF,所以我们就直接凭空捏造一个。

参考代码4:

u_int8_t IIC_Read(void)
{
u_int8_t Data;
for (int i = 0; i < 8; ++i) {
Data<<=1;
SCL_l;
if(R_SDA==1)
Data|=0X01;
SCL_h;
}
// ACK Signal
SCL_l;
SDA_l;
SCL_h;
return Data;
}

 

090258irbmm6pe009h8f34.png

图10:IIC 读取8bit 数据

090258sdpdgdtet66gg3mn.png

图11:IIC读取运行结果

根据上面的结果得出IIC读取没啥问题,我们在去根据图12:去组合IIC的read 程序

090258eznqdgk2lydykg2t.png

图12:IIC读取时序

根据图12我们一步步去分解, //第一步,先写个地址,//第二步,先读取8bit数据并且发送ACK信号//第三步,继续读取8bit 在去发送ACK信号。

参考代码5:

/*
* IIC 根据地址读取16bit 数据
*/
u_int16_t IIC_DUT_R(u_int8_t DUT_ADDR)
{
u_int16_t Data;
//将最后1个bit设置为1表示对
//这个地址读数据
DUT_ADDR=DUT_ADDR|0X01;
IIC_Start();
//IIC_Write(DUT_ADDR);
Data=IIC_Read();
//将数据往上移8bit
Data<<=8;
Data=IIC_Read();
IIC_Stop();
return Data;
}

 

090258qnlnn00nvn0zb30n.png

图13:IIC根据地址读取16bit数据

以上,IIC的时序就全部搞定了,后续咱们就按照这个去搞Analogysemi Power monitor,今天就先聊到这,以下是类比半导体Power Monitor的选型手册,种类较为丰富,大家自选!

090258ptcd3yepdce11iic.png

090258bj5jlbc2bx782a3x.jpg

参考文档

CSD203 Datasheet- Analogysemi

Analogysemi 选型手册

I2C-bus specification and user manual –NXP

希望做一些大家觉得好用的东西!

回复评论 (3)

IIC.7z (7.72 MB)
(下载次数: 5, 2022-10-11 11:27 上传)


CSD203参考代码
希望做一些大家觉得好用的东西!
点赞  2022-10-11 11:28

使用的是Nucleo 144
stm32 f446的板子

点赞  2022-10-11 11:31

WechatIMG240.jpeg

希望做一些大家觉得好用的东西!
点赞  2022-10-11 11:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复