OpenEdv-开源电子网

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

ATECC608A这个加密芯片使用

[复制链接]

26

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
金钱
391
注册时间
2016-8-23
在线时间
77 小时
发表于 2026-4-15 19:31:28 | 显示全部楼层 |阅读模式
20金钱
ATECC608A这个加密芯片与STM32通信有人做过吗

回复

使用道具 举报

0

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2026-1-29
在线时间
22 小时
发表于 2026-4-16 13:37:08 | 显示全部楼层
以下是一个基于 STM32 HAL 库 的 ATECC608A 与 STM32 通过 I²C 通信的简化代码框架,适用于 STM32F4/F7/L4 等系列。该示例实现了基本的寄存器读写功能,需结合具体硬件调整。

1. 硬件连接
STM32 (I²C1)
PB6 → SCL
PB7 → SDA
添加 4.7kΩ 上拉电阻到 VCC。
ATECC608A
默认 I²C 地址:0x60(可通过配置修改)。
确保 CONFIG 区域已正确锁定(否则无法写入密钥)。
2. 核心代码实现
(1) I²C 底层驱动
      

        

#include "main.h"
I2C_HandleTypeDef hi2c1;

void MX_I2C1_Init(void) {
    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x2000090E; // 根据时钟频率调整(例如 400kHz)
    hi2c1.Init.OwnAddress1 = 0;     // 主机无需地址
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); }
}

// 向 ATECC608A 写入数据(指定寄存器地址)
HAL_StatusTypeDef atec608a_write(uint8_t reg, uint8_t *data, uint16_t len) {
    uint8_t buf[len + 1];
    buf[0] = reg; // 寄存器地址
    memcpy(&buf[1], data, len);
    return HAL_I2C_Master_Transmit(&hi2c1, 0x60 << 1, buf, len + 1, HAL_MAX_DELAY);
}

// 从 ATECC608A 读取数据(指定寄存器地址)
HAL_StatusTypeDef atec608a_read(uint8_t reg, uint8_t *data, uint16_t len) {
    HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c1, 0x60 << 1, &reg, 1, HAL_MAX_DELAY);
    if (status != HAL_OK) return status;
    return HAL_I2C_Master_Receive(&hi2c1, 0x60 << 1, data, len, HAL_MAX_DELAY);
}

      
(2) ATECC608A 基础操作
      

        

#define ATECC608A_I2C_ADDR 0x60

// 示例:读取芯片版本信息(寄存器 0x00)
void read_version(void) {
    uint8_t version_data[4];
    if (atecc608a_read(0x00, version_data, 4) == HAL_OK) {
        printf("Version: %02X%02X%02X%02X\r\n",
               version_data[0], version_data[1], version_data[2], version_data[3]);
    } else {
        printf("Read failed!\r\n");
    }
}

// 示例:生成随机数(命令 0x1B)
void generate_random(void) {
    uint8_t cmd[] = {0x1B}; // Nonce 命令
    uint8_t response[32];
   
    // 发送命令
    if (atecc608a_write(0x03, cmd, 1) != HAL_OK) {
        printf("Command send failed!\r\n");
        return;
    }
   
    // 读取响应(需延迟至少 15ms)
    HAL_Delay(20);
    if (atecc608a_read(0x02, response, 32) == HAL_OK) {
        printf("Random Data: ");
        for (int i = 0; i < 32; i++) printf("%02X", response[i]);
        printf("\r\n");
    }
}
回复

使用道具 举报

26

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
金钱
391
注册时间
2016-8-23
在线时间
77 小时
 楼主| 发表于 2026-4-17 10:52:15 | 显示全部楼层
你之前有做过吗,有没有可以参考的
回复

使用道具 举报

26

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
金钱
391
注册时间
2016-8-23
在线时间
77 小时
 楼主| 发表于 2026-4-17 10:52:48 | 显示全部楼层
664929323 发表于 2026-4-16 13:37
以下是一个基于 STM32 HAL 库 的 ATECC608A 与 STM32 通过 I&#178;C 通信的简化代码框架,适用于 STM32F4/F ...

你之前有做过吗 有可以参考的吗
回复

使用道具 举报

0

主题

17

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2026-4-20
在线时间
1 小时
发表于 2026-4-20 18:23:03 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-5-24 15:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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