http://www.armfans.net/archiver/tid-1041.html
REMAP配置寄存器(REMAPCONF)
9:4 REMAP_ADDR 复位值000000b,这个起什么作用?用户手册上说:
重映射地址,选择所重新映射目的片选的REMAP后的基地址高31~26位。选择哪一个片选进行重新映射见REMAP_CONF设置位。
不懂是什么意思
shixq 发表于 2009-4-29 16:06
一般来说,将该寄存器写0xB可以将SDRAM(0x30000000)映射到零地址
http://www.armfans.net/archiver/tid-3304.html
请教SEP4020的SDRAM工作过程
RT SDRAM有两个引脚BS0 BS1用来选择内部的BANK,我看到原理图上接的是地址总线A13 A14,我想问一下,这个是任意选的,还是有什么讲究?还有那个DQM0 DQM1 该怎么控制?另外,我看到在例程当中并没有对A13 A14操作来选择SDRAM内部BANK?
是不是SDRAM按如下配置好了后,我们可以像使用普通变量那样直接通过地址访问SDRAM比如*(*unsigned short)(addr) = a或者a=*(*unsigned short)(addr); 当然addr是2字节对齐的,
而SDRAM控制器自动通过硬件操作解析bank地址、行地址、列地址(包括一系列的延时、预充电、读写控制信号的产生等)然后存取/取出对应的数据?
如果我们自己想实现这些信号控制的话,需要FPGA等实现?不知道我说的对不对?望指点!
[attach]1075[/attach]
[[i] 本帖最后由 sunyouyuan 于 2011-1-26 15:19 编辑 [/i]]
shixq 发表于 2011-1-28 09:21
SDRAM的时序比较复杂,主要表现在以下几点:
1、地址的行列复用。和SRAM不一样,SDRAM的地址是分两个周期送出去的,即行地址和列地址,配合的信号有CAS和RAS地址锁存信号。
2、刷新机制。由于DRAM的存储原理是电容充放电,而集成电路中不可避免的会有漏电流存在,所以如果不对存储单元进行一定的“再生”,数据就会慢慢丢失掉。DRAM采用了刷新机制来保证数据的稳定性。
3、存储扩展技术。这不是DRAM的专利,一般RAM中都会存在位扩展和字扩展,也就是你在帖子中提到的BANK的问题。
因此,DRAM的存取时序是比较复杂的(建议LZ找一下SDRAM的白皮书,一言难尽...),除了一般的数据读写外,还有大量的辅助命令(如自刷新、PowerDown等),这也就意味着离开硬件的支持,软件先难控制SDRAM。由于设计定位的问题,大多数低阶MCU一般不支持SDRAM,只有较为高阶的处理器会提供DRAM接口。以SEP4020为例(其实4020也不能算是高阶处理器,只是设计定位要求支持SDRAM),设计了SDRAM控制器后,只要将对应的硬件信号连接起来,并软件配置EMI模块的SDRAM相关参数(行列地址位数、刷新相关参数等)后,就可以忽略硬件上的差异,和使用线性RAM一样随意地对有效的地址空间进行任意长度(字节、半字、字)的读写。
至于如何设计SDRAM控制器,或者控制器内部的实现机理,在使用SEP4020的时候可以不必关心,这是另外一个技术领域的话题了。
http://www.armfans.net/archiver/tid-3309.html
关于MINI4020 DM9161芯片PHY地址的疑问
RT 就是关于无OS下的MAC驱动,自动环路测试那个例程。就是PHY芯片DM9161的PHY地址为什么原理图上硬件设计的是00001,而软件中使用的是11111?write_reg(MAC_MII_ADDRESS, (U32)(address) | 0x1f); //12:8 PHY内部的寄存器地址 4;0 PHY地址
[attach]1078[/attach]
另外,我初始化的时候不去读PHY的内部寄存器,MAC和PHY一样工作正常,为什么?也就是不掉用下面这个函数
void mii_reg_read()
{
int i;
U32 phyreg[25];
for(i=0; i<25; i++)
{
write_reg(MAC_MII_ADDRESS, (i<<8) | 0x1f); //12:8 PHY内部的寄存器地址 4:0 PHY地址
write_reg(MAC_MII_CMD, 0x02); //读PHY寄存器
delay (10000);
phyreg[i] = read_reg(MAC_MII_RXDATA); //15:0 PHY寄存器读操作时读出的值
}
}
sunyouyuan 发表于 2011-1-28 17:13
知道原因了! 赠送的mini4020开发板上,那几个确定PHY地址的电阻没有焊接,应该是DM9161内部默认有上拉电阻,所以用0x1f这个地址去配置DM9161寄存器可以正常寻址!
我焊上了那几个电阻后(R324~R328),按照原理图上的地址00001来配置软件,结果正常!呵呵
http://www.armfans.net/viewthread.php?tid=2004
uboot引导ucos原来就这么简单
最近在SEP4020上移植了ucos+lwip+mingui还有文件系统、一些简单的驱动,想用uboot来引导方便以后的升级,看了一下资料原来uboot引导ucos就是这么简单(针对我的操作):
第一步:在mini4020开发板上用jlink烧录好uboot,重启开发板就可以看到终端里uboot起来的提示,以后的操作都可以在终端完成了;
第二步:首先设置IP地址,具体设置命令如下
SEP4020 =>set serverip 192.168.0.107
SEP4020 =>set ipaddr 192.168.0.108
SEP4020 =>set gatewayip 192.168.0.1
SEP4020 =>save
第三步:下载镜像到SDRAM,命令如下:
SEP4020 =>tftp 31000000 ucos.bin
第四步:拷贝镜像从SDRAM到NorFlash,命令如下:
SEP4020 =>cp.b 31000000 20020000 af000
第五步:设置环境变量,命令如下:
SEP4020 =>set bootcmd mw 11000020 0b\;cp.b 20020000 0 af000\;go 0
第六步:保存设置的环境变量,命令如下:
SEP4020 =>save
至此就可以重启开发板看到uboot成功引导ucos了。
之所以要加mw 11000020 0b主要因为刚开始完成操作后重启发现系统不断的重启,查了一下原因发现是uboot里面没有做零地址重映射(不知道是不是我用的版本有问题)而go 0就是不断的去执行uboot这段代码,于是也不想去改uboot了,在环境变量里面加一句话搬代码前先把零地址映射到sdram,先引导成功再说。
mw 11000020 0b
将0b写入11000020这个寄存器,就是将SDRAM重映射到零地址,注意看芯片手册。
http://www.armfans.net/archiver/tid-2979.html
请问MAC例程DEMO中的事宜
在开发板MAC例程包,有以下代码请问什么意思:int NetNIC_PhyInit ()
{
U16 reg_val;
int status;
reg_val = 0; /* Init reg_val & void it to prevent a compiler */
(void)reg_val; /* warning since its not referenced in MII Mode */
phy_hard_reset();
#ifndef RMII
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, DM9161AE_BMCR); /* Read the Basic Mode Control Register (twice) */
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, DM9161AE_BMCR); /* Read the Basic Mode Control Register (twice) */
reg_val &= ~BMCR_ISOLATE; /* Mask off 'Disconnect from MII bit (BMCR_ISOLATE) */
NetNIC_PhyRegWr(AT91C_PHY_ADDR, DM9161AE_BMCR, reg_val); /* Put the PHY into MII mode */
#endif
status = NetNIC_PhyAutoNeg(); /* Perform auto-negotiation */
return status; /* This is done because the AutoNegotiation Error */
} /* is not fatal and does not return upon discovery */
U16 NetNIC_PhyRegRd(U16 Phy_addr, U16 address)
{
U16 mii_rxdata;
U32 mii_status;
write_reg(MAC_MII_ADDRESS, (U32)(address) | Phy_addr);
write_reg(MAC_MII_CMD, 0x2);
delay(4000);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
mii_rxdata = (U16)read_reg(MAC_MII_RXDATA);
return(mii_rxdata);
}
caozuo_xitong 发表于 2010-8-4 09:34
void NetNIC_PhyRegWr(U16 Phy_addr, U16 address, U16 data)
{
U32 mii_status;
write_reg(MAC_MII_ADDRESS, (U32)(address) | Phy_addr);
write_reg(MAC_MII_TXDATA, (U32)data);
write_reg(MAC_MII_CMD, 0x4);
delay(8000);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
return;
}
shixq 发表于 2010-8-4 13:56
读写PHY的寄存器以对PHY进行初始化,楼主有什么疑问?
caozuo_xitong 发表于 2010-8-5 15:38
PHY地址从哪里来的?请教
Wyvern 发表于 2010-8-5 16:22
PHY的地址要根据你的硬件来获得,PHY芯片的26~29、35脚PHYAD[0:3]、PHYAD[4]; 仔细看一下DM9161的芯片手册。
caozuo_xitong 发表于 2010-8-6 10:56
在自适应网络中,你说的这几个脚都是闲空的,包括Mini4020开发板。。自适应时候,物理地址哪里来?
Wyvern 发表于 2010-8-7 19:33
自适应状态下,物理地址是通过读phy的寄存器获得的:
U16 Set_PhyAddr(U16 address)
{
U16 mii_rxdata;
U32 mii_status;
U32 i;
for(i=0;i<31;i++){
write_reg(MAC_MII_ADDRESS, (U32)(address<<8) | (Phy_addr+i));
write_reg(MAC_MII_CMD, 0x2);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
mii_rxdata = (U16)read_reg(MAC_MII_RXDATA);
if(mii_rxdata != 0xffff) break;
}
Phy_addr += i;
return(Phy_addr);
}
shaoh.12 发表于 2010-8-8 19:36
address和phy_addr是什么,初始值多少? 为什么读32次,
Wyvern 发表于 2010-8-9 09:01
address是0x00(DM9161AE的BMCR寄存器地址),phy_addr的起始地址为0,phy的地址是由PHY芯片的26~29、35脚PHYAD[0:3]、PHYAD[4]五根线决定的只有32种可能,另外请注意这里不是读32次,请仔细看代码一旦读到正确的phy地址的时候循环就结束了。
请问MAC例程DEMO中的事宜
在开发板MAC例程包,有以下代码请问什么意思:int NetNIC_PhyInit ()
{
U16 reg_val;
int status;
reg_val = 0; /* Init reg_val & void it to prevent a compiler */
(void)reg_val; /* warning since its not referenced in MII Mode */
phy_hard_reset();
#ifndef RMII
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, DM9161AE_BMCR); /* Read the Basic Mode Control Register (twice) */
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, DM9161AE_BMCR); /* Read the Basic Mode Control Register (twice) */
reg_val &= ~BMCR_ISOLATE; /* Mask off 'Disconnect from MII bit (BMCR_ISOLATE) */
NetNIC_PhyRegWr(AT91C_PHY_ADDR, DM9161AE_BMCR, reg_val); /* Put the PHY into MII mode */
#endif
status = NetNIC_PhyAutoNeg(); /* Perform auto-negotiation */
return status; /* This is done because the AutoNegotiation Error */
} /* is not fatal and does not return upon discovery */
U16 NetNIC_PhyRegRd(U16 Phy_addr, U16 address)
{
U16 mii_rxdata;
U32 mii_status;
write_reg(MAC_MII_ADDRESS, (U32)(address) | Phy_addr);
write_reg(MAC_MII_CMD, 0x2);
delay(4000);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
mii_rxdata = (U16)read_reg(MAC_MII_RXDATA);
return(mii_rxdata);
}
caozuo_xitong 发表于 2010-8-4 09:34
void NetNIC_PhyRegWr(U16 Phy_addr, U16 address, U16 data)
{
U32 mii_status;
write_reg(MAC_MII_ADDRESS, (U32)(address) | Phy_addr);
write_reg(MAC_MII_TXDATA, (U32)data);
write_reg(MAC_MII_CMD, 0x4);
delay(8000);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
return;
}
shixq 发表于 2010-8-4 13:56
读写PHY的寄存器以对PHY进行初始化,楼主有什么疑问?
caozuo_xitong 发表于 2010-8-5 15:38
PHY地址从哪里来的?请教
Wyvern 发表于 2010-8-5 16:22
PHY的地址要根据你的硬件来获得,PHY芯片的26~29、35脚PHYAD[0:3]、PHYAD[4]; 仔细看一下DM9161的芯片手册。
caozuo_xitong 发表于 2010-8-6 10:56
在自适应网络中,你说的这几个脚都是闲空的,包括Mini4020开发板。。自适应时候,物理地址哪里来?
Wyvern 发表于 2010-8-7 19:33
自适应状态下,物理地址是通过读phy的寄存器获得的:
U16 Set_PhyAddr(U16 address)
{
U16 mii_rxdata;
U32 mii_status;
U32 i;
for(i=0;i<31;i++){
write_reg(MAC_MII_ADDRESS, (U32)(address<<8) | (Phy_addr+i));
write_reg(MAC_MII_CMD, 0x2);
while(1) {
mii_status = read_reg(MAC_MII_STATUS);
if ((mii_status & 0x2) == 0) break;
}
mii_rxdata = (U16)read_reg(MAC_MII_RXDATA);
if(mii_rxdata != 0xffff) break;
}
Phy_addr += i;
return(Phy_addr);
}
shaoh.12 发表于 2010-8-8 19:36
address和phy_addr是什么,初始值多少? 为什么读32次,
Wyvern 发表于 2010-8-9 09:01
address是0x00(DM9161AE的BMCR寄存器地址),phy_addr的起始地址为0,phy的地址是由PHY芯片的26~29、35脚PHYAD[0:3]、PHYAD[4]五根线决定的只有32种可能,另外请注意这里不是读32次,请仔细看代码一旦读到正确的phy地址的时候循环就结束了。