聊聊 Microsemi SmartFusion2 系列FPGA SOC芯片 ISP IAP 在线升级中的一些大坑

开发的产品用到 SmartFusion2 的FPGA 型号 M2S010,这个FPGA芯片内部自带硬核 Cortex®-M3,并且M3可以直接内部链接FPGA资源,这样对于需要灵活分配引脚功能,增加自定义FPGA硬件加速算法模块,添加N多路TIM,UART,SPI等等外设是非常好用的,唯一不好的就是比较贵。。。。

最近做的东西要卖到国外,国外客户要对我们的产品进行二次开发,由于没有给产品加入在线升级功能,导致后来双方协同开发不太愉快,每次程序需要修改都要寄一次新硬件,浪费时间不说,还让客户对我们的产品产生了不好的印象,总之老板不高兴,客户也不高兴了,锅当然是要甩给我们开发部的。。。

原先以为ISP IAP在线升级功能挺简单,用STM32芯片多年了,对在线升级已经轻车熟路,M2S010虽然多了个FPGA,但是内核跟STM32是一样的,依葫芦画瓢即可。因此按照老套路添加读写内部FLASH的程序,运行中的程序接收新程序,然后擦除自身,再写入新程序,写完程序,DEBUG,OK,搞定收工。

谁知道,这货芯片有个特性,只要芯片没有加密锁定,按照STM32来说就是还在调试状态,没有进行读保护的时候是可以按照stm32的方式进行升级的,但是如果这个芯片加了读保护,也就是加密后,就不能简单的这样处理了,因此按照stm32的套路进行升级是会失败的。

后来仔细研究M2S010的芯片手册和Libero 编译器的帮助手册,才知道这芯片需要在线升级程序的话,需要通过芯片自身提供的内核服务函数来进行,也就是 mss_sys_services.c 这个文件内的

uint8_t MSS_SYS_initiate_iap
(
    uint8_t mode,
    uint32_t bitstream_spi_addr
);

void MSS_SYS_start_isp
(
    uint8_t mode,
    comblk_page_handler_t page_read_handler,
    sys_serv_isp_complete_handler_t isp_completion_handler
);

这两个函数来进行,IAP是内核自动调用升级程序,整个升级过程自动完成,但是硬件必须引出MSS内核的SPI0外设,SPI0外接一颗W25Q32之类的SPI flash即可。ISP是可以自定义升级数据获取来源,可以通过串口,网口,usb,spi等待方式,一边获取数据一边进行升级,ISP相比于IAP更加灵活方便,对于SPI0已经被占用的情况下可以通过别的方式获取升级数据流。升级过程比较简单,Libero软件可以直接成测试的ISP和IAP工程,用IAR或者MDK编译一下即可测试,这个文档比较详细,就不多说了。

下面说说坑在哪里:

第一点,所有升级文档和工程都说用内部20/50MHz RC做时钟,经我实际测试,其实不必须的,用外部XTAL晶体做时钟一样可以。

第二点,调用升级函数的时候芯片会进入Flash Freeze模式,这个模式下连接到FPGA   Fabric的所有外设和IO都是不可用的,只有MSS内核直接引出的IO和外设是可以使用的,也就是说如果你的外设或者IO引脚是连接到Fabric的话,进入升级函数后你想操作IO什么的会直接卡死在内核等待函数。

第三点,Flash Freeze模式下DDR内存也是不可用的,想省事先把升级文件放到DDR再一次性升级的,不可行

第四点,工程设置内Flash Freeze设置要按下图设置

聊聊 Microsemi SmartFusion2 系列FPGA SOC芯片 ISP IAP 在线升级中的一些大坑_第1张图片

第五点,也是最重要的一点,升级时操作的SPI0或者别的IO引脚,必须设置为Flash Freeze模式下可用,否则进入升级函数后也会卡死在内核等待完成状态不能继续,设置如下图

聊聊 Microsemi SmartFusion2 系列FPGA SOC芯片 ISP IAP 在线升级中的一些大坑_第2张图片

上图可见只有MSS直接引出的引脚是可以设置Flash Freeze模式下可用的,其余Frabic引出脚都是灰色的不可设置状态

 

以上经验都是被坑了好几天摸索出来的,目前测试升级OK,芯片是不错,就是用的人太少,不像stm32一样资料满天飞,小白都可以7天入门到精通,很多时候遇到莫名其妙的问题只能自己啃手册和帮助文档,文档也是说得不清不楚,需要自己不断测试。

简单分享经验,希望对遇到这个问题的人有所帮助。

你可能感兴趣的:(嵌入式)