芯片上电之后默认使能校表数据写操作和计量数据读操作,也就是芯片配置写操作和数据读操作。
也就是0xC9和0xC6的功能码。
SPI写0xC9(1字节),数据 = 0x00005A(3字节)是开启写校表寄存器。
SPI写0xC9(1字节),数据 ≠ 0x00005A(3字节)比如0x00005F,是关闭写校表寄存器。
SPI写0xC6(1字节),数据 = 0x00005A(3字节)是开启读校表寄存器。
SPI写0xC6(1字节),数据 ≠ 0x00005A(3字节)比如0x00005F,是关闭读校表寄存器,此时就可以读计量寄存器也就是读电流电压等数据。
上面涉及到校表寄存器,如果是配置模式,三项增益,等芯片有关就是写校表寄存器。地址如下
比如用到的模式配置寄存器,spi写0x01,数据0x89fe。
模块使能寄存器,SPI写0x31,数据0x3521。
配置完成之后就开启读计量数据。
void ht7038_setting_Init(void)
{
delay_ms(100);
ht7038_Write(0xC9,0x5A); //开启写校准表
delay_ms(10);
ht7038_Write(0x01,0xB9fe); //配置模式,bit12,13慢速模式,跳动小
delay_ms(10);
ht7038_Write(0x31,0x3521); //模拟模块使能配置
delay_ms(100);
ht7038_Write(0xc9,0x5b); // 关闭写操作
delay_ms(10);
ht7038_Write(0xc6,0x5b); // 开启读操作
delay_ms(100);
}
计量寄存器读取6路ADC值得地址依次是 uint8_t chAddr[6] = {0x10, 0x11, 0x12, 0x0D, 0x0E, 0x0F};
SPI写
void ht7038_Write(uint8_t addr, uint32_t dat)
{
uint8_t i;
ht7038_CS_Low();
ht7038_SCK_Low();
addr |= 0x80;
delay_us(10);
for(i=0;i<8;i++)
{
ht7038_SCK_High();
if(addr&0x80)
{
ht7038_MOSI_High();
}
else
{
ht7038_MOSI_Low();
}
addr = addr << 1;
delay_us(3);
ht7038_SCK_Low();
delay_us(3);
}
for(i=0;i<24;i++)
{
ht7038_SCK_High();
if(dat&0x800000)
{
ht7038_MOSI_High();
}
else
{
ht7038_MOSI_Low();
}
dat = dat << 1;
delay_us(3);
ht7038_SCK_Low();
delay_us(3);
}
ht7038_CS_High();
ht7038_SCK_Low();
ht7038_MOSI_Low();
}
SPI读
uint32_t ht7038_Read(uint8_t addr)
{
unsigned char i;
unsigned int dat=0;
ht7038_CS_Low();
ht7038_SCK_Low();
delay_us(2);
for(i=0;i<8;i++)
{
ht7038_SCK_High();
if(addr&0x80)
{
ht7038_MOSI_High();
}
else
{
ht7038_MOSI_Low();
}
addr = addr << 1;
delay_us(1);
ht7038_SCK_Low();
delay_us(1);
}
delay_us(2);
for(i=0;i<24;i++)
{
ht7038_SCK_High();
dat =dat << 1;
if(ht7038_MISO_STA())
{
dat |= 1;
}
delay_us(1);
ht7038_SCK_Low();
delay_us(1);
}
ht7038_CS_High();
ht7038_SCK_Low();
ht7038_MOSI_Low();
return dat;
}
大概换算
//264ma 271 0ma 48 264/(271-48) = 1.184; 264*48/(271-48)=56.8
uint32_t read_ele_ch(uint8_t ch)
{
uint32_t ele = read_ele_ori(ch)/188; //读ADC值
return ele*1.184-56.8;
}