找回密码
 立即注册
首页 业界区 安全 通过串口烧录DA14531MOD内封的SPI FLASH

通过串口烧录DA14531MOD内封的SPI FLASH

刎唇 3 天前
1. 综述

DA14531MOD内置一颗1Mb的SPI FLASH用于存储DA14531的固件。手册中虽然标注了144KB的ROM,但似乎无法编程。DA14531一般启动时从外部总线或内部32KB大小的OTP加载程序到RAM中运行。启动方式请参考:
https://lpccs-docs.renesas.com/DA14535/AN-B-072-DA14531-Booting-from-serial-interfaces/Booting/Booting.html
对于DA14531MOD来说,SPI接口已经连接了模块内封的SPI FLASH,如果SPI FLASH中存在可启动的程序且OTP中没有特殊配置的情况下模块加载并运行该程序。
除此之外,在模块外引出的引脚中只能使用引脚P0_5的1-wire UART接口进行总线启动。在官方文档的第7小节介绍了从串口总线中启动的通信协议。
对内封SPI FLASH进行烧录有两种方法:

  • 使用JLink
  • 使用1-wire UART
官方工具SmartSnippets™ Toolbox支持上述两种方式,具体操作方式请阅读官方文档UM-B-083。不论是哪一种方法基本流程是相同的,上位机首先通过驱动JLink或串口上传一个支持编程外部FLASH的烧录程序到芯片然后复位。当烧录程序运行后,通过通讯接口(驱动JLink直接读写RAM/1-wire UART)下发命令给烧录程序完成外部FLASH的烧录。
官方工具支持命令行调用,一般情况下可以满足生产自动化烧录的需求。本文主要描述如何在不依赖官方工具的前提下通过1-wire UART方式烧录模块内封的SPI FLASH。
2. 前期准备

官方提供了支持烧录外部FLASH的源码以及预编译的程序,分别位于:

  • 源码:SDK_PATH/utilities/flash_programmer
  • 预编译程序:SDK_PATH/config/toolbox_resources/DA1453x/common
源码可用于参考通信协议或实现高级需求,只是烧录外部FLASH可以直接使用预编译程序。对于DA14531MOD来说,要使用的是flash_programmer_531.bin这个程序。在SmartSnippets™ Toolbox的安装目录中也可以找到同名文件,但和最新SDK中的不同,应该是SDK版本的原因。使用哪个都可以实现基本的烧录需求。
2.1. 单线串口

官方建议的连接方式是将常规串口的RX和TX引脚短接后串一个1K的电阻,再将串口和模块的J14(芯片P0_5)连接。由于短接后上位机发送的数据会同时被接收,所以实现上位机时需要过滤掉这些数据(例如官方工具就会自动过滤),或使用支持单线串口的设备作为上位机。
3. 烧录步骤


  • 读取烧录程序flash_programmer_531.bin,在其末尾添加5个字节0x00 0x00 0x00 0x00 0x05构成SW code bytes(该步骤作用不明确,官方工具会附加这个5个字节)
  • 通过1-wire UART启动:协议可参考官方文档
    1.jpg

    协议本身较为简单,需要注意的有3点

    • Checksum使用的算法是BCC校验算法(异或校验算法),使用初始值0,依次与SW code bytes的所有字节进行异或运算后得出。
    • 接收到芯片发出的0x02时需要尽快响应
    • 上位机确认Checksum后发送确认ACK0x06后,芯片将自动复位。下一步是与flash_programmer程序交互,如果上位机发送ACK后立即发送flash_programmer的命令可能会失败。此处需要延时一段时间。

  • 使用ACTION_SPI_ID读取内封SPI FLASH ID(该步骤可选,但通过这个步骤可以初步判断SPI FLASH是否正常。官方工具通过该命令确认flash_programmer是否成功运行)
  • 使用ACTION_SPI_GPIOS配置SPI GPIO
  • 使用ACTION_SPI_READ读取当前FLASH中的内容(可选)
  • 使用ACTION_SPI_ERASE擦除FLASH(可以选择整块擦除或ACTION_SPI_ERASE_BLOCK区域擦除,协议不同)
  • 读取待烧录固件,并为固件添加8字节的头0x70 0x50 0x00 0x00 0x00 0x00 SIZE_1 SIZE_0,其中前6字节为固定值,后2字节为大端字节序的固件长度(不包括新添加的8字节头)。该固件头必须添加,只有包含该头时DA14531才会加载固件到RAM中运行。
  • 使用ACTION_SPI_WRITE发送固件
  • 再次读取FLASH内容,校验写入是否成功
  • 发送复位命令ACTION_PLATFORM_RESET运行程序(可选)
3.1. flash_programmer协议

该程序所有通信协议遵守相同的结构:
indexnote[0:1]payload length n[2:5]payload crc[6]payload[0] aka the action code[7:n+5]payload[1]~payload[n-1]其中负载字段至少包含1字节的命令码(action code)。负载长度和负载CRC均使用大端字节序。
CRC参数如下:
POLY: 0x04C11DB7
INIT: 0xFFFFFFFF
XOROUT: 0xFFFFFFFF
REFIN: enable
REFOUT: enable
上位机发送的请求依据命令码的不同在负载字段会扩展不同的固定格式,flash_programmer的响应主要有两种,附带数据的ACTION_CONTENTS和用作ACK的ACTION_OK。其余响应请参考源码。
indexnote[0:1]payload length n[2:5]payload crc[6]ACTION_CONTENTS: 0x82[7:n + 5]payload[1]~payload[n-1]indexnote[0:1]1[2:5]payload crc[6]ACTION_OK: 0x83ACTION_SPI_ID


  • 请求
    indexnote[0:1]1[2:5]payload crc[6]0x93
  • 成功响应
    indexnote[0:1]payload length 5[2:5]payload crc[6]ACTION_CONTENTS: 0x82[7:10]big-endian FLASH CHIP ID
ACTION_SPI_GPIOS


  • 请求
    indexnote[0:1]9[2:5]payload crc[6]0x95[7]spi CS gpio port[8]spi CS gpio pin[9]spi CLK gpio port[10]spi CLK gpio pin[11]spi MOSI gpio port[12]spi MOSI gpio pin[13]spi MISO gpio port[14]spi MISO gpio pin对于DA14531MOD的内封SPI FLASH来说,必须配置为:
    indexnotevalue[7]spi CS gpio port0[8]spi CS gpio pin1[9]spi CLK gpio port0[10]spi CLK gpio pin4[11]spi MOSI gpio port0[12]spi MOSI gpio pin0[13]spi MISO gpio port0[14]spi MISO gpio pin3
  • 成功响应 ACTION_OK
ACTION_SPI_READ


  • 请求
    indexnote[0:1]7[2:5]payload crc[6]0x90[7:10]start address (big-endian)[11:12]read length (big-endian)
  • 成功响应
    indexnote[0:1]read length + 1[2:5]payload crc[6]ACTION_CONTENTS: 0x82[7:read length + 6]data
ACTION_SPI_ERASE


  • 请求
    indexnote[0:1]1[2:5]payload crc[6]0x92
  • 成功响应 ACTION_OK
ACTION_SPI_WRITE


  • 请求
    indexnote[0:1]write length + 1[2:5]payload crc[6]0x91[7:write length + 6]data
  • 成功响应 ACTION_OK
ACTION_PLATFORM_RESET


  • 请求
    indexnote[0:1]1[2:5]payload crc[6]0xC0

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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