中级会员
 
- 积分
- 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, ®, 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");
}
} |
|