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修改的,增加了串口打印功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值