eric2013 发表于 2017-11-28 11:29:48

【简易教程】关于采用F429的FMC总线实现IO扩展和采用32位总线方式时译码器的地址计

说明:
1.本来跑马灯应该是开发板里面最简单的电路了,但是我们的V6板子里面却是最复杂的,所以必须得发个贴为大家说明下。
2.为什么要做IO扩展,不是已经用了208脚的F429BIT6吗?因为开发板使用了32位SDRAM和RGB888硬件接口,消耗IO巨大,所以必须得扩展了。
3.NOR/PSRAM/SRAM块区不是有4个片选NE1,NE2,NE3和NE4吗,为什么还要做译码器?因为引脚复用,部分片选对应的引脚要用于其他功能,而且要控制的总线外设较多,片选不够用。
4.FSMC和FMC的区别就是FMC多了一个SDRAM控制器。
5.NE1,NE2,NE3和NE4的片选对应的配置都是独立的,互不影响的,这点要特别注意。
==================================================================
一、先来看下FMC的框图,主要是NOR/PSRAM/SRAM块区。

有了这个认识之后再来看下面的译码器电路:

SN74LVC1G139APWR是双2-4线地址译码器。也就是带了两个译码器。原理图上仅用了一个。
下面是139的真值表和引脚功能:



通过上面的原理图和真值表就比较好理解了,真值表的输出是由片选FMC_NE2和地址线FMC_A10、FMC_A11控制。
FMC_NE2 输出低电平:
FMC_A11(B),FMC_A10(A) = 00时,1Y0输出的低电平,选择的是OLED。
FMC_A11(B),FMC_A10(A) = 01时,1Y1输出的低电平,选择的是74HC574。
FMC_A11(B),FMC_A10(A) = 10时,1Y2输出的低电平,选择的是DM9000。
FMC_A11(B),FMC_A10(A) = 11时,1Y3输出的低电平,选择的是AD7606。
然后我们再计算译码器的地址,注意,这里地址的计算都是按照FMC的32bit访问模式计算的,因为我们的V6程序中是将NE2对应的FMC配置为32bit模式了。
具体FMC的32bit访问模式,16bit访问模式和8bit访问模式的区别就在这里:

32bit模式下,我们计算A10和A11的时候,实际上需要按HADDR12和HADDR13计算的。
如果来算NE2 + HADDR12 + HADDR13的四种组合地址就是如下:
NE2 + HADDR13 + HADDR12 = 0x6400000 +0<<13 + 0<<12 = 0x64000000
NE2 + HADDR13 + HADDR12 = 0x6400000 +0<<13 + 1<<12 = 0x64001000
NE2 + HADDR13 + HADDR12 = 0x6400000 +1<<13 + 0<<12 = 0x64002000
NE2 + HADDR13 + HADDR12 = 0x6400000 +1<<13 + 1<<12 = 0x64003000
这样一来,原理图里面给的地址就对应上了。同理如果配置为16位模式和8位模式,大家应该也都会计算了。
二、下面讲解下IO扩展部分
先来看下IO扩展的原理图实现,如果不太了解FMC的通信时序和数字逻辑芯片的使用,可能会比较懵,下面逐一为大家说明。


有了这个原理图,首先要做的就是了解74HC574和SN74HC32的功能。
74HC574是一款8位三态D触发器,起到锁存的功能,上升沿触发,对应的真值表如下(L表示低电平,H表示高电平,Z表示高阻):


SN74HC32是一款2输入或门,一个芯片带了四组或门,对应的真值表如下(L表示低电平,H表示高电平):


有了这个认识后,我们再来看FMC的配置,V6开发板的BSP驱动包里面专门做了一个IO扩展的FMC配置,即文件bsp_ext_io.c,配置方式是FMC_AccessMode_A,这种模式对应的写时序是:


这个写时序图结合上面的IO扩展原理图,可以看出:
如果用户在程序里面执行了FMC的写操作,数据会写到4片74HC574的输入端,当NE片选,NWE写信号都是低电平期间,有一个出现高电平,就会给74HC574发送一个上升沿,从而实现D触发的数据锁存功能。这个就是IO扩展实现的功能。
三、举例LED驱动
进行到这里,就可以给大家讲解LED驱动了。由上面IO扩展原理图中对应的LED驱动引脚,我们可以得出,操作LED的亮灭就是操作FMC的数据引脚D8,D9,D10和D11




