概述
本文只是简单说明一下,记录我各种绕弯。。。。
一、芯片选择
没有别的原因,就是看到其他公司有在用这个芯片,型号是ATT7026,随即在网上找了一下,ATT7022系列的多一些,7022系列常见的又有CU和EU两款,当时EU比CU好像贵1块,最后购买了CU这款。
买回来后,各种网站找说明,经过各种测试,怎么都操作不了寄存器,更别提电压电流的读取了。不是fffff,就是000000。网上的资料铺天盖地的基本都是EU,当时考虑,难道是CU过时了?或者是其他原因搞不定,就又买回来EU
二、芯片测试
芯片是落地了,头一天还是一如既往的ffffff和000000。挠头啊。。。。
最后沉下心来看手册,琢磨其他朋友的例程,总算是弄明白是怎么回事了。
三、简要说明
若想读取电压电流,必先配置校表寄存器的0x01模式相关控制,这个不配置,啥也弄不成。
只要按照手册中说明,配置推荐值0xB9FE。只要配置了这里,最起码能读出计量参数寄存器的各种数值。
目前我也只做了电压的读取和校准。
四、配置流程
重启->清表->开启写表->写校表寄存器->校验校表寄存器->关闭写表。
校验写入的数据我认为是非常有必要的,因为我在测试的时候发现,有时候写表是不成功的。
你们可以测试一下特殊命令0xC6,在解锁的时候读取0x00应该是校表寄存器的值0xaaaa,上锁的时候读取计量寄存器的芯片id,在我实验的时候,有一多半的情况在解锁的时候仍会读取到计量寄存器。
五、相关代码
//重启新芯片
void ATT_RST_Hard(){
ATT_RST(0);
delay_us(100);
ATT_RST(1);
while(HAL_GPIO_ReadPin(ATT_IRQ_GPIO_Port, ATT_IRQ_Pin) == GPIO_PIN_SET){
printf("att irq heightrn");
}
delay_ms(100);
}
//读写一个字节
uint8_t SPI1_ReadWrite_Byte(uint8_t TxData){
uint8_t RxData;
HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1,100);
return RxData;
}
//读取数据
uint32_t ATT_SPI_Read(uint8_t TxData){
uint8_t Buf[3];
TxData &= 0x7F;
ATT_CS(1);
ATT_CS(0);
SPI1_ReadWrite_Byte(TxData);
delay_us(20);
Buf[0] = SPI1_ReadWrite_Byte(0xff);
Buf[1] = SPI1_ReadWrite_Byte(0xff);
Buf[2] = SPI1_ReadWrite_Byte(0xff);
ATT_CS(1);
return (Buf[0] << 16) + (Buf[1] << 8) + Buf[2];
}
//写入数据
void ATT_SPI_Write(uint8_t cmd, uint32_t WriteData){
cmd |= 0x80;
ATT_CS(1);
ATT_CS(0);
SPI1_ReadWrite_Byte(cmd);
SPI1_ReadWrite_Byte((uint8_t)(WriteData >> 16));
SPI1_ReadWrite_Byte((uint8_t)(WriteData >> 8));
SPI1_ReadWrite_Byte((uint8_t)(WriteData));
ATT_CS(1);
}
//写入校表数据及校验
uint8_t ATT_Write_Check(uint8_t cmd, uint32_t WriteData){
uint8_t retData = 0;
uint32_t ReadData = 0;
ATT_SPI_Write(0xC9,0x00005A); //使能写校表寄存器
ATT_SPI_Write(cmd,WriteData);
ATT_SPI_Write(0xC9,0x000000); //失能写校表寄存器
ATT_SPI_Write(0xC6,0x00005A); //开启读取校表寄存器
ReadData = ATT_SPI_Read(cmd);
ATT_SPI_Write(0xC6,0x000000);//关闭读取校表寄存器
printf("read data=0x%02xrn",ReadData);
if(ReadData == WriteData){
retData = 1;
}
return retData;
}
//ATT初始化
void ATT_Init(){
/*
软件校表流程如下:(写操作时,将校表寄存器地址最高位置 1,称其为命令,如写寄存器 20H,命
令为 0A0H)
⑴ 复位 ATT7022EU,检测到 IRQ 为低时送校表数据,这步可省略。
⑵ 填写模式配置寄存器 0x01(命令 81H), 推荐值 B9FE,开启 Vref Chopper 功能提升 Vref 性能;
开启功率有效值慢速模式,减小跳动;配置 EMU 时钟 921.6kHz,降低功耗;开启 6 路 ADC,关闭 In
通道。
⑶ 填写 EMU 单元配置寄存器 0x03(命令 83H),推荐值:0xF804。开启能量计量(由于芯片计算校验
和寄存器时存在问题,故该寄存器最高 4bit 应配置为全 1 即 0x0F,否则校验和会出错),使用功率作为潜动
起动依据,关闭基波功能,视在功率能量选择 PQS 方式。
⑷ 填写模拟模块使能寄存器 0x31(命令 0B1H),推荐值:0x3437,开启高通滤波器;开启 BOR 电源
监测电路,开启温度传感器 TPS。
⑸ 填写 ADC 增益寄存器 0x02(命令 82H),设置采样通道 ADC 放大倍数。
⑹ 填写高频脉冲输出参数到校表寄存器 1EH(命令 9EH)。
⑺ 填写启动电流到校表寄存器 0x1D(命令 9DH),若选用功率作为启动则不做此步,默认的启动电流
值为基本电流的 0.07%。
⑻ 填写启动功率寄存器 0x36(命令 0B6H),若选用电流作为启动则不做此步,默认的启动功率值为基
本电流的 0.05%
⑼ 写断相阈值电压到校表寄存器 0x1FH(命令 9FH),若不做此步,默认的断相阈值电压为参比电压
的 10%(对三相四线而言)或 60%(对三相三线而言)。
*/
ATT_SPI_Write(0xC3,0x000000); //清除校表数据
// //模式配置寄存器(0x01),推荐写入0xB9FE
while(ATT_Write_Check(0x01, 0xB9FE) != 1){
printf("check error!rn");
delay_ms(1);
}
//
//
// //EMU 单元配置寄存器(0x03),推荐写入0xF804
// while(ATT_Write_Check(0x03, 0xF804) != 1){
// printf("check error!rn");
// delay_ms(1);
// }
//
// //模拟模块使能寄存器(0x31)推荐写入0x3427
// while(ATT_Write_Check(0x31, 0x3427) != 1){
// printf("check error!rn");
// delay_ms(1);
// }
//同步数据启动命令 必须先关闭后打开,也就是先发送0x000000,关闭后再发送0x000002打开
while(ATT_Write_Check(0xC5, 0x000000) != 1){
printf("check error!rn");
delay_ms(1);
}
while(ATT_Write_Check(0xC5, 0x000002) != 1){
printf("check error!rn");
delay_ms(1);
}
//校准A相电压
while(ATT_Write_Check(UgainA, 0x7416) != 1){
printf("check error!rn");
delay_ms(1);
}
}
总的一句话,仔细看手册。
最后
以上就是激情指甲油为你收集整理的ATT7022系列STM32F1的HAL库读写操作流程的全部内容,希望文章能够帮你解决ATT7022系列STM32F1的HAL库读写操作流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复