问题描述: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;
} |