完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 一只耳朵怪 于 2018-6-5 16:29 编辑
各位好!在支持客户的过程中,一些客户在设计nor flash启动应用时,遇到一系列问题。现在AM335X上设计nor flash启动的相关要点总结如下,供大家参考。 1. 关于nor flash启动的信息 可以参考TRM的26.1.7.2 XIP Memory章节,在这里就不详述了。 2. 设计时注意点 由于AM335X的管脚有限,所以在应用中许多客户会考虑采用GPMC数据线/地址线复用的方式连接外部的nor flash。这样可以将GPMC_AD[15:0]即作为16bit数据线,又作为低16bit的地址线。 那在这种情况下,针对具体设计,需要注意哪些地方? 在上述应用中,GPMC_AD会从即作为16bit数据线,又作为低16bit的地址线;从TRM的Table 7-5. GPMC Pin Multiplexing Options表格中可以知道,GPMC_A[10:1]会作为nor flash的高位地址线。而GPMC_A[10:1]存在两种复用方式,即可以将AM335X的pinmux mode0的这一组pin复用为GPMC_A[10:1],也可以将另一组复用为GPMC_A[10:1]。
(1)采用pinmux mode0组的连接时,需注意 (a)latch需要采用上升沿锁存的,而不能使用电平锁存的。这是由于AM335x内的ROM CODE在nor flash启动时,有一组固定的GPMC时序。 (b)高位地址线需要作下拉处理。由于ROM CODE在nor flash启动时,只对GPMC_AD[15:0]进行了初始化,而未对GPMC_A[10:1]进行。如果需要ROM CODE在启动初期时能够正确看到nor flash的地址空间,需要对高位地址线作下拉处理。 (2) 采用pinmux mode1的连接时,需注意 由于此时GPMC_A[10:1]与LCD_DATA复用,而LCD_DATA又在启动初期作为SYSBOOT管脚使用,在其管脚上会根据启动序列的选择存在相应的上下拉。这就与(1)中要求的nor flash启动初期需要对GPMC_A[10:1]一直保持下拉存在冲突。所以在这种应用下,需要增加一个bus transceiver对两者进行隔离。见下图。 由于SYSBOOT的管脚状态只有在PORz的上升沿才会读取。而wARM reset的输入管脚nRESET_OUT会在PORz完成后持续一段时间低电平,可参考TRM的Figure 8-19. PORz。所以可以通过此信号来作为Bus transceiver的控制信号。当nRESET_OUT为低时,根据SN74AVC32T245的逻辑,连接在总线上的信号会是A到B,期间PORz信号的上升沿触发时段,可以读取SYSBOOT的管脚状态。当nRESET_OUT持续一段时间低电平后,其电平会变为高,此时Bus transceiver则会将A侧的GPMC_A[10:1]与B侧SYSBOOT的上下拉隔离开。 |
||
相关推荐
10个回答
|
||
软件方面:
在SDK-05.06.00.00及之后的版本的U-boot中已经添加了Nor flash启动的代码。在使用时,需要注意 nor flash为XIP memory,其启动时不需要将SPL拷贝到RAM中运行,而可以直接在nor flash进行。由于nor flash启动,ROM CODE只对低16位地址进行了初始化,所以启动时只能访问0x08000000起始的64K x 16bit的地址空间。在此初始化中,u-boot.bin会执行对nor flash高位地址的初始化,以便后续AM335X能访问nor flash的整个地址空间。 在u-boot/board/ti/am335x/board.c中的s_init函数中有对高地址线进行初始化的代码: #ifdef CONFIG_NOR_BOOT asm("stmfd sp!, [r2 - r4]"); asm("movw r4, #0x8A4"); asm("movw r3, #0x44E1"); asm("orr r4, r4, r3, lsl #16"); asm("mov r2, #9"); asm("mov r3, #8"); asm("gpmc_mux: str r2, [r4], #4"); asm("subs r3, r3, #1"); asm("bne gpmc_mux"); asm("ldmfd sp!, [r2 - r4]"); #endif 在选择上述表中的pinmux mode 1时,即nor flash的高位地址线连接的GPMC_A[10:1]是pinmux mode1组对应的管脚,则u-boot中不需要做修改。而如果连接的是表中的pinmux mode 0组对应的管脚,即需要修改代码如下: #ifdef CONFIG_NOR_BOOT asm("stmfd sp!, [r2 - r4]"); asm("movw r4, #0x844"); Start point Change from LCD_DATA1 to GPMC_A1 asm("movw r3, #0x44E1"); asm("orr r4, r4, r3, lsl #16"); asm("mov r2, #8"); Change #9 to #8, GPMC_A1 to GPMC_A11 as mode0 asm("mov r3, #11"); Change #8 to #11, because there are 11 lines. asm("gpmc_mux: str r2, [r4], #4"); asm("subs r3, r3, #1"); asm("bne gpmc_mux"); asm("ldmfd sp!, [r2 - r4]"); #endif 另外,对应上述两组不同的连接时,SYSBOOT对应的设置也不相同。如选择pinmux mode0组的连接,则需要配置SYSBOOT,选择XIP(mux1)或者XIP(mux1) w/WAIT0启动。而选择pinmux mode1时,则需要配置SYSBOOT,选择XIP(mux2)或者XIP(mux2) w/WAIT0启动。 |
|
|
|
事实上,我所在团队可能是国内比较早的使用Nor Flash启动方案的(2012.06)
我们用的数据地址非复用模式. 我们没有用地址锁存器. 所以实际的Boot地址空间只有4K,而且受高位地址线的SYSBOOT以及内部上拉的影响,理论上启动地址0x08000000变成了0x08741000. 我们的做法是将错就错,将第一级的Boot压缩在4K以内,并且烧写到0x08741000.如此,CPU启动后将会在0x08000000载取到Boot代码. 不知是否理解我的表述. |
|
|
|
用的是16bit的nor flash吗? boot的地址空间只有4K? |
|
|
|
Y tck,请教一下,高位地址线在不拉低的情况下启动地址为0x08741000是怎么算出来的? |
|
|
|
16-bit,数据地址非复用,所以实际可用地址线只有A0~A11,也就是只有4KBYTE |
|
|
|
首先,0x08000000,不用解释 0x00700000,这三根地址线内部上拉,你可以查一下数据手册 0x00041000,这两根线用于SYSBOOT config |
|
|
|
cmstock 发表于 2018-6-4 09:06 同样的这个问题会不会影响nand的启动呢,谁有这方面的经验 |
|
|
|
NAND的连接没有此类问题。 根据连接的是8bit还是16bit,选择GPMC_AD的8条线或者16条线连接即可。 另外,需要提醒的是,需要NAND启动,选择的NAND flash会有要求。可以知道,NAND的种类千差万别,所以在芯片内部的ROM CODE只能有限支持部分,有 (1)支持ONFI标准的NAND (2) DEVICE ID在所支持的表格内的NAND。表格可参看TRM的Table 26-14. Supported NAND Devices |
|
|
|
Hi Gary
关于上述方式有如下问题请教: 1. 一般D-Latch都为电平锁存的,上升沿锁存的比较少,能否推荐一下。 如果是ROM code导致,不知道现在是否有更新,能否用电平触发Latch。 2. 该方案为异步模式下工作,如果需要burst mode不是是否有限制。 谢谢 |
|
|
|
tracy87 发表于 2018-6-4 09:50 1. SN74ALVCH162601GR 或者SN74LVC16374 2. 关于NOR FLASH启动,支持哪些可以查看TRM的26.1.7.2 XIP Memory 只支持异步模式启动 |
|
|
|
只有小组成员才能发言,加入小组>>
574 浏览 1 评论
412 浏览 1 评论
609 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
877 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
697 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
166浏览 29评论
1110浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
307浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
267浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
118浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-26 14:11 , Processed in 0.893037 second(s), Total 63, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号