大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT10xx系列ROM的UART SDP设置不同波特率的方法。
恩智浦 i.MXRT 四位数系列目前分为 RT10xx 和 RT11xx,前者的 BootROM 支持的上位机通信协议叫 SDP(来自于 i.MX),后者通信协议是 blhost(来自于 Kinetis),两种协议都实现了通过 UART/USB 与上位机通信的一系列命令。
近期有一个 RT1011 日本客户,在查看芯片参考手册时发现 System Boot 章节介绍了 UART SDP 可以支持设置不同的波特率,客户想知道能够支持的最大波特率,这点在手册里并未提及,而在恩智浦官方工具(Secure Provisioning Tool,简称 SPT)里可设的最大波特率是 460800(V10 版本),那么这就是极限吗?今天痞子衡来实测一下:
一、SDP协议简介
SDP 协议在不同的 RT10xx 型号上是有区别的,其中在 RT1060 上协议最全,一共支持 7 条命令,而在 RT1010 上则简化为仅支持 4 条命令。不管怎样 SET_BAUDRATE 是基础命令。
SDP 协议命令组成也足够简单,固定 16 个字节,由 COMMAND TYPE + ADDRESS + FORMAT + DATA COUNT + DATA + RESERVED 组成,简单又粗暴。

二、Secure Provisioning Tool设置
恩智浦官方工具 SPT 里集成了 SDP 协议支持,我们只需要在界面里选择不同波特率即可,从最低 14400 到最高 460800,不过遗憾的是波特率窗口并不支持用户手动输入,所以在这个上位机工具里没法测极限波特率。

熟悉这个上位机的朋友应该知道,其底层依赖得是 SPSDK,这是一个基于 Python 实现的命令集合 SDK。其用于 SDP 通信的工具是 sdphost,命令列表里有 set-baudrate 支持,我们当然可以使用这个工具来做测试。
三、在RT1010上手工测试
痞子衡也开发过一个上位机 MCUBootUtility (这是官方工具 SPT 的前身),其底层依赖得是 \tools\sdphost\win\sdphost.exe,这个程序是最早的 SDP 协议工具,但是比较遗憾的是其不支持 set-baudrate 命令并且该工具已经不再升级。今天我们就结合这个古早的工具以及串口调试助手来做极限波特率测试,顺便了解一下 SDP 协议里的数据包格式。
准备一块 RT1010 板卡,调到 SDP 模式,将 UART 连接好便可以开始测试,先用 sdphost.exe -- error-status 命令测试一下连通性(-d 参数可以看到与上位机交互数据包),波特率仅能设置为默认的 115200:

当然也可以直接用串口调试助手(依然是默认 115200 波特率),手工打入 16 个字节的 error-status 数据包,看看结果是不是和 sdphost.exe 一致:

这时候继续在串口调试助手里使用默认 115200 波特率发送 set-baudrate 数据包,注意数据包里 ADDRESS 为波特率值时是大端模式(0x0000E100 对应波特率 57600),当收到 RT1010 传来的 ACK 0x900dd009 时表明波特率设置"成功"(这里有个误区,MCU 发送 ACK 并不是用新设置的波特率,而用得与当前上位机一致的波特率,这个 ACK 仅仅代表正确收到了上位机命令)。如果在此基础上再次设波特率,则需要调整串口调试助手里的波特率与上次设置一致。


要测试新波特率是否成功,还是要继续使用 sdphost error-status 命令做一次新的测试。最终痞子衡实测 RT1010 上最高波特率可达 512000 (614400 测试失败),由于痞子衡基于的环境里 Host 是 RT1010-EVK 上的 DAP-LINK 里自带的 USB 转 UART 功能,实际最高波特率性能可能也受此影响,大家可以选择更高性能的 Host。
至此,i.MXRT10xx系列ROM的UART SDP设置不同波特率的方法痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园、CSDN、微信公众号、知乎、与非网、电子技术应用AET、电子星球、51CTO 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
