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

一、芯片选择

没有别的原因,就是看到其他公司有在用这个芯片,型号是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 height\r\n");}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%02x\r\n",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),推荐写入0xB9FEwhile(ATT_Write_Check(0x01, 0xB9FE) != 1){printf("check error!\r\n");delay_ms(1);}
//
//
//  //EMU 单元配置寄存器(0x03),推荐写入0xF804
//  while(ATT_Write_Check(0x03, 0xF804) != 1){
//      printf("check error!\r\n");
//      delay_ms(1);
//  }
//
//  //模拟模块使能寄存器(0x31)推荐写入0x3427
//  while(ATT_Write_Check(0x31, 0x3427) != 1){
//      printf("check error!\r\n");
//      delay_ms(1);
//  }//同步数据启动命令 必须先关闭后打开,也就是先发送0x000000,关闭后再发送0x000002打开while(ATT_Write_Check(0xC5, 0x000000) != 1){printf("check error!\r\n");delay_ms(1);}while(ATT_Write_Check(0xC5, 0x000002) != 1){printf("check error!\r\n");delay_ms(1);}//校准A相电压while(ATT_Write_Check(UgainA, 0x7416) != 1){printf("check error!\r\n");delay_ms(1);}
}

总的一句话,仔细看手册。

ATT7022系列STM32F1的HAL库读写操作流程相关推荐

  1. GD32F427使用HAL库读写U盘文件的BUG

    GD32F427使用HAL库读写U盘文件时(使用Fatfs文件系统),上电后,第一次读U盘文件,当文件大于11KB后,总是卡死,卡在USB状态这边,一直报BUSY.导致USB底层报超时故障.解决方法: ...

  2. STM32F1 HAL库读写SD卡的操作要点

    本文采用的HAL库版本为STM32Cube_FW_F1_V1.8.0(带Patch-CubeF1 1.8.4). 知识点一:SD卡数据线位宽的配置 SD卡可以采用1位数据线模式,也可以采用4位数据线模 ...

  3. 【STM32F4系列】【HAL库】【自制库】WS2812(软件部分)(PWM+DMA)

    文章目录 相关链接 协议 外设设置 硬件PWM 分析 HAL设置 DMA 分析 HAL设置 方案设计 代码实现 解码函数 开始发送和复位 发送函数 波形 成品 相关链接 硬件介绍(PCB设计方案) 模 ...

  4. 【STM32F4系列】【HAL库】【自制库】WS2812控制(软件部分)

    相关链接 ​​​​​​​​​​​​​​硬件部分​​​​​​​ WS2812(软件部分)(PWM+DMA) ​​​​​​​ 协议 WS2812是一种异步串行通信,它每一位数据时间是ns级别的 默认是高电 ...

  5. 【STM32F4系列】【HAL库】【自制库】RDA5807M收音机芯片驱动

    目录 概述 电路 通信 读写时序 芯片寄存器 0x00 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x0A 0x0B 其余寄存器 HAL库初始化 硬件I2C 软件I2C 代 ...

  6. 【STM32F4系列】【HAL库】旋转编码器(EC11)

    目录 概述 电气连接 波形分析 思路 HAL初始化 代码 成品 概述 EC11是一种增量型AB相旋转编码器 旋转编码器是一种可以无限旋转的旋钮,常被作为各种需要大量数据范围的情况(如收音机选台,音量选 ...

  7. 【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

    外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高 ...

  8. 【STM32F4系列】【HAL库】电机控制(转速和角度)(PID实战1)

    文章目录 项目目标 硬件搭建 HAL初始化 定时器 PWM 编码器 定时器中断 串口 基础驱动 获取速度 获取角度 电机控制 PID 速度环 速度环设计 速度环调参 调试顺序 P(比例) I(积分) ...

  9. STM32L031 HAL库读写内部EEprom

    //字节写 void FLASHEx_EEPROM_WRITE(uint16_t Address, uint8_t *Data, uint8_t len) {uint8_t i;HAL_FLASHEx ...

最新文章

  1. 带你看懂LayoutInflater中inflate方法
  2. 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
  3. wifi 信道_说了这么久的信道和频宽,这回总算能弄明白啦
  4. gcn在图像上的应用_每日摘要|基于CNN 特征的图像卷积网络识别杂草和作物
  5. Android常见的设计模式详解
  6. Spring : @Value注解
  7. ios uiwindow弹窗_iOS-UIWindow详解
  8. Excel VBA 打开对话框,获取文件夹路径
  9. JAVA开发的人力资源管理系统
  10. 抖音多画面分屏PR分屏预设 横板竖版手机短视频分屏效果PR预设下载
  11. 用计算机计算负数,计算机中负数的加减
  12. CSS(七)元素过渡、变化、动画
  13. 一步教会你如何获取1688商品详情
  14. ISA防火墙策略配置/服务器发布
  15. Word 2013版本管理
  16. Google账户设置
  17. 浏览器UserAgent汇总
  18. 前端学习JS第八天(P102--P110)
  19. 【小工具】- linux如何查看内存硬件信息(包含卡槽数量和每块内存条参数)
  20. 数据挖掘-序列模式挖掘-PrefixSpan算法(ppt版本)

热门文章

  1. lisp画弯箭头_AutoCAD中怎么画箭头 CAD画箭头的方法
  2. 图像分割二十年,盘点影响力最大的10篇论文(含论文和源代码)
  3. [ROC-RK3566-PC] 如何编译Linux_SDK并打包Ubuntu系统固件?
  4. 前端工程师到底有哪些晋升和发展方向选择?
  5. OE分布式智能云生态助力全民挖矿
  6. 响应式织梦模板智能安防监控类网站
  7. oracle查询元数据,Oracle Spatial-元数据及SDO_GEOMETRY
  8. HTML5 2D游戏引擎研发系列 第五章
  9. gcc编译程序的过程
  10. Tensorflow入门到实战五(卷积神经网络)