Burnon_FAE_2 发表于 2024-10-31 12:54

关于PSOC HOST偶发升级失败问题的解决方法

问题描述:PSOC端采用Bootloader+Bootloadable进行相关升级程序,目前我们将相关IIC Bootloader HOST代码移植到了客户的主机SOC中目前出现了问题
如下图所示,我们把Cyacd文件通过AN的方式写入到StringImage0中,并且进行相应的升级操作,极少数的时候可以升级成功,但是大部分时候都是升级失败!
在升级失败的时候,当固定的Write到固件的01 39这个位置的时候,PSOC 4014端回复的log,是08 FF FF FF FF FF FF FF, 这个时候PSOC就没有响应了,大概率可能总线电平被拉高了,每当出现这个现象的时候,就会升级失败!


解决方案:
1. 增加 ReadData 的 timeout 时间, 示例如下。

int ReadData(unsigned char* rdData, int byteCnt)
{
    unsigned int timeOut =1;
   
    /*Clear I2C read buffer */
    I2C_I2CMasterClearReadBuf();
   
    /*Clear I2C status */
    I2C_I2CMasterClearStatus();
   
    /* Read data from I2C slave- Refer I2C.h file for details of this API*/   
    I2C_I2CMasterReadBuf(SLAVE_ADDR,rdData,byteCnt,I2C_I2C_MODE_COMPLETE_XFER);   

   /* Wait till read operation is complete or timeout*/
    while (!(I2C_I2CMasterStatus()&I2C_I2C_MSTAT_RD_CMPLT))
    {
      timeOut++    ;
      /* Check for timeout and if so exit with communication error code*/
      if(timeOut >= 512u)
      {
            return(CYRET_ERR_COMM_MASK);
      }
    }
   
    return(CYRET_SUCCESS);
}

2. 增加读失败多次尝试的逻辑

int CyBtldr_TransferData(unsigned char* inBuf, int inSize, unsigned char* outBuf, int outSize)
{
    int err = g_comm->WriteData(inBuf, inSize);
    if (CYRET_SUCCESS == err)
      err = g_comm->ReadData(outBuf, outSize);
    if (CYRET_SUCCESS != err)
      err = g_comm->ReadData(outBuf, outSize);
    if (CYRET_SUCCESS != err)
      err = g_comm->ReadData(outBuf, outSize);
      
    if (CYRET_SUCCESS != err)
      err |= CYRET_ERR_COMM_MASK;
    return err;
}

AdaMaYun 发表于 2024-11-11 13:14

很不错的PSOC端采用Bootloader+Bootloadable进行相关升级程序

中国龙芯CDX 发表于 2024-11-28 10:22

PSOC端采用Bootloader+Bootloadable进行相关升级程序,目前我们将相关IIC Bootloader HOST代码移植到了客户的主机SOC中目前出现了问题

Amazingxixixi 发表于 2024-12-2 11:39

非常不错的文章,总结精炼,分析到位。

申小林一号 发表于 2024-12-2 15:19

很不错的PSOC端采用Bootloader+Bootloadable进行相关升级程序
页: [1]
查看完整版本: 关于PSOC HOST偶发升级失败问题的解决方法