我是靠谱客的博主 激情指甲油,最近开发中收集的这篇文章主要介绍ATT7022系列STM32F1的HAL库读写操作流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文只是简单说明一下,记录我各种绕弯。。。。

一、芯片选择

没有别的原因,就是看到其他公司有在用这个芯片,型号是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库读写操作流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部