FRDM-MCXA156 的简单 CAN 引导加载程序项目
使用 CAN 更新 MCU 固件是一项基本且常用的任务。本项目采用两块 FRDM-MCXA156 开发板,通过 CAN 总线和 USB 实现固件更新,基本架构概述如下:
- ?USB-CAN 桥接器?:本项目利用 FRDM-MCXA156 硬件,通过 USB 连接到 PC。在 PC 端,USB 端口被枚举为 CDC(通信设备类)虚拟串行端口(类似于 SDK 示例:usbdevicecdc_vcom)。此配置允许 PC 端使用 blhost 等工具通过 CDC 虚拟串行端口将数据传输到 USB-CAN 桥接器。然后,USB-CAN 桥接器将这些数据中继到 CAN 总线上,从而实现串行数据和 CAN 数据之间的透明传输。
- ?CAN 引导加载程序:?该项目同样使用 FRDM-MCXA156 硬件,用作引导加载程序。它能够通过 CAN 总线接收固件数据并验证新固件的完整性。验证成功后,系统将转换到应用程序。
主板:FRDM-MCXA156
类别:工具
外围设备:CAN
工具链:MDK
目录
1.软件
本演示实现了一个简单的 CAN 引导加载程序升级框架。它利用一块 FRDM-MCXA156 开发板作为 USB-CAN 桥接器,方便 USB(作为 CDC 虚拟串行端口)和 CAN-FD 之间的数据传输。另一块 FRDM-MCXA156 开发板用作 CAN 引导加载程序项目,通过 CAN 与 USB-CAN 桥接器通信,以接收数据并更新应用程序。
进入bootloader模式的条件:
项目分类及描述:
项目 | 小路 | 描述 |
usbcanbridge | frdmmcxa156usbcanbridge | 用作 USB-CAN 桥接器,其中 USB 被枚举为 USB CDC 端口,由 SDK 示例 usbdevicecdcvcom 修改而来 |
canbootloader | frdmmcxa156canbootloader | CAN 引导加载程序项目与 USB-CAN 桥接器配合使用 |
appexample | frdmmcxa156appexample | CAN 引导加载程序的示例应用程序,其起始地址从默认的 0x00000000 更改为 0x00008000 (32K),仅在这方面与 SDK 的 HelloWorld 示例不同。 |
默认 CAN 总线配置:
项目 | CANFD控制字段波特率 | CANFD数据字段波特率 | CAN 发送 ID | CAN 接收 ID |
usbcanbridge | 500Kbps | 2Mbps | 0x09 | 0x08 |
can_bootloader | 500Kbps | 2Mbps | 0x08 | 0x09 |
用户可以在main.c中修改CAN_TX、波特率等默认参数
```
define CANBITRATE (500*1000)
define CANBITRATE_FD (210001000)
define CANTXID (0x09)
define CANRXID (0x08)
```
软件协议
CANbridge 与 CANBootloader 之间的通信协议非常简单。每个 CANFD 帧传输固定的 64 字节有效载荷,其中前 8 个字节为控制字段(用于兼容 UDS 协议),第 8-64 个字节为串行数据。前 8 个字节定义如下:
- 字节 0-6:保留
- 字节7:数据字段长度:1-56
注意,即使数据长度小于56,每个CANFD帧的数据场也固定为64字节。末尾多余的部分将被自动丢弃。
硬件
FRDM-MCXA156
引脚表
以下是该项目中的引脚使用情况,它适用于 usbcanbridge 和 can_bootloader 项目。
功能 | 通用输入输出 | 描述 |
LPUART0RXD | 端口02 | UARTRXD |
LPUART0TXD | 端口03 | UARTTXD |
CAN0TXD? ? ? | 端口113 | CAN总线传输信号 |
CAN0RXD | 端口112 | CAN总线接收信号 |
3. 设置
在开始之前,您应该:
- 熟悉基本操作,例如使用 MCUX SDK 下载和调试入门示例(例如 HelloWorld 或 led_blinky)。更多详情,请参阅:https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/frdm-development-board-for-mcx-a14x-a15x-mcus :FRDM-MCXA153
- 了解恩智浦引导程序 blhost 的基本使用方法。更多信息,请参阅: https: //www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcu-bootloader-for-nxp-microcontrollers :MCUBOOT
3.1 步骤 1
如下所示连接您的测试环境:
CAN 引导加载程序板的电源可以连接到任何能够提供 5V 的 PC。
3.2 第 2 步
将 usbcanbridge 和 canbootloader 项目分别烧录到两块开发板上,编译 appexample 项目生成 app_example.hex 文件。将 hex 文件放在与 blhost 软件相同的文件夹中。
3.3 步骤 3
- 将 USB 线缆插入 USB-CAN-bridge 开发板的 J23 接口(MCU FS USB),然后按下复位按钮。PC 应该会枚举一个 USB-CDC 串口并弹出相应的 COM 端口。如果 USB 无法正确识别,您可以使用 SDK 示例代码(boardsfrdmmcxa156usbexamplesusbdevicecdcvcom)验证您的软硬件设置。
- 将 USB 线缆插入 CAN 引导加载程序板的 J21(MCU-Link USB)接口,也可以连接到 J23。此 USB 端口仅用于为开发板供电。
3.4 步骤4
使用双绞线电缆连接两块板的 CANH 和 CANL,如上图所示。
3.5 步骤 5
按住 CAN 引导加载程序板上的 SW2(WAKEUP)。然后按下 SW1(RESET),CAN 引导加载程序将进入引导模式。打开命令行并输入:
shell
$ ./blhost.exe -p COM22 get-property 1
如果收到以下回应,则表明硬件连接正常,blhost已经成功连接到CAN bootloader:
shell
Ping responded in 1 attempt(s)
Inject command 'get-property'
Response status = 0 (0x0) Success.
Response word 1 = 1258357760 (0x4b010400)
Current Version = K1.4.0
3.6 步骤 6
输入 flash-image 命令,后跟已编译的 app_example.hex 文件的路径。此命令将擦除应用程序所在的 Flash,并将新的十六进制固件写入 Flash。
shell
$ ./blhost.exe -p COM22 -- flash-image app_example.hex erase
如果一切按计划进行,您应该会看到如下响应:
shell
Ping responded in 1 attempt(s)
Inject command 'flash-image'
Successful generic response to command 'flash-erase-region'
Wrote 7340 bytes to address 0x8000
Successful generic response to command 'write-memory'
(1/1)100% Completed!
Successful generic response to command 'write-memory'
Response status = 0 (0x0) Success.
4.结果
重置 CAN 引导加载程序板;其 LED 将闪烁。如果您检查开发板的串行日志输出,它将显示如下消息:
shell
MCXA CAN bootloader
APP ADDR:0x8000
TIMEOUT!, JUMP!
jump to 0x 8000
I AM MCX APP EXAMPLE APP
MAIN ADDRESS:0x98B5
LED Toggle!
LED Toggle!
LED Toggle!
...
blhost 命令和日志的完整列表:
```shell
$ ./blhost.exe -p COM22 get-property 1
Ping responded in 1 attempt(s)
Inject command 'get-property'
Response status = 0 (0x0) Success.
Response word 1 = 1258357760 (0x4b010400)
Current Version = K1.4.0
$ ./blhost.exe -p COM22 -- flash-image app_example.hex erase
Ping responded in 1 attempt(s)
Inject command 'flash-image'
Successful generic response to command 'flash-erase-region'
Wrote 7320 bytes to address 0x8000
Successful generic response to command 'write-memory'
(1/1)100% Completed!
Successful generic response to command 'write-memory'
Response status = 0 (0x0) Success.
$ ./blhost.exe -p COM22 reset
Ping responded in 1 attempt(s)
Inject command 'reset'
Successful generic response to command 'reset'
Response status = 0 (0x0) Success.
```
. 常见问题解答
- 为什么不使用 BootROM 内置的 CAN 接口,而是实现一个新的 CAN 引导加载程序?
BootROM 提供的 CAN 协议在官方文档中没有完整描述,并且需要一个名为 BusPal 的工具进行串口转 CAN 协议。无论从软件和硬件架构的角度,还是从客户定制的角度,这都不太实用。 - 这个演示是否考虑了可靠的更新或安全方面?
不,此演示旨在为客户提供 CAN 引导加载程序实现的概念验证,而不考虑任何“高级”功能。
6. 支持
项目元数据
来源:恩智浦appcodehub