SI1060的BootLoader OTA功能實現

該文章用到的代碼是基於原廠提供的代碼的修改。

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

一 測試環境配置

image

  • 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 字段

image

image

點擊 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 這裏有幾個關鍵點

在這裏插入圖片描述
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的實現要注意 編譯命令 和 連接命令

image

鏈接命令

我這裏是基於原廠提供的demo修改的,增加了串口打印功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章