OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 284|回复: 6

ATT7022E只能读ID号,不能往校表寄存器写入值

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2026-1-16
在线时间
5 小时
发表于 2026-1-19 15:15:10 | 显示全部楼层 |阅读模式
1金钱
static void SPI_Soft_SendByte(uint8_t data)
{
    uint8_t i;
    SCLK_H();
    delay_us(1);   
    for (i = 0; i < 8; i++)
    {
            
        if (data & 0x80)
                {
            DIN_H();
        } else {
            DIN_L();
        }
        delay_us(1);
        SCLK_L();
        delay_us(1);
        SCLK_H();
        delay_us(1);        
        data <<= 1;
    }
    delay_us(2);
}

static uint8_t SPI_Soft_ReceiveByte(void)
{
  uint8_t i, data = 0;   
  SCLK_H();
  delay_us(1);   
  for (i = 0; i < 8; i++)
  {
    data <<= 1;
    SCLK_L();
    delay_us(1);
    SCLK_H();
    delay_us(1);
    if (HAL_GPIO_ReadPin(DOUT_GPIO_Port, DOUT_Pin))
        {
      data |= 0x01;
    }
  }   
  delay_us(2);
  return data;
}




uint32_t ATT7022E_ReadReg(uint8_t reg_addr)
{
  uint32_t data = 0;
  uint8_t cmd = reg_addr & 0x7F;
  CS_L();
  delay_us(2);   
  SPI_Soft_SendByte(cmd);
  delay_us(2);
  data  = (uint32_t)SPI_Soft_ReceiveByte() << 16;
  data |= (uint32_t)SPI_Soft_ReceiveByte() << 8;
  data |= SPI_Soft_ReceiveByte();   
  CS_H();
  delay_us(2);   
  return data;
}

void ATT7022E_WriteReg(uint8_t reg_addr, uint32_t data)
{
  uint8_t cmd = reg_addr | 0x80;  // 写命令:bit7=1
  CS_L();
  delay_us(2);   
  SPI_Soft_SendByte(cmd);
  SPI_Soft_SendByte((data >> 16) & 0xFF);
  SPI_Soft_SendByte((data >> 8) & 0xFF);
  SPI_Soft_SendByte(data & 0xFF);   
  delay_us(2);
  CS_H();
  delay_us(2);
}



void ATT7022E_Init(void)
{
//  RESET_L();
//  delay_us(100);
//  RESET_H();
//  delay_us(30000);
  ATT7022E_WriteReg(0XD3,0X000000);
  delay_us(50000);

  ATT7022E_WriteReg(0xC3,0x0000);  //清除校表数据
  ATT7022E_WriteReg(0xc9,0x005A);  //使能校表
  ATT7022E_WriteReg(0X01,0XB97E);
  ATT7022E_WriteReg(0X02,0X0000);
  ATT7022E_WriteReg(0X03,0XF804);  
  ATT7022E_WriteReg(0X31,0X3427);
  ATT7022E_WriteReg(0xc9,0x0000);         //Close the write protection
  ATT7022E_WriteReg(0xC6,0x0000);           //打开计量寄存器数据   

  if(ATT7022E_ReadReg(0X00)!=0X7122A0)
  {
    printf("ATT7022E Init Error");
  }
  else
  {
    printf("ATT7022E Init Scuccess");
  }
}
有没有大佬能帮我看看代码,现在是OSCI引脚只能输出固定的80mv左右的电压,但是OSCO是正常的正弦波,能正常读出ID号,但是读其他寄存器就全是0,然后软件复位不行,更别提往校表寄存器写入值了,根本写不进去。

回复

使用道具 举报

14

主题

255

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6738
金钱
6738
注册时间
2016-12-19
在线时间
889 小时
发表于 2026-1-20 07:47:41 | 显示全部楼层
肯定是你写函数有问题
回复

使用道具 举报

11

主题

2191

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5337
金钱
5337
注册时间
2015-1-10
在线时间
668 小时
发表于 2026-1-20 09:03:24 | 显示全部楼层
示波器看看你的SPI时序
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2026-1-16
在线时间
5 小时
 楼主| 发表于 2026-1-20 13:08:12 | 显示全部楼层
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2026-1-16
在线时间
5 小时
 楼主| 发表于 2026-1-20 13:09:15 | 显示全部楼层
阿侑kevin 发表于 2026-1-20 09:03
示波器看看你的SPI时序

我用示波器看了SPI时许,感觉没有问题啊
回复

使用道具 举报

11

主题

2191

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5337
金钱
5337
注册时间
2015-1-10
在线时间
668 小时
发表于 2026-1-21 09:16:13 | 显示全部楼层
特奥 发表于 2026-1-20 13:09
我用示波器看了SPI时许,感觉没有问题啊

软件模拟需要着重看写的时序,地址对不对
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2026-1-16
在线时间
5 小时
 楼主| 发表于 2026-1-21 10:51:57 | 显示全部楼层
阿侑kevin 发表于 2026-1-21 09:16
软件模拟需要着重看写的时序,地址对不对

我通过示波器查看发现延时1us,实际示波器上显示有3us左右,不知道为什么,还有跟那个ATT7022E的晶振没有关系吗?它的晶振只有OSCO引脚有正弦波,OSCI引脚只有固定的80mv左右的电压
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-1-29 06:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表