SPI Flash烧写算法实现

最近想写一个spi flash loader的算法 。
找了好多网上的文章都写得很笼统 没有提到spi相关的代码是如何实现的 下面是我的基板图

img

相要写算法的目的是我有一个已经构建好了的产品 想用SEGGER 的FlasherARM进行覆盖烧写
https://wiki.segger.com/Open_Flashloader#ARM_Cortex-A_and_Cortex-R_template_projects

我手里有产品内部的firmware 按理来说至少读写READ相关的代码应该有 可是我是第一次接触嵌入式编程和c语言 不太懂得具体是哪一个部分代码可以使用

想知道具体怎么把Init program功能给实现了

如果有人能帮我写了算法文件那万分感谢

(可以提供Driver 但是我也不太清楚哪个可以用 但是应该是有的)

《目的》
感兴趣的同学可以在这里回答或者私信我发给我参考项目,我完成了还会追加酬金,或者帮我实现算法文件也可 谢谢大家!


《追加资料》
感兴趣的同学可以看看这个参考资料 我就是想通过这个实现功能
这里就提到了再programpage函数里面有一个spi_flash_read(x,x,o,o)功能 。这个要怎么才能实现呢
http://www.bmrtech.com/Tech/tech_show/325.html

还有这个,里面也写到了EraseSector的功能,我和他写一样的能够实现么?还是根据SPI Flash种类不同要做哪些改进
https://linmingjie.cn/index.php/archives/341/#comment-19

img

<追加>:
我用的cpu是 TI AM3357,SPI Flash是MT25QL128ABA1EW7-0SIT

之前做过相似的,不过在这不太好回答,需要的话私信我

Keil的安装目录下C:\Keil_v5\ARM\Flash 有下载算法的模板,主要是要实现 Init() UnInit() EraseChip() EraseSector() ProgramPage() 这几个函数,函数的具体实现跟你使用的flash读写有关。

代码在spi flash运行,还是只是存储代码?

等等,朋友现在使用的是国产芯片吧,我们去年比赛有个就是,我们当时整个的流程就是,
第一步:硬件初始化,即init;
这里的硬件初始化是指初始化芯片W25Q128BV,而不是MCU的GPIO初始化,MCU对应W25Q128BV GPIO初始化应该在此之前;

W25Q128BV中的初始化为reset指令,分别为0x66和0x99指令,通过SPI将这两个指令发送给W25Q128BV 即可;
好的初始化一般含有初始化反馈,通过读取状态指令可得到该结果,读取状态指令为0x05,通过SPI将这个指令发送给W25Q128BV 即可,返回值中S0位进行判断,若为1即为BUSY,若为0即为空闲;

第二步:读设备号

W25Q128BV中的读设备号指令,分别为0x90指令,通过SPI将这个指令和地址0x000000发送给W25Q128BV ,返回的数据即为ID,且大端在前;

第三步:擦除块

W25Q128BV中的擦除扇区的指令为0x20,通过SPI将这个指令和需要擦除扇区的24bit地址0xXXXXXX发送给W25Q128BV即可;
擦除是否成功,擦除过程中可能失败,失败的表现为超时,与第一步中相同还是通过状态指令得到结果,读取状态指令为0x05,通过SPI将这个指令发送给W25Q128BV 即可,返回值中S0位进行判断,若为1即为BUSY,若为0即为空闲,在超时时间内完成擦除返回成功,否则返回超时;

第四步:写数据

W25Q128BV写数据时必须先开写使能0x06,再写指令,然后写数据;
写使能指令为0x06,通过SPI将这个指令发送给W25Q128BV即可;

使能是否成功,使能过程中可能失败,失败的表现为超时,与第一步中相同还是通过状态指令得到结果,读取状态指令为0x05,通过SPI将这个指令发送给W25Q128BV 即可,返回值中S0位进行判断,若为1即为BUSY,若为0即为空闲,在超时时间内完成擦除返回成功,否则返回超时。

望采纳谢谢啦

如果您使用25系列的flash(或兼容),我有成熟的read,write和erase接口程序,C语言spi接口驱动的,具体私信联系

SPI烧录是基于协议的, 这个协议是固化在芯片中的, 这个协议大部分都是符合标准兼容的
一个芯片烧录的命令可以从datasheet中看到, 比如 W25Q64, 从datasheet中可以看到
Sector Erase (20h)
这个20就是扇区擦除的命令, 文档有详细的说明, 其他命令也是一样的