- 主题:请教一个问题的解决方案
现有一块板子,MCU A+片外spi flash,MCU A 的fw存在spi flash中。目前因为需求改变,增加了另一块MCU B,MCU B片内flash较大,因此想将MCU A的fw存在MCU B中,以节省spi flash的成本。为了不改MCU A 的spi 驱动,需要在MCU B的spi 驱动中实现类似spi flash一样的接口(命令和时序),目前的难点是:MCU B怎么知道MCU A 发过来的是命令,地址还是数据?
我看了几款spi flash的data sheet,我猜测它们内部的硬件应该是检测了CS,CS拉低后的第一个数据就是命令,这样判断的,但是在fw中如何能达到这个目的?
--
FROM 183.227.238.*
这个方案刚开始我也这样想过,因为这时B就知道A发过来的第一个字节肯定就是opcode,但由于A片内内存非常小,不能一次把fw加载完,因此采用了动态加载的办法,就是A在运行过程中根据需要去B中加载相应的段。
【 在 jiu 的大作中提到: 】
: B控制A的复位。然后就模拟SPI的时序把bin发过去就行了。
: A的复位从外部SPI启动的时序手册里面能找到。
:
--
FROM 223.104.250.*
我也想到过这个办法,但细节没有多想。读取内部flash到应该不是问题,内部是norflash,直接像内存一样读就行。我还想到另一个办法,不知可行不,在A的spi驱动中,发读命令前加一个魔数,就是这样的格式:4字节魔数+1字节opcode+3字节地址,B检测到这个魔数就知道opcode和地址了
【 在 haveidea 的大作中提到: 】
: CS#连MCU B的GPIO呢?检测到下降沿就对SPI的状态机进行复位,开始接收命令?比较担心的是接收到命令和地址之后,来不来得及读取内部flash,把数据及时发出去。
--
FROM 223.104.250.*
就是量很大,最好要省这个成本
【 在 liu7894 的大作中提到: 】
: 如果没什么量的板子,就不要在意flash的价钱了。
: 你调试你的成本,比这个高。
:
--
FROM 223.104.250.*
"固定的bit信号握手"啥意思,能细说一下吗
【 在 jiu 的大作中提到: 】
: 动态加载更好办啊。
: 两边固定的bit信号握手就行,成功之后加载。
:
--
FROM 183.227.238.*
就是这个办法吧:在A的spi驱动中,发读命令前加一个魔数,就是这样的格式:4字节魔数+1字节opcode+3字节地址,B检测到这个魔数就知道opcode和地址了
【 在 jiu 的大作中提到: 】
: 就是随便约定个有规律的信号
: 或者A准备好了,给B发终端。
:
--
FROM 183.227.238.*
好的,谢谢,看来这个方法确实可行,我之前也想到这个办法
【 在 jiu 的大作中提到: 】
: 嗯嗯。固定端口的中断也行啊。
:
--
FROM 117.136.30.*
关于速度这个问题,我到还没想,我现在的spi时钟是10M,b的片内norflash可以像内存一样读,不确定这个速度能否满足10M时钟,但我理解的是在b获得地址后,多等待几个spi时钟发出数据也没问题吧?
【 在 haveidea 的大作中提到: 】
: 修改a的驱动的话,好处是功能你能自己定义,缺点是就不能兼容flash了。如果你能解决好b自己flash读数的问题,还是用cs中断比较好。假设a只有读,b的流程是cs中断,spi接收,spi每个字节一次中断,b相应解析命令和地址,获得地址后读取本地flash,在地址位之后的下一个时钟按时序放出数据。这里面比较困难的是得到地址位后,需要在下一钟之前读到本地flash,并赶在下个钟前放出去。要看b处理器够不够快,实在不行只能放慢spi的钟
--
FROM 117.136.30.*