您好
请参阅论坛链接、提问是否继续这一问题、
用于固件升级的 SDK: ti154stack_linux_x64_4_40_00_03
使用的示例代码: cc13xx-sbl
Od 平台: Linux Ubuntu
接口:UART
芯片组 : CC2652R7
用于升级固件的主机: Linux 平台处理器
客户端下载固件: CC2652R7芯片组
在 MCU 侧、我们使用 DIO2作为 Rx、使用 DIO3作为 Tx。 硬件连接正确。 当我们尝试将 FW 从 Linux 处理器上传到 MCU 时、我们会收到一个 NACK 用于擦除本身、如下图所示。
如图所示,我们总是收到51 (十六进制: 0x33 )用于擦除本身。 我们甚至无法 对其进行升级
这可能是什么原因? 请在此处说明
在"cc13xx-SBL"代码中检测到错误位置时的程序流程:
Main -> eraseFlash -> eraseFlash -> CcDnld_flashEraseRange -> getCmdResponse (&devAck)
CcDnld_flashEraseRange 函数防御:
Dnld_Status CcDnld_flashEraseRange (uint32_t startAddress、uint32_t byteCount、char * deviceType)
{
uint8_t eraseAddress[4];
uint32_t pageIdx;
uint32_t PageCount;
uint32_t retCode = Dnld_Status_Success;
Dnld_Dev_Ack devAck;
uint8_t devStatus;
uint32_t pagesize = CcDnld_getPageSize (deviceType);
PageCount = byteCount / pageSize;
if (byteCount % pagesize) PageCount ++;
for (pageIdx = 0;pageIdx < PageCount;pageIdx++)
{
/*构建有效载荷- 4B 地址(MSB 优先)*/
ui32ToByteArray (startAddress + pageIdx*(pagesize)、&eraseAddress[0]);
/*发送命令*/
if ((retCode = sendCmd (CCDNLD_CMD_SECTOR_ERASE Dnld_Status_Success、eraseAddress、4))!= C52)
{
printf ("E sndCmd %d \r\n、retCode);
返回 RetCode;
}
/*接收命令响应(ACK/NAK)*/
if ((retCode = getCmdResponse (&devAck))!= Dnld_Status_Success
{
printf ("E GetResp %d \r\n、retCode);
返回 RetCode;
}
if (devAck!= CCDNLD_DEVICE_ACK)
{
printf ("E devAck %d \r\n",devAck);
CSic Dnld_Status_Cmd_Error 返回案;
}
/*检查设备状态(如果页面已锁定,则闪存失败)*/
readStatus (&devStatus);
if (devStatus!= CCDNLD_CMD_RET_SUCCESS)
{
printf ("E devSts %d \r\n",devStatus);
CSic Dnld_Status_State_Error 返回案;
}
}
返回 RetCode;
}