zoukankan      html  css  js  c++  java
  • armfans文章搜集

    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地址的时候循环就结束了。

  • 相关阅读:
    Android Studio 字体和字号调整
    【IDEA】项目中引入Spring MVC
    【Double】double精度问题和int、long除不尽取舍问题
    【进制转换】原码反码和补码的理解以及进制转换
    【工具】SwitchHost的使用
    【工具】谷歌浏览器使用技巧
    【Git和GitHub】学习笔记
    【IE兼容性】代码中多语言样式+IE不兼容解决
    【Trello】使用指南
    【实操】进制转换:除基倒取余法
  • 原文地址:https://www.cnblogs.com/cute/p/2014007.html
Copyright © 2011-2022 走看看