记录AM335x 与 DM9000C GPMC接口调试

一、环境

    AM3358 DM9000C startware2.0 裸机调试

二、寄存器配置

    AM335x与DM9000C的GPMC接口主要是GPMC_CONFIG1-7寄存器的调试.首先需要考虑的是地址段的划分。

    GMPC外接存储器给定的地址范围为0x0000 0000 ~ 0x1FFF FFFF,不要超出这个范围。另外也不要出现地址冲突,否则都会产生异常错误。

    寄存器CONFIG7负责地址段分配,这里我们使用HWREG(GPMC_BASE + GPMC_CONFIG7(1)) = 0x00000F54;意思是基地址0x1400 0000 size: 0100 0000,细节可以查看手册。CONFIG7(1)中(1)的意思是使用片选1.当操作设定的地址范围内数据时,片选1会生效。

   其他寄存器配置重要涉及到时序控制,配置如下:

  

//-----  时钟为100Mhz.
#define CS_DEASSERT_WR      0x0F  
#define CS_DEASSERT_RD      0x0F


#define CS_ON_TIME          0x00


//-----  config4
#define OE_ASSERT           0x02
#define OE_DEASSERT         0x0C


#define WE_ASSERT           0x06
#define WE_DEASSERT         0x0C


//-----  config5
#define CFG_5_RD_CYCLE_TIM      0x0F
#define CFG_5_WR_CYCLE_TIM      0x0F


#define CFG_5_RD_ACCESS_TIM    0x0A


//-----  config6
#define CFG_6_WR_ACCESS_TIM     0x06
#define CYC2CYC_DELAY           0x4
AM335x读取时序

记录AM335x 与 DM9000C GPMC接口调试_第1张图片

最后,初始化寄存器

HWREG(GPMC_BASE + GPMC_CONFIG1(1)) = (0x0 |
    (GPMC_CONFIG1_1_DEVICESIZE_SIXTEENBITS <<
    GPMC_CONFIG1_1_DEVICESIZE_SHIFT ) |
    (GPMC_CONFIG1_1_ATTACHEDDEVICEPAGELENGTH_SIXTEEN << GPMC_CONFIG1_1_ATTACHEDDEVICEPAGELENGTH_SHIFT )
    //(GPMC_CONFIG1_1_TIMEPARAGRANULARITY_X2 << GPMC_CONFIG1_1_TIMEPARAGRANULARITY_SHIFT)

    );

    //-----  ontime
    //-----  de-assert-rd
    //-----  de-assert-wr
    HWREG(GPMC_BASE + GPMC_CONFIG2(1)) = (0x0 |
    (CS_ON_TIME ) |
    (CS_DEASSERT_RD << GPMC_CONFIG2_1_CSRDOFFTIME_SHIFT) |
    (CS_DEASSERT_WR << GPMC_CONFIG2_1_CSWROFFTIME_SHIFT));
    
    //-----  OE-ASSERT
    //-----  OE-DE-ASSERT
    //-----  WE-ASSERT
    //-----  WE-DE-ASSERT
    HWREG(GPMC_BASE + GPMC_CONFIG4(1)) = (0x0 |
    (OE_ASSERT << GPMC_CONFIG4_1_OEONTIME_SHIFT) |
    (OE_DEASSERT << GPMC_CONFIG4_1_OEOFFTIME_SHIFT) |
    (WE_ASSERT << GPMC_CONFIG4_1_WEONTIME_SHIFT)|
    (WE_DEASSERT << GPMC_CONFIG4_1_WEOFFTIME_SHIFT));

    //-----  RD-CYCLE
    //-----  WR-CYCLE
    //-----  RD-ACCESS
    HWREG(GPMC_BASE + GPMC_CONFIG5(1)) = (0x0 |
    (CFG_5_RD_CYCLE_TIM << GPMC_CONFIG5_1_RDCYCLETIME_SHIFT)|
    (CFG_5_WR_CYCLE_TIM << GPMC_CONFIG5_1_WRCYCLETIME_SHIFT)|
    (CFG_5_RD_ACCESS_TIM << GPMC_CONFIG5_1_RDACCESSTIME_SHIFT)
    );

    //-----  CYCLE2CYCLESAMECSEN
    //-----  CYC2CYC_DELAY
    //-----  WR_DATA_ON_ADMUX
    //-----  WR_ACCESS_TIM
    HWREG(GPMC_BASE + GPMC_CONFIG6(1)) = (0x0 |
    (GPMC_CONFIG6_1_CYCLE2CYCLESAMECSEN_C2CDELAY << GPMC_CONFIG6_1_CYCLE2CYCLESAMECSEN_SHIFT) |
    (CYC2CYC_DELAY << GPMC_CONFIG6_1_CYCLE2CYCLEDELAY_SHIFT) |
    (WR_DATA_ON_ADMUX << GPMC_CONFIG6_1_WRDATAONADMUXBUS_SHIFT)|
    (CFG_6_WR_ACCESS_TIM << GPMC_CONFIG6_1_WRACCESSTIME_SHIFT));

    //-----  BASE ADDR
    //-----  CS VALID
    //-----  BASEADDRESS
    //-----  NORFLASH 基地址:0x1000 0000 size: 0400 0000
    //-----  DM9000   基地址:0x1400 0000 size: 0100 0000
    //HWREG(GPMC_BASE + GPMC_CONFIG7(1)) = 0x00000C50;*/
    HWREG(GPMC_BASE + GPMC_CONFIG7(1)) = 0x00000F54;

三、测试与数据访问

    我们硬件部分将CMD引脚接到了地址脚的A2,因此,访问数据时我们采用地址 0x1400 0004,访问索引时采用地址0x1400 0000.

    我们写下读取DM9000C的测试函数

    

#define DM9000_REG_ADDR             (0x14000000)
#define DM9000_DAT_ADDR             (0x14000004)

//=====================================================================
//======                                                         ======
//======        原型: uint16 DM9000CIEP_ReadReg(uint16 reg)      ======
//======                                                         ======
//======        功能:寄存器读取                                   ======
//======                                                         ======
//=====================================================================
uint16 DM9000CIEP_ReadReg(uint16 reg)
{
    *((vu16*)DM9000_REG_ADDR) = reg;

    return *((vu16*)DM9000_DAT_ADDR);
}

//=====================================================================
//======                                                         ======
//======        原型: uint32 DM9000ID_Read(void)                ======
//======                                                         ======
//======        功能:DM9000 ID读取                               ======
//======                                                         ======
//=====================================================================
uint32 DM9000ID_Read(void)
{
    uint32 id_val;
    id_val = DM9000CIEP_ReadReg(DM_REG_VID0);
    id_val |= DM9000CIEP_ReadReg(DM_REG_VID1) << 8;
    id_val |= DM9000CIEP_ReadReg(DM_REG_PID0) << 16;
    id_val |= DM9000CIEP_ReadReg(DM_REG_PID1) << 24;

    return id_val;
}

如果可以读取到0x90 00 0A 46的ID,说明时序配置无误,可以进行后续的操作。

你可能感兴趣的:(嵌入式驱动)