一、环境
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读取时序
最后,初始化寄存器
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,说明时序配置无误,可以进行后续的操作。