硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10129|回复: 61
收起左侧

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

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
发表于 2017-11-28 11:29:48 | 显示全部楼层 |阅读模式
说明:
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块区。
QQ截图20171128114534.jpg
有了这个认识之后再来看下面的译码器电路:
QQ截图20171128114825.jpg
SN74LVC1G139APWR是双2-4线地址译码器。也就是带了两个译码器。原理图上仅用了一个。
下面是139的真值表和引脚功能:
QQ截图20171128120107.jpg
1.jpg

通过上面的原理图和真值表就比较好理解了,真值表的输出是由片选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访问模式的区别就在这里:
QQ截图20171128121112.jpg
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的通信时序和数字逻辑芯片的使用,可能会比较懵,下面逐一为大家说明。
QQ截图20171128122115.jpg

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

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

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

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

QQ截图20171128130305.jpg

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


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

使用道具 举报

3

主题

45

回帖

54

积分

初级会员

积分
54
发表于 2017-11-28 14:31:29 | 显示全部楼层
顶下,还在看,有点吃力
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2017-11-28 15:16:58 | 显示全部楼层

回 浮生如梦 的帖子

浮生如梦:顶下,还在看,有点吃力&#160;(2017-11-28 14:31)&#160;
没事的,有些比较吃力的地方随时可以找我交流,或者先记住它,以后你慢慢搞的多的,再来看这个帖子,反复搞那么几次就好理解了。
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2017-11-29 20:41:30 | 显示全部楼层
感谢eric分享经验
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2017-12-1 18:10:44 | 显示全部楼层
[s:151]
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2017-12-2 08:36:58 | 显示全部楼层
一开始也是开得很愣,不过后来查了芯片资料就好多了。
回复

使用道具 举报

3

主题

45

回帖

54

积分

初级会员

积分
54
发表于 2017-12-2 15:15:27 | 显示全部楼层

回 eric2013 的帖子

eric2013:没事的,有些比较吃力的地方随时可以找我交流,或者先记住它,以后你慢慢搞的多的,再来看这个帖子,反复搞那么几次就好理解了。&#160;(2017-11-28 15:16)&#160;
硬汉大哥,扩展IO是不是这样理解:如果控制LED1灯亮,我们不再控制MCU的一个IO管脚,而是通过控制外设FMC的某个管脚间接控制灯的量灭。
回复

使用道具 举报

3

主题

45

回帖

54

积分

初级会员

积分
54
发表于 2017-12-2 15:28:14 | 显示全部楼层

回 浮生如梦 的帖子

浮生如梦:硬汉大哥,扩展IO是不是这样理解:如果控制LED1灯亮,我们不再控制MCU的一个IO管脚,而是通过控制外设FMC的某个管脚间接控制灯的量灭。&#160;(2017-12-02 15:15)&#160;
硬汉大哥:这里不用回答了,您已经在群里解答过了;问题没搞懂,有点着急,就在群里直接请教你了,多谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2017-12-3 03:11:11 | 显示全部楼层

回 浮生如梦 的帖子

浮生如梦:硬汉大哥:这里不用回答了,您已经在群里解答过了;问题没搞懂,有点着急,就在群里直接请教你了,多谢!&#160;(2017-12-02 15:28)&#160;
[s:130]
回复

使用道具 举报

0

主题

3

回帖

0

积分

新手上路

积分
0
发表于 2017-12-6 19:42:04 | 显示全部楼层
1.png
楼主能解释下这个话吗?
回复

使用道具 举报

0

主题

3

回帖

0

积分

新手上路

积分
0
发表于 2017-12-6 19:50:21 | 显示全部楼层
1.png
明白了
回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-1-3 08:18:22 来自手机 | 显示全部楼层
这个板子这一块比较懵,感谢楼主大大特意发帖照顾我们这种小白…
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
发表于 2018-2-5 23:23:59 | 显示全部楼层
请问下这里的SN74HC32PW供电电源是多少呀?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-2-6 01:36:17 | 显示全部楼层
dandelion 发表于 2018-2-5 23:23
请问下这里的SN74HC32PW供电电源是多少呀?

3.3V
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

积分
37
发表于 2018-2-6 12:27:55 | 显示全部楼层
这。。。对初学者很不友好啊,毕竟基本上入门都是点灯。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-2-7 01:24:29 | 显示全部楼层
Snapdragon 发表于 2018-2-6 12:27
这。。。对初学者很不友好啊,毕竟基本上入门都是点灯。。

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-1 20:03:22 | 显示全部楼层
电平锁存和边沿锁存,哪个抗干扰比较强?
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-1 23:07:22 | 显示全部楼层
如果再扩展32路,硬汉哥推荐用什么方案?
我想的是用一个类似于38译码器的器件,依靠地址总线于选择NWE上升沿的输出对象。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-1 23:14:20 | 显示全部楼层
还有一个疑问,从时序上看,NWE上升沿比NE2_B上升沿至少超前1个时钟周期,那只用NWE就可以触发锁存引脚了,为何还要加一个或门?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-2 00:56:30 | 显示全部楼层
云琴箫龙 发表于 2018-7-1 23:07
如果再扩展32路,硬汉哥推荐用什么方案?
我想的是用一个类似于38译码器的器件,依靠地址总线于选择NWE上 ...

