该文章用到的代码是基于原厂提供的代码的修改。
Please go over the section 4.3. (Firmware Upgrade) in application note AN796 and let me know if you have any questions. – AN796
For creating Custom bootloader: AN533 application note can be used as a reference for building your own bootloader project. However, AN533 has bootloader framework for communication interfaces like UART, USB, CAN, I2C etc. For OTA, I believe you should be saving the new application firmware in a dedicated storage slot for new firmware while it is being received & then after the image is completely received you can verify and write the new firmware in the application area (For this second step you can use AN533 as reference) Memory layout can be something similar to the image below. AN533: Modular Bootloader Framework for Silicon Labs Microcontrollers: AN533
The SW support mentioned in AN533 is available here: 原厂demo
一 测试环境配置
- nordic 52832 + SI4463 相当于一个dongle,对于PC来讲是一个串口
- PC & SerialBootloaderDataSource.exe
- SI1060 & BootLoader & App
二 nordic 52832 + SI4463
基于nordic 52832外挂一颗SI4463芯片,运行在nordic平台上的代码实现的功能有:
- 接收PC串口发送来数据
- 将接收到的串口数据通过 SI4463 发送到 SI1060
我在实现该功能的时候遇到了两个难点。
- 通过 SI4463 实现和 SI1060 通讯不上
- 一包数据大小打破 7字节限制
1. 通过 SI4463 实现和 SI1060 通讯不上
我这里的改动是,SPI的片选引脚不要由硬件控制,改成手动控制。
void hal_spi_init(void)
{
hal_spi_gpio_init();
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
//spi_config.ss_pin = SPI_SS_PIN; //不使用硬件控制
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
spi_config.frequency = NRF_SPI_FREQ_250K;
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
nrf_gpio_cfg_output(SPI_SS_PIN);
}
void si446x_write_tx_fifo(uint8_t numBytes, uint8_t* pTxData)
{
SI446x_Reset_TxFifo( );
SI_SET_CSN_LOW( ); //拉低片选引脚,片选
drv_spi_read_write_byte( WRITE_TX_FIFO );
nrf_delay_ms(10);//经过本人调试发现,这里如果不加延时,SI1060接收不到数据
SpiFlash_Write(pTxData, numBytes);
SI_SET_CSN_HIGH( );//拉高片选引脚, 取消片选
}
2. 一包数据大小打破 7字节限制
默认情况下一包数据只有7个有效字节。
解决办法是使用 WDS 生成一个新的 radio_config.h 文件,修改 Field 字段
点击 Generate source 生成 radio_config.h 头文件,然后还有一点需要注意的是,SI1060 和 SI4463 两端都需要使用这个相同的头文件.
此时数据的收发将可以打破7字节的限制。
三 PC & SerialBootloaderDataSource.exe
在PC机上运行一个C#的上位机程序,该程序是从 https://www.silabs.com/support/resources?query=an533 这里下载而来。
我的程序就是基于 SerialBootloaderDataSource.sln 工程修改而来。
我修改成点击,Update Application Firmware 按钮执行我自己实现的一个函数,开始通过串口将App.hex数据发送出去。
这里也有一个关键点需要注意的: 因为我们生成的App.hex文件不是从0x0地址开始,比如我的工程指定的APP起始地址是0x2800. 这个时候该工具解析出来的数据从0x2800开始有效。
四 SI1060 & BootLoader
1 BootLoader实现的主要功能
- 检查是否需要更新 APP 固件。
- 当需要更新 APP 固件时,接收 SI4463 发送过来的数据,写到指定的Flash中。
- 当不需要更新 APP 固件,或者更新 APP 固件完成之后跳转到 APP 所在的地址开始执行 APP 程序。
2 这里有几个关键点
- BootLoader的链接命令我这里使用的是 LX51.exe ,而原厂提供的例子使用的是 bl51.exe,LX51指定代码段和锁存段的用法和bl51有所不同。参看: http://www.keil.com/support/man/docs/lx51/lx51_segments.htm
Command line flags: CODE REMOVEUNUSED CLASSES(CODE(C:0x2800-C:0xF9FD)) SEGMENTS(?CO?FXXX_TARGETAPP_INFOBLOCK(C:0xF9F5)) OVERLAY(* ! ?CO?FXXX_TARGETAPP_INFOBLOCK)
注意: 如果不添加OVERLAY(* ! ?CO?FXXX_TARGETAPP_INFOBLOCK)这个命令,那么在0xF9F5地址处找不到FXXX_TARGETAPP_INFOBLOCK相关的信息。OVERLAY的相关信息可以在这里查看:http://www.keil.com/support/man/docs/lx51/lx51_overlay.htm
- BootLoader中不可实现这些中断处理函数,否则编译器会报 memory space overlap 警告,当有这样的警告时是不能进行跳转的
INTERRUPT(vIsr_Timer2Isr, INTERRUPT_TIMER2)
INTERRUPT(vIsr_PcaTimerIsr, INTERRUPT_PCA0)
五 SI1060 & APP
APP的实现要注意 编译命令 和 连接命令
我这里是基于原厂提供的demo修改的,增加了串口打印功能。