即对地址0x64001000发送数据就可以了,但是如何对这个地址发送数据呢? 反映到C语言的实现上就是通过固定地址的指针变量(跟我们操作寄存器是一样的),即
#defineHC574_PORT   *(uint32_t *)0x64001000
如果要点亮LED1(低电平点亮),就是 HC574_PORT = 0x0000 0000,如果要熄灭LED1就是HC574_PORT = 0x0000 0100,即操作FMC_D8的高低电平即可。


四:总结
关于IO扩展还有很多的方法,只是我们这里采用的是FMC总线扩展,主要是考虑到速度比较快。大家扩展的话可以使用595等串行转并行的数字逻辑芯片,或者直接用便宜些的MCU做扩展都是不错的选择。

浮生如梦 发表于 2017-11-28 14:31:29

顶下,还在看,有点吃力

eric2013 发表于 2017-11-28 15:16:58

回 浮生如梦 的帖子

浮生如梦:顶下,还在看,有点吃力 (2017-11-28 14:31) images/back.gif

没事的,有些比较吃力的地方随时可以找我交流,或者先记住它,以后你慢慢搞的多的,再来看这个帖子,反复搞那么几次就好理解了。

dreamworks 发表于 2017-11-29 20:41:30

感谢eric分享经验

打洞者 发表于 2017-12-1 18:10:44

756572527 发表于 2017-12-2 08:36:58

一开始也是开得很愣,不过后来查了芯片资料就好多了。

浮生如梦 发表于 2017-12-2 15:15:27

回 eric2013 的帖子

eric2013:没事的,有些比较吃力的地方随时可以找我交流,或者先记住它,以后你慢慢搞的多的,再来看这个帖子,反复搞那么几次就好理解了。 (2017-11-28 15:16) images/back.gif

硬汉大哥,扩展IO是不是这样理解:如果控制LED1灯亮,我们不再控制MCU的一个IO管脚,而是通过控制外设FMC的某个管脚间接控制灯的量灭。

浮生如梦 发表于 2017-12-2 15:28:14

回 浮生如梦 的帖子

浮生如梦:硬汉大哥,扩展IO是不是这样理解:如果控制LED1灯亮,我们不再控制MCU的一个IO管脚,而是通过控制外设FMC的某个管脚间接控制灯的量灭。 (2017-12-02 15:15) images/back.gif

硬汉大哥:这里不用回答了,您已经在群里解答过了;问题没搞懂,有点着急,就在群里直接请教你了,多谢!

eric2013 发表于 2017-12-3 03:11:11

回 浮生如梦 的帖子

浮生如梦:硬汉大哥:这里不用回答了,您已经在群里解答过了;问题没搞懂,有点着急,就在群里直接请教你了,多谢! (2017-12-02 15:28) images/back.gif

小麦吉17 发表于 2017-12-6 19:42:04


楼主能解释下这个话吗?

小麦吉17 发表于 2017-12-6 19:50:21


明白了

leiyitan 发表于 2018-1-3 08:18:22

这个板子这一块比较懵,感谢楼主大大特意发帖照顾我们这种小白…

dandelion 发表于 2018-2-5 23:23:59

请问下这里的SN74HC32PW供电电源是多少呀?

eric2013 发表于 2018-2-6 01:36:17

dandelion 发表于 2018-2-5 23:23
请问下这里的SN74HC32PW供电电源是多少呀?

3.3V

Snapdragon 发表于 2018-2-6 12:27:55

这。。。对初学者很不友好啊,毕竟基本上入门都是点灯。。

eric2013 发表于 2018-2-7 01:24:29

Snapdragon 发表于 2018-2-6 12:27
这。。。对初学者很不友好啊,毕竟基本上入门都是点灯。。

是的。
FMC的IO扩展功能极其实用,属于项目必备知识。