直接795级联
19_58_1c4e0258a8a3b47.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-2 00:59:07 | 显示全部楼层
云琴箫龙 发表于 2018-7-1 23:14
还有一个疑问,从时序上看,NWE上升沿比NE2_B上升沿至少超前1个时钟周期,那只用NWE就可以触发锁存引脚了, ...

都加上可靠些。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-2 20:32:15 | 显示全部楼层
eric2013 发表于 2018-7-2 00:59
都加上可靠些。

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-2 20:38:27 | 显示全部楼层

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-3 00:03:49 | 显示全部楼层
云琴箫龙 发表于 2018-7-2 20:32
从时序上看,NEx跳变的时候数据引脚已经处于不确定状态了吧,且NE2_B由NEx译码得来,理论上比NEx上升沿来 ...

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-3 00:04:57 | 显示全部楼层
云琴箫龙 发表于 2018-7-2 20:38
之前用过595去扩IO驱动LED指示灯,但是发现这个片子抗干扰真的很差劲,旁边的EMC设备一开,595输出数据就 ...

DRV8860的确是不便宜,之前在V6群还讨论过这个问题。

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-3 22:49:34 | 显示全部楼层
eric2013 发表于 2018-7-3 00:03
没有NE片选的话,你忽略了最重要的一点,任何FMC操作都可以影响这个外设。

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-7-3 22:55:17 | 显示全部楼层
eric2013 发表于 2018-7-3 00:04
DRV8860的确是不便宜,之前在V6群还讨论过这个问题。

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-4 00:46:18 | 显示全部楼层
云琴箫龙 发表于 2018-7-3 22:55
他们的回复是595设计抗干扰本来就差,对外部电路设计要求比较高,基本上要加一堆防护,DRV8860在板子上几 ...

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

使用道具 举报

4

主题

37

回帖

49

积分

初级会员

积分
49
发表于 2018-7-7 21:35:00 | 显示全部楼层
设计的很巧妙啊 ,希望能分享更多的类似设计!!
回复

使用道具 举报

4

主题

52

回帖

64

积分

初级会员

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

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

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-7-8 10:08:18 | 显示全部楼层
cortex 发表于 2018-7-7 23:36
你是3.3直接驱动595还是有5V上拉,如果你74HC4595是5v供电,我也出现过这个问题,输出是絮乱的,后来我把 ...

貌似推挽也没问题,就是不知道那个效果更好些。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

52

回帖

64

积分

初级会员

积分
64
发表于 2018-7-8 19:52:23 | 显示全部楼层
推挽的话,这样只有3.3V,我开漏外加上拉有5V,上拉电阻稍微小点,效果可能更加好。外加了5V上拉,一定要关闭内部的上拉,不然两个电阻会分压,实际IO的高电平只有4V左右,有兴趣的可以试试
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-7-9 11:18:12 | 显示全部楼层
cortex 发表于 2018-7-8 19:52
推挽的话,这样只有3.3V,我开漏外加上拉有5V,上拉电阻稍微小点,效果可能更加好。外加了5V上拉,一定要关 ...

非常感谢
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

12

主题

36

回帖

72

积分

初级会员

积分
72
发表于 2018-7-29 21:45:19 | 显示全部楼层
这种扩展方式,是否只能用于输出?如果有输入口,能挂在这上面吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106709
QQ
 楼主| 发表于 2018-7-30 00:49:18 | 显示全部楼层
dandelion 发表于 2018-7-29 21:45
这种扩展方式,是否只能用于输出?如果有输入口,能挂在这上面吗?

对,不能做输入。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2018-10-19 09:16:26 | 显示全部楼层
本帖最后由 dy84082666 于 2018-10-19 09:20 编辑
eric2013 发表于 2018-7-30 00:49
对,不能做输入。

很有用的教程,说的很详细。果断收藏。

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

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

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2018-10-19 09:31:53 | 显示全部楼层
dy84082666 发表于 2018-10-19 09:16
很有用的教程,说的很详细。果断收藏。

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

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

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

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

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

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-10-22 18:46:20 | 显示全部楼层
dy84082666 发表于 2018-10-19 09:56
谢谢您的解答,其实我想问的是用地址数据总线扩展输入口的方法。

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

8255啊
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-12-8 17:38:22 | 显示全部楼层
最近想用FMC扩展IO口,再次翻看这个帖子的时候又产生了一点儿疑问
如果用FMC_NE2_B直接接四片574的片选,FMC_NWE接四片574的CP端,似乎也可以实现啊,而且还省了一个或门芯片。硬汉哥为何不采用这种方案呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 13:13 , Processed in 0.581387 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表