远程升级flash——W25Q64

multiboot

一个bin文件包含了两个程序

分为golden 和 update 两个区域

XILINX

xilinx golden 地址从0开始,通过xdc语句约束,可以跳转到指定的 update 区域

golden程序:
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
#跳转地址24'h400000
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x410000 [current_design]
#spi总线位宽
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]
#开启回退
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
set_property BITSTREAM.CONFIG.TIMER_CFG 32'h00200000 [current_design]

update程序:
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
#spi总线位宽
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]
#开启回退
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
set_property BITSTREAM.CONFIG.TIMER_CFG 32'h00200000 [current_design]

合并两个bit语句为一个bin文件:

write_cfgmem -format bin -interface SPIX1 -size 8 -loadbit "up 0 E:/Work/.bit up 0x0410000 E:/Work/.bit" E:/Work/MultiBoot.bin

更改工程后生成bin,覆盖update区域:
正常生成的bin不会bit swap(网上说不带bit swap不能升级成功,不知尊嘟假嘟)
用下面tcl生成的bin会bit swap

write_cfgmem  -format bin -size 8 -interface SPIX1 -loadbit {up 0x0000000 "E:/Work/.bit" } -file "E:/Work/U3084/vna/RF/auto_tst_vna_uts3084_rf_a7_64m_multiboot/update_change.bin"

anlogic

update 地址从0开始,0xe0000为golden起始地址

注意:

1.anlogic擦除update区域时,不能擦除0xd0000!!!!

2.当Update Image开始运行,当出现CRC error或者IDCODE error时,会fallback到Golden Image去运行。这个机制,类似于单片机中的Boot程序+应用程序,两个程序分别位于Flash的不同地址空间。

    2、错误类型

    CRC error

    IDCODE error

    Watchdog timer time-out error

    由于前两种错误类型不常出现,倒是远程更新Update Image的过程中,出现烧写不成功时,例如烧写一半断电,这种是不会触发前两种错误去fallback的,远程更新就失去了意义。

    这里必须应用第三种错误Watchdog timer time-out error,让它超时自动跳转。

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_22324309/article/details/126140662

3.anlogic不涉及Watchdog timer time-out error

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPI(Serial Peripheral Interface)是一种串行通信协议,可以用于与外设进行数据交互。W25Q64是一款64Mb的串行Flash存储器,支持SPI接口。 以下是使用C语言进行SPI读写W25Q64的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/spi/spidev.h> #define SPI_DEVICE "/dev/spidev0.0" // SPI设备节点路径 #define BUFFER_SIZE 256 // 缓冲区大小 int main() { int fd, ret; uint8_t tx_buffer[BUFFER_SIZE], rx_buffer[BUFFER_SIZE]; struct spi_ioc_transfer tr; // 打开SPI设备 fd = open(SPI_DEVICE, O_RDWR); if (fd < 0) { perror("Failed to open SPI device"); exit(1); } // 初始化SPI传输结构体 memset(&tr, 0, sizeof(tr)); tr.tx_buf = (unsigned long)tx_buffer; tr.rx_buf = (unsigned long)rx_buffer; tr.len = BUFFER_SIZE; tr.speed_hz = 10000000; tr.bits_per_word = 8; // 发送写命令 tx_buffer[0] = 0x06; // 写使能 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write enable command"); exit(1); } tr.len = 4; tx_buffer[0] = 0x02; // 写指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 memcpy(tx_buffer + 4, "Hello", 5); // 写入数据 // 发送写数据命令 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write command"); exit(1); } // 发送读命令 tr.len = 4; tx_buffer[0] = 0x03; // 读指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send read command"); exit(1); } printf("Data read from flash memory: %s\n", rx_buffer + 4); // 关闭SPI设备 close(fd); return 0; } ``` 以上代码演示了如何使用SPI接口读写W25Q64芯片。其中,首先通过ioctl函数设置SPI传输参数和指令,然后通过ioctl函数发送指令,并通过缓冲区读取或写入数据。 需要注意的是,通过SPI接口读写W25Q64芯片需要按照其通信协议进行操作,具体指令和数据格式可参考W25Q64的数据手册。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值