4 posts / 0 new
Last post
tangjilong
Offline
Last seen:1 year 10 months ago
加入:2019-02-12 07:54
请教在uart下载fw的时候为何返回CRC码不正确

Hi,
我按照芯片的文档,通过p0_0/1和外接的mcu通讯,实现uart启动.
MCU侧在uart接收到0x6后上传fw,然后读回1byte的CRC码,但这个CRC码和我程序计算的不一致.
我的CRC计算如下,
size_msb = (unsigned char)(file_size / 256);
size_lsb = (file_size % 256);

char checksum_bin = 0;
for(ret=0;retchecksum_bin = checksum_bin ^ myfile[ret];

执行如下:
root@OpenWrt:/# ./ble-loadfw ble_app_barebone_585.bin
file_size=16475(0x405b),size_lsb=0x5b,size_msb=0x40
sh: write error: Resource busy
read data:0x0
read data:0x2
Detected DA1458x
read data:0x6
Uploading. Please wait...
checksum_bin = 0x54, checksum_da = 0xb4
其中checksum_da是我蓝牙芯片发出的CRC码,是错误的.

Device:
CYibin
Offline
Last seen:5 months 1 week ago
Staff
加入:2017-12-14 02:48
你好,

你好,

你的 crc 的计算方式有问题,SDK 中有一个工程(SDK 5.0.4\DA1458x_SDK\5.0.4\projects\host_apps\da1458x\proximity\reporter),包含了 spi boot 的过程。可参考其计算 CRC 的方式,如下:

/**
****************************************************************************************
* @brief Used to calculate the boot image CRC
* @param[in] length: Length of the image in 32-bit words
* @return CRC checksum (1 byte)
****************************************************************************************
*/
uint8_t calc_crc(uint32_t length)
{
uint32_t i;
uint32_t temp;
uint8_t crc;
crc=0xFF;
for(i=0;i{
temp=GetWord32(program_t+4*i);
crc^=(0xFF&(temp>>24));
crc^=(0xFF&(temp>>16));
crc^=(0xFF&(temp>>8 ));
crc^=(0xFF&(temp ));
}
return crc;
}

tangjilong
Offline
Last seen:1 year 10 months ago
加入:2019-02-12 07:54
你这个不是uart boot的CRC计算,AN-B

你这个不是uart boot的CRC计算,AN-B-001A文档里这么说的
CRC is calculated by XORing every successive byte with the previous value. Initial CRC value is 0x00.

这个bin文件和值在别的项目里经过验证是正确的.

CYibin
Offline
Last seen:5 months 1 week ago
Staff
加入:2017-12-14 02:48
你好,

你好,

可从 SDK 目录下的 second boot 工程中,找到 585 接收 UART BOOT 的过程。工程所在目录为:

\DA14585_SDK_6.0.10.511_0\DA14585_SDK\6.0.10.511\utilities\secondary_bootloader

打开该工程后,可在 main 函数中找到以下处理:

#ifdef UART_SUPPORTED
if (GPIO_GetPinStatus(UART_GPIO_PORT, UART_RX_PIN)) {
uart_initialization(); // initialize UART and UART pins
fw_size = FwDownload(); // download FW
uart_release(); // release UART and reset UART pins
if (fw_size>0){
from=(char*) (SYSRAM_COPY_BASE_ADDRESS);
to=(char*) (SYSRAM_BASE_ADDRESS);
for(i=0;i
SetWord16(WATCHDOG_REG, 0xC8); // 200 * 10.24ms active time for initialization!
SetWord16(RESET_FREEZE_REG, FRZ_WDOG); // Start WDOG
Start_run_user_application();
}
}
#endif