TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2541 串口升级CRC校验问题

大家好

关于SBL升级中CRC两个字节目前感到很困惑。checkcrc代码:

static uint8 checkRC(void)
{uint16 crc[2];HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,(HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE);if ((crc[0] == 0) || (crc[0] == 0xFFFF)){return FALSE;}if (SBL_CALC_CRC && (crc[0] != crc[1])&& (crc[1] == 0xFFFF)){crc[1] = calcCRC();crc[0] = 0xFFFF;while (!HalAdcCheckVdd(VDD_MIN_NV));HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,(HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE);}return (crc[0] == crc[1]);
}

根据代码,工程设置中定义“xSBL_CALC_CRC”所以计算CRC这部份略过,这里没问题。下面还有设置CRC的代码:

  case SBL_ENABLE_CMD:HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,(HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc));// Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD.//if ((crc[0] != crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000))if (crc[1] != crc[0]){crc[1] = crc[0];crc[0] = 0xFFFF;HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,(HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc));}// Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD.//if ((crc[0] == crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000))if (crc[0] != crc[1]){rsp = SBL_VALIDATE_FAILED;}break;

这里实在烧入固件后,从固定地址0x890和0x891中读取crc[0]和crc[1]。问题在于,刚刚烧录完成的固件中,这两个地址处一定是crc判断的地方吗?是编译器编译bin文件时设置的吗?

关东糖:

补充一下问题,在设置crc函数段,为什么在crc[0]处强制写入FFFF,然后回读crc[0]和crc[1],他们就可能相等?如果强制写入FFFF,检验CRC的程序不就报错了吗?

关东糖:

回复 Viki Shi:

谢谢。

赞(0)
未经允许不得转载:TI中文支持网 » CC2541 串口升级CRC校验问题
分享到: 更多 (0)