打印
[PSoC™]

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

[复制链接]
281|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述: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进行相关升级程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

41

帖子

3

粉丝