云琴箫龙 发表于 2018-7-1 20:03:22

电平锁存和边沿锁存,哪个抗干扰比较强?

云琴箫龙 发表于 2018-7-1 23:07:22

如果再扩展32路,硬汉哥推荐用什么方案?
我想的是用一个类似于38译码器的器件,依靠地址总线于选择NWE上升沿的输出对象。

云琴箫龙 发表于 2018-7-1 23:14:20

还有一个疑问,从时序上看,NWE上升沿比NE2_B上升沿至少超前1个时钟周期,那只用NWE就可以触发锁存引脚了,为何还要加一个或门?

eric2013 发表于 2018-7-2 00:56:30

云琴箫龙 发表于 2018-7-1 23:07
如果再扩展32路,硬汉哥推荐用什么方案?
我想的是用一个类似于38译码器的器件,依靠地址总线于选择NWE上 ...
直接795级联

eric2013 发表于 2018-7-2 00:59:07

云琴箫龙 发表于 2018-7-1 23:14
还有一个疑问,从时序上看,NWE上升沿比NE2_B上升沿至少超前1个时钟周期,那只用NWE就可以触发锁存引脚了, ...

都加上可靠些。

云琴箫龙 发表于 2018-7-2 20:32:15

eric2013 发表于 2018-7-2 00:59
都加上可靠些。

从时序上看,NEx跳变的时候数据引脚已经处于不确定状态了吧,且NE2_B由NEx译码得来,理论上比NEx上升沿来的还要慢一些,这时候数据总线的数据状态可能已经处于不确定状态了。
所以个人理解这个或门加上反倒可能会造成数据出错,但是出错的前提是NWE的上升沿没有出现或晚于NEx出现,这个感觉没可能吧

云琴箫龙 发表于 2018-7-2 20:38:27

eric2013 发表于 2018-7-2 00:56
直接795级联

之前用过595去扩IO驱动LED指示灯,但是发现这个片子抗干扰真的很差劲,旁边的EMC设备一开,595输出数据就紊乱了,为此专门做过一个测试版,把输入全部拉低也不行,TI原厂技术也来了,最终也没解决,最后换的DRV8860的方案才顺利解决,两者内部电气原理几乎一样,但成本也提高了不少。

eric2013 发表于 2018-7-3 00:03:49

云琴箫龙 发表于 2018-7-2 20:32
从时序上看,NEx跳变的时候数据引脚已经处于不确定状态了吧,且NE2_B由NEx译码得来,理论上比NEx上升沿来 ...

没有NE片选的话,你忽略了最重要的一点,任何FMC操作都可以影响这个外设。

eric2013 发表于 2018-7-3 00:04:57

云琴箫龙 发表于 2018-7-2 20:38
之前用过595去扩IO驱动LED指示灯,但是发现这个片子抗干扰真的很差劲,旁边的EMC设备一开,595输出数据就 ...
DRV8860的确是不便宜,之前在V6群还讨论过这个问题。

595属于非常经典的方案了,可以换个其他厂家的595芯片试试。

云琴箫龙 发表于 2018-7-3 22:49:34

eric2013 发表于 2018-7-3 00:03
没有NE片选的话,你忽略了最重要的一点,任何FMC操作都可以影响这个外设。

对啊,之前没考虑到这个问题,这么看来这里或门的使用还是非常巧妙的。

云琴箫龙 发表于 2018-7-3 22:55:17

eric2013 发表于 2018-7-3 00:04
DRV8860的确是不便宜,之前在V6群还讨论过这个问题。

595属于非常经典的方案了,可以换个其他厂家的59 ...

他们的回复是595设计抗干扰本来就差,对外部电路设计要求比较高,基本上要加一堆防护,DRV8860在板子上几乎是裸奔的状态,从来没有出过问题。之前的设备就一直这么用了。
TI的多种后缀的片子都试过,正规代理拿来的应该不是水货,其它家的有机会也试试。

eric2013 发表于 2018-7-4 00:46:18

云琴箫龙 发表于 2018-7-3 22:55
他们的回复是595设计抗干扰本来就差,对外部电路设计要求比较高,基本上要加一堆防护,DRV8860在板子上几 ...

感谢告知这个情况,后面也得留意下:handshake

蓝瑟lemon 发表于 2018-7-7 21:35:00

设计的很巧妙啊 ,希望能分享更多的类似设计!!

cortex 发表于 2018-7-7 23:36:34

云琴箫龙 发表于 2018-7-2 20:38
之前用过595去扩IO驱动LED指示灯,但是发现这个片子抗干扰真的很差劲,旁边的EMC设备一开,595输出数据就 ...

你是3.3直接驱动595还是有5V上拉,如果你74HC4595是5v供电,我也出现过这个问题,输出是絮乱的,后来我把输入的3个IO开漏输出,使用外部的上拉就解决问题了

byccc 发表于 2018-7-8 10:08:18

cortex 发表于 2018-7-7 23:36
你是3.3直接驱动595还是有5V上拉,如果你74HC4595是5v供电,我也出现过这个问题,输出是絮乱的,后来我把 ...

貌似推挽也没问题,就是不知道那个效果更好些。

cortex 发表于 2018-7-8 19:52:23

推挽的话,这样只有3.3V,我开漏外加上拉有5V,上拉电阻稍微小点,效果可能更加好。外加了5V上拉,一定要关闭内部的上拉,不然两个电阻会分压,实际IO的高电平只有4V左右,有兴趣的可以试试

byccc 发表于 2018-7-9 11:18:12

cortex 发表于 2018-7-8 19:52
推挽的话,这样只有3.3V,我开漏外加上拉有5V,上拉电阻稍微小点,效果可能更加好。外加了5V上拉,一定要关 ...

非常感谢:handshake

dandelion 发表于 2018-7-29 21:45:19

这种扩展方式,是否只能用于输出?如果有输入口,能挂在这上面吗?

eric2013 发表于 2018-7-30 00:49:18

dandelion 发表于 2018-7-29 21:45
这种扩展方式,是否只能用于输出?如果有输入口,能挂在这上面吗?

对,不能做输入。

dy84082666 发表于 2018-10-19 09:16:26

本帖最后由 dy84082666 于 2018-10-19 09:20 编辑

eric2013 发表于 2018-7-30 00:49
对,不能做输入。
很有用的教程,说的很详细。果断收藏。

在这问一下,有没有用作输入口的方案?;P

是不是把输入D0~31和对面的管脚对调,然后使用nOE与片选做个或门,就能实现?;P

magicoctoier 发表于 2018-10-19 09:31:53

dy84082666 发表于 2018-10-19 09:16
很有用的教程,说的很详细。果断收藏。

在这问一下,有没有用作输入口的方案?


IO口扩展如果同时需要输入和输出,建议使用PCF8574使用IIC总线扩展IO(TI和NXP都有这个型号),或者使用PCF8574的升级产品PCA8574 PCA9674等等NXP的PCA系列。

dy84082666 发表于 2018-10-19 09:56:17

magicoctoier 发表于 2018-10-19 09:31
IO口扩展如果同时需要输入和输出,建议使用PCF8574使用IIC总线扩展IO(TI和NXP都有这个型号),或者使用P ...

谢谢您的解答,其实我想问的是用地址数据总线扩展输入口的方法。

顺便一提,用74HC245也可以扩展输入或输出口。

myxiaonia 发表于 2018-10-22 18:46:20

dy84082666 发表于 2018-10-19 09:56
谢谢您的解答,其实我想问的是用地址数据总线扩展输入口的方法。

顺便一提,用74HC245也可以扩展输入 ...

8255啊

云琴箫龙 发表于 2018-12-8 17:38:22

最近想用FMC扩展IO口,再次翻看这个帖子的时候又产生了一点儿疑问
如果用FMC_NE2_B直接接四片574的片选,FMC_NWE接四片574的CP端,似乎也可以实现啊,而且还省了一个或门芯片。硬汉哥为何不采用这种方案呢?
页: [1] 2
查看完整版本: 【简易教程】关于采用F429的FMC总线实现IO扩展和采用32位总线方式时译码器的地址计