打印

STM32F217 内部ARM和FMSC之间工作机制的问题求教--兼吐槽代理商

[复制链接]
5161|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
blueboyjf|  楼主 | 2013-2-28 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
背景: STM32F217通过FMSC总线接8颗16bit总线的NOR flash.
PC往U盘里面写入文件然后再读取对比文件的时候,发现有时候读出来的文件跟写入的文件有几个字节甚至是很多0x00的差别。
现在想问一下

1、FSMC在执行读写时,ARM内核是阻塞等待所有时序结束才执行下一条指令,还是继续执行下面的指令?
1.1、如果是继续执行下面的指令,那如果上一个读写的时序没有结束,就立即读写下一个bank,是否会导致上一个读写时序不完整?
1.2、如果是继续执行下面的指令,那如何判断上一个读写时序已经结束?

2、ARM内核在读写片上flash和sram时,是否也会产生WE、OE的信号?如果产生,这些信号是否会和FSMC的时序重合?

麻烦高人指教一下.

另外, 使用STM32F217做这个项目,代理商过了1-2个月才给一个参考价和很长的交期. 上面这个问题问了一周了,代理商不回复. 打电话问,FAE还不懂我的问题是什么意思. 让他问ST的相关人员,还扭扭捏捏说ST的人很忙的,不一定会回答.
唉,问都不问,怎么就知道人家不回答呢?
香版主帮忙来看看吧. 谢谢了
沙发
hawksabre| | 2013-2-28 21:10 | 只看该作者
只能帮你顶一个   这个片子还不是很熟悉   呵呵   顶一个

使用特权

评论回复
板凳
jlass| | 2013-3-1 09:47 | 只看该作者
本帖最后由 jlass 于 2013-3-1 09:49 编辑

1、使用nwait线的情况下是等待的,不适用nwait线的情况下是继续执行的(所以不使用nwait线时必须把读写速度放慢)
2、会产生WE、OE,但是不会产生CE,所以不冲突。

使用特权

评论回复
地板
IJK| | 2013-3-1 13:20 | 只看该作者
ARM内核在读写STM32片上flash和sram时,是否也会产生WE、OE的信号?
不会产生WE、OE的信号

使用特权

评论回复
5
blueboyjf|  楼主 | 2013-3-1 14:17 | 只看该作者
jlass 发表于 2013-3-1 09:47
1、使用nwait线的情况下是等待的,不适用nwait线的情况下是继续执行的(所以不使用nwait线时必须把读写速度 ...

谢谢jlass

1. nwait没有使用的情况下, ARM内核继续执行的话,极端情况下会把FMSC的数据冲掉,是吗? 内部没有机制可以检测FMSC是否ready?
2. 会产生WE和OE吗? 4楼IJK大虾说不会. 我感觉应该也不会.否则就会冲突了.

使用特权

评论回复
6
blueboyjf|  楼主 | 2013-3-1 14:18 | 只看该作者
IJK 发表于 2013-3-1 13:20
ARM内核在读写STM32片上flash和sram时,是否也会产生WE、OE的信号?
不会产生WE、OE的信号 ...

谢谢IJK.
我觉得应该也不会.
那么第1个问题,没有nwait的情况下,ARM内核会继续执行吗? 没有检测FMSC是否busy的机制?

希望更多的人来讨论.

使用特权

评论回复
7
jlass| | 2013-3-1 15:02 | 只看该作者
本帖最后由 jlass 于 2013-3-1 15:07 编辑
blueboyjf 发表于 2013-3-1 14:17
谢谢jlass

1. nwait没有使用的情况下, ARM内核继续执行的话,极端情况下会把FMSC的数据冲掉,是吗? 内部没 ...

1、nwait就是ready的控制线(也叫busy线),不用的话当然会冲掉,而且比较典型的方式就是下一个地址的数据写到了上一个地址中去。
2、ARM内核在读写片上flash和sram时,指的是arm内部的flash吗?如果是的话,不会。如果是片外flash的话,一定会,不然就法没用了。

使用特权

评论回复
8
blueboyjf|  楼主 | 2013-3-1 15:46 | 只看该作者
jlass 发表于 2013-3-1 15:02
1、nwait就是ready的控制线(也叫busy线),不用的话当然会冲掉,而且比较典型的方式就是下一个地址的数据 ...

被带偏了.
1. 问题是这样的.ARM往FMSC写完数据以后,由FMSC负责把数据输出到总线上. FMSC把数据输出到总线上需要时间. ARM要不要等待FMSC写完以后再去继续执行下一条指令.FMSC比ARM内核慢很多.
1.1 如果继续执行,下一个FMSC的数据指令会不会导致前面一个FMSC数据没有完成就中断?
1.2 如果ARM继续执行,什么时候判断FMSC完成? 还是根本不判断FMSC完成?

问题的本质是: ARM跟慢速外设FMSC之间是怎么通讯的?

使用特权

评论回复
9
jlass| | 2013-3-1 16:00 | 只看该作者
本帖最后由 jlass 于 2013-3-1 16:05 编辑

ARM往FMSC写完数据以后,一般需要读取某个寄存器来确认数据是否发送出去。如果带操作系统的话,应该已经写好了,如果裸奔的话,这一步需要你自己处理。如果不做处理的话,速度太快是会冲掉前面的数据的。

之前说的是arm和nor flash之间的通讯

使用特权

评论回复
10
blueboyjf|  楼主 | 2013-3-1 18:21 | 只看该作者
jlass 发表于 2013-3-1 16:00
ARM往FMSC写完数据以后,一般需要读取某个寄存器来确认数据是否发送出去。如果带操作系统的话,应该已经写 ...

但是看手册,FMSC并没有一个这样的寄存器给用户使用啊

使用特权

评论回复
11
jlass| | 2013-3-4 09:54 | 只看该作者
本帖最后由 jlass 于 2013-3-4 15:10 编辑
blueboyjf 发表于 2013-3-1 18:21
但是看手册,FMSC并没有一个这样的寄存器给用户使用啊

我去看了一遍FSMC的结构,重新理一下

一般arm与接口外设之间的操作有两种:
1、arm往fifo写数据,fifo往接口写数据,这种情况fifo会有一个标志位判断是否空或者满。多用于串口等统一标准的外设接口
2、arm直接往外设接口写数据,中间没有缓冲,但需要设定数据的建立时间、保持时间、持续时间等各项参数。多见于并口。

从你的情况看,fsmc属于第二种,此时arm与fsmc之间不会有数据丢失的情况(地址和数据实时传输,靠片选信号等总线来判定),但是当你设定的数据建立时间、保持时间、持续时间等各项参数不正确时(其中数据的持续时间可以通过nwait线来保证,其他的参数仍然要设定),fsmc与nor flash之间就会有数据错误(其实就是没写进去或者没读出来)

使用特权

评论回复
12
blueboyjf|  楼主 | 2013-3-4 18:10 | 只看该作者
jlass 发表于 2013-3-4 09:54
我去看了一遍FSMC的结构,重新理一下

一般arm与接口外设之间的操作有两种:

你说的第二种情况还是FMSC跟外部器件(比如NOR flash)之间工作原理. 不是CPU core和FMSC之间的工作原理.
我们后来又想了一下,ARM core跟FMSC之间必然有一种机制来保证FMSC的数据有没有传输完毕.
这种机制是IC设计经常遇到的,不管怎样,相信ST应该可以保证FMSC数据没有传输完成前不会冲掉前面的数据.

我们再想想本身软件和硬件的问题吧.
还是很谢谢你的热心帮忙.

使用特权

评论回复
13
aozima| | 2013-3-4 19:40 | 只看该作者
手册上面写了FSMC有一个字的write FIFO的,这样的话,如果向FSMC写数据,但FSMC比较慢,
此时内核会继续执行的,FSMC则会慢慢发,所以不会因FSMC比内核慢而等待。
但如果第二条(或更后面)的指令也要写FSMC,则只有等FSMC空闲了(FIFO空)。

扩展思考: read的时候fifo是否起作用?

使用特权

评论回复
14
jlass| | 2013-3-5 09:22 | 只看该作者
本帖最后由 jlass 于 2013-3-5 11:54 编辑
blueboyjf 发表于 2013-3-4 18:10
你说的第二种情况还是FMSC跟外部器件(比如NOR flash)之间工作原理. 不是CPU core和FMSC之间的工作原理.
...

arm和fsmc之间绝对不会丢数据的,因为这个过程只需要一条汇编语句(不考虑流水线时,可以认为芯片是阻塞等待的),只存在fsmc与外设之间传输出错的概念(fsmc的配置错了),不存在丢数据的概念。但是因为arm的速度快,外设的速度慢,所以只有外设才会存在数据被冲掉的概念。

使用特权

评论回复
15
blueboyjf|  楼主 | 2013-3-5 18:13 | 只看该作者
jlass 发表于 2013-3-5 09:22
arm和fsmc之间绝对不会丢数据的,因为这个过程只需要一条汇编语句(不考虑流水线时,可以认为芯片是阻塞等 ...

对于用户来说, 访问FSMC只是一条汇编指令的问题. 但是对于IC内部来说,还是需要有一个通信确认的机制的. 今天问了一个做U盘控制器的IC设计工程师,说是FSMC这样的外设接口一般有一个状态寄存器或者FIFO. 内核给外设写入数据以后,是要等待这个状态寄存器结束才行的. 否则内核会把外设接口没来得及传输到总线上的数据冲掉. 这个FSMC的内部的状态寄存器是被IC内部使用的,用户是看不到的.

所以,根据推理, ARM和FSMC之间数据是不会丢失的冲突的. 发帖的目的就是讨论确认不会冲突和丢失.

使用特权

评论回复
16
blueboyjf|  楼主 | 2013-3-5 18:16 | 只看该作者
aozima 发表于 2013-3-4 19:40
手册上面写了FSMC有一个字的write FIFO的,这样的话,如果向FSMC写数据,但FSMC比较慢,
此时内核会继续执行 ...

如果ARM内核继续执行,下次遇到FSMC的时候再停止等待,那么CPU内部会遇到很多问题. 因为CPU执行判断的时候,很可能用到很多变量. 这个变量可能就是根据FSMC传回来的数据判断的. 没有了FSMC传回数据这一步,判断就可能出错了.

所以内部还是应该等待外设接口的机制.

使用特权

评论回复
17
jlass| | 2013-3-6 08:46 | 只看该作者
本帖最后由 jlass 于 2013-3-6 09:17 编辑
blueboyjf 发表于 2013-3-5 18:13
对于用户来说, 访问FSMC只是一条汇编指令的问题. 但是对于IC内部来说,还是需要有一个通信确认的机制的.  ...

我总算明白对方的FAE为什么不明白你在问什么,有几个人会去研究这些啊。
今天问了一个做U盘控制器的IC设计工程师,说是FSMC这样的外设接口一般有一个状态寄存器或者FIFO. 内核给外设写入数据以后,是要等待这个状态寄存器结束才行的. 否则内核会把外设接口没来得及传输到总线上的数据冲掉


他说的就是我指的第一种情况(串口控制的那种),fsmc的结构更本不是这样的。


这个FSMC的内部的状态寄存器是被IC内部使用的,用户是看不到的


这个说法纯属瞎扯


一个写值的汇编语句,如果是写cache只需要一个clock,而写外设需要多个clock,之所以有多个clock并不是因为期间有去查什么寄存器,而是因为你设定了setup time(假设10个clock),hold time(假设20个clock),delay time(假设5个clock),那么总的开销为35个clock,这35个clock完成之后外设就写完了,而在此期间对外设的写是阻塞的,你不能用同一个片选去干其他的事情。一个clock为mcu处理的最小处理单元,也就意味着没有被打断或者冲掉的可能。

使用特权

评论回复
18
jlass| | 2013-3-6 09:18 | 只看该作者
本帖最后由 jlass 于 2013-3-7 09:25 编辑

好吧,我激动了
如果他指的是nand flash的结构,倒是完全正确的。

使用特权

评论回复
19
55854234| | 2013-3-6 11:06 | 只看该作者
学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

38

帖子

1

粉丝