5.7:通过硬件 UART 读取芯片 ID
1. 适用设备
适用设备为 PW200/PW300。
PWX1 在当前文档时间编写时,不支持 UART 读取芯片 ID,未来会开放 UART 功能。
2. 准备工作
2.1 升级固件
菜单栏帮助,更新软件和固件,升级固件到1.01.31以上。
2.2 测试
特别说明:请将擦除方式选为不擦除、接口电平选5V、选项字模式选无操作到无操作,避免不小心按按钮,导致芯片的程序被覆盖!
在设备 PW200 / PW300 拿到手后,使用 PowerWriter 客户端进行设备连接:
- 选择需要读取的芯片型号
- 如提示固件更新,更新固件到 > 1.01.31 ,参考8.2.1
- 参考芯片连接图连接芯片
- 确认芯片接线是否正确(提示目标芯片已连接)
如下图所示:
连接成功后,可以使用PowerWriter客户端的读 ID 功能,尝试读取一下 ID ,如下所示:
2.3 启用 AT 功能
在菜单栏、设置、设备首选项中开启 AT 功能(UART)。
2.4 加载工程到设备
选择好芯片之后,加载空工程到设备中,如下所示:
由于只需要读取芯片 ID,只需要一个空工程即可,无需添加数据。
3. 开源 AT API 接入
3.1 PowerWriter 开源 AT 源码
参考文档地址:4.3:AT 开源接口 | PowerWriter文档中心,下载源码包,如下图所示:
下载后解压,可以看到如下的目录,其中 source 目录有跨平台的 API 源码:
powerwriter_at_core 为跨平台实现,只需要适配串口收发,以及时间戳实现接口等,即可在几乎所有平台运行,目前提供的 demo 为 windows 版本,其他平台暂未提供 demo,可以参考 powerwriter_at_samples.c 进行实现。
3.2 接口集成
3.2.1 连接目标芯片
根据以上描述,以及文档手册,直接集成 powerwriter_at_core,参考 sample 进行 API 调用。调用 powerwriter_at_target_connect 发送请求连接目标芯片命令,然后通过 powerwriter_at_target_status 获取目标芯片的连接状态,如果返回连接目标芯片成功,则可以进行下一步参考,如果失败,则重试,如果超时后依然无法连接芯片,请检查接线,确认芯片型号是否正确,必要时联系技术支持。
请求连接的序列为(未加密时):
//50 57 41 54 18 00 00 00 64 00 00 00 04 00 00 00 00 00 00 00 4c 29 75 98
// 固定头部 | 帧长度 |0x64为请求连接|0x04命令长度|命令保留值 | crc32 |
返回值为 ATCmdStatusOK 或者是 ATCmdStatusError(未加密时):
/* OK 命令的帧结构为 */
//50 57 41 54 18 00 00 00 9b ff ff 7f 04 00 00 00 00 00 00 00 93 10 0a 7a
// 固定头部 | 帧长度 |ATCmdStatusOK| 0x04命令长度| 命令保留值 | crc32 |
/* ERROR 命令的帧结构为 */
//50 57 41 54 18 00 00 00 9c ff ff 7f 04 00 00 00 xx xx xx xx xx xx xx xx
// 固定头部 | 帧长度 |ATCmdStatusError| 0x04命令长度| 错误码 | crc32 |
由于连接芯片需要时间,不同的 PCB ,操作环境的不同,返回的事件长短不一,所以,需要有超时等待时间,一般设置5~10 秒(一般情况下,几十ms 就会返回成功),如果返回失败,则多尝试几次,重试几次之后,仍然报错,则表示连接芯片失败,需要检查,必要时请求技术支持。
C语言参考代码如下:
bool powerwriter_at_connect_target(S_ATChannel *channel)
{
bool connect = false;
powerwriter_at_log(LOGD, ">>>Target online bechmark ...\r\n");
/* Init target connnect */
if (!powerwriter_at_target_connect(channel))
{
powerwriter_at_log(LOGE, "[%08X]:powerwriter initial connect target failure ...\r\n",
powerwriter_at_last_error(channel));
return false;
}
powerwriter_at_log(LOGD, "powerwriter initial connect target successfully ...\r\n");
/* Get target status */
uint32_t ts = GetSystemTick();
uint32_t te = ts;
powerwriter_at_log(LOGD, "Target connecting >");
do
{
ATSleep(50);
if (powerwriter_at_target_status(channel))
{
powerwriter_at_log(LOGN, "powerwriter target connected...");
connect = true;
break;
}
powerwriter_at_log(LOGN, ">>");
te = GetSystemTick();
} while (te - ts < 10000);
powerwriter_at_log(LOGN, "\r\n");
return connect;
}
3.2.2 读取目标芯片 ID
调用 powerwriter_at_target_id 发送读取目标芯片 ID 命令,如果读取正常,将会返回 ATCmdRspTargetChipID 命令,如果失败,则会返回 ATCmdStatusError (结构见上一节)。
读取目标芯片 ID(未加密时):
//50 57 41 54 18 00 00 00 66 00 00 00 04 00 00 00 00 00 00 00 d3 b7 4e 74
// 固定头部 | 帧长度 |0x66为读取ID | 0x04命令长度 | 命令保留值 | crc32 |
返回值为 ATCmdRspTargetChipID 或者是 ATCmdStatusError(未加密时):
#define PW_TARGET_ID_MAX 16 // Target chip ID MAX size
typedef struct S_ATCmdRspTargetChipID
{
uint8_t m_CIDSize; // Target chip ID size
uint8_t m_CIDData[PW_TARGET_ID_MAX]; // Target chip ID data
} S_ATCmdRspTargetChipID;
/* ATCmdRspTargetChipID */
/*
50 57 41 54 25 00 00 00 67 00 00 00 11 00 00 00 10 32 30 53 41 13 33 32 33 33
固定头部 | 帧长度 |ATCmdRspTargetChipID | 0x11 命令长度|ID 长度|ID 值
22 6e 10 78 b1 01 56 84 6b 94 1e
| CRC32 |
*/
/* Get target id */
S_ATCmdRspTargetChipID m_target_id;
if (!powerwriter_at_target_id(channel, &m_target_id))
{
powerwriter_at_log(LOGE, "[%08X]:powerwriter get target id failure ...\r\n",
powerwriter_at_last_error(channel));
return false;
}
object_print(m_target_id.m_CIDData, m_target_id.m_CIDSize, "Target chip id");
powerwriter_at_log(LOGD, "powerwriter get target id successfully ...\r\n");
3.2.3 复位芯片
由于读取芯片 ID 时,会暂停芯片的运行,所以在读取 CID 之后,需要对产品进行功能复位,对设备进行断电,或者手动重启设备,才能恢复产品的功能。
复位目标芯片(未加密时):
//50 57 41 54 18 00 00 00 72 00 00 00 04 00 00 00 03 00 00 00 be ce e5 69
// 固定头部 | 帧长度 |0x72为复位芯片| 0x04命令长度 | E_resetType | crc32 |
返回值为 ATCmdStatusOK 或者是 ATCmdStatusError(未加密时),参考连接芯片时的错误码:
// 复位类型
typedef enum E_resetType
{
HWKeepLow, //硬件复位引脚保持为低
HWNoneReset, //硬件引脚为高阻态
HWReset, //执行硬件复位
HWCoreReset, //执行硬件复位和内核复位
CoreReset, //执行内核复位
VectorReset, //执行向量复位
POROnly, //执行上电重启(必须由PowerWriter 供电才可以)
PORAndRelease, //执行上电复位并释放端口(必须由PowerWriter 供电才可以)
_TARGET_RESET_ = PW_ENUM_MAX
}E_resetType;
/* Reset Target */
#ifdef AT_ONLINE_RESET_TARGET_SAMPLE
if (!powerwriter_at_target_reset(channel, HWCoreReset))
{
powerwriter_at_log(LOGE, "[%08X]:powerwriter AT reset target failure...\r\n",
powerwriter_at_last_error(channel));
return false;
}
powerwriter_at_log(LOGD, "powerwriter AT reset target passed ...\r\n");
/* connect target again */
if (!powerwriter_at_connect_target(channel)) {
return false;
}
#endif
特别说明:如果执行复位操作,将释放 PowerWriter 的资源,以便让目标芯片重启。
4. 接线示意图
4.1 系统接线示意图参考
4.2 PowerWriter 设备接口参考
详见 PowerWriter 官方在线手册:2.1:功能参数 | PowerWriter文档中心