Other Parts Discussed in Thread: AM3359
Dear , a AM3359 is on my custom board, its GPMC is connected to a FPGA.
According to TRM 7.1.4.2.5, no "synchronous write burst access" item listed here, does it mean that AM335X GPMC doesn't support "synchronous write burst access" ?
7.1.4.2.5 Supported Protocols
The GPMC supports the following interface protocols when communicating with external memory or
external devices:
• Asynchronous read/write access
• Asynchronous read page access (4-8-16 Word16)
• Synchronous read/write access
• Synchronous read burst access without wrap capability (4-8-16 Word16)
• Synchronous read burst access with wrap capability (4-8-16 Word16)
In fact, when I issued a 4 16bit-words GPMC burst write, the arm was hanged, and only a 16bit-word write was issued, as the following picture captured by the FPGA:
but the 4 16bit-wors is correct,as follow:
the GPMC configuration code is as follow, the chip select is cs1:
FpgaStatus_t GPMCFPGAInit(void)
{
unsigned int conf;
unsigned int baseAddr;
unsigned int cs;
volatile unsigned int timeOut;
// GPMCNANDTimingInfo_t *nandTimingInfo;
conf = 0;
timeOut =0xFFF;
baseAddr = SOC_GPMC_0_REGS;
/* GPMC Module configuration */
GPMCModuleSoftReset(baseAddr);
while((GPMCModuleResetStatusGet(baseAddr) != 1) && (timeOut != 0))
{
timeOut--;
}
if(timeOut == 0)
{
return (FPGA_STATUS_FAILED);
}
GPMCIdleModeSelect(baseAddr, GPMC_IDLEMODE_NOIDLE);
/* Disable all interrupts */
GPMCIntDisable(baseAddr, GPMC_FIFOEVENT_INT);
GPMCIntDisable(baseAddr, GPMC_TERMINALCOUNT_INT);
GPMCIntDisable(baseAddr, GPMC_WAIT0EDGEDETECTION_INT);
GPMCIntDisable(baseAddr, GPMC_WAIT1EDGEDETECTION_INT);
/* Timeout control disable */
GPMCTimeOutFeatureConfig(baseAddr, GPMC_TIMEOUTFEATURE_DISABLE);
GPMCLimitedAddrDevSupportConfig(baseAddr,GPMC_LIMITEDADDRESS_SUPPORT_ENABLE); //某些地址线不变化
//cs0
cs = GPMC_CHIP_SELECT_0;
GPMCCSConfig(baseAddr, cs, GPMC_CS_DISABLE); //先禁止该片选
GPMCFclkDividerSelect(baseAddr, cs,GPMC_FCLK_DIV_BY_1); //GPMC_CLK 分频比
GPMCClkActivationTimeConfig(baseAddr, cs,GPMC_CLKACTIVATIONTIME_ONECLK_AFTR); //第一个上升沿时间
GPMCTimeParaGranularitySelect(baseAddr, cs, GPMC_TIMEPARAGRANULARITY_X1); //时钟粒度选为1倍
GPMCDevTypeSelect(baseAddr, cs, GPMC_DEVICETYPE_NORLIKE); //采用NOR 协议
GPMCDevSizeSelect(baseAddr, cs, GPMC_DEVICESIZE_16BITS); //数据线位宽为16位
GPMCAddrDataMuxProtocolSelect(baseAddr, cs, GPMC_MUXADDDATA_NOMUX); //无地址/数据复用
GPMCWriteTypeSelect(baseAddr, cs, GPMC_WRITETYPE_SYNC); //同步写
GPMCReadTypeSelect(baseAddr, cs, GPMC_READTYPE_SYNC); //同步读
GPMCDevPageLenSet(baseAddr, cs, GPMC_DEV_PAGELENGTH_SIXTEEN); //异步是页长度,同步是突发长度
GPMCSyncWrapBurstConfig(baseAddr, cs,GPMC_WRAPBURST_DISABLE); //禁止地址绕回
GPMCAccessTypeSelect(baseAddr, cs, GPMC_MODE_WRITE, GPMC_ACCESSTYPE_SINGLE); //单写
GPMCAccessTypeSelect(baseAddr, cs, GPMC_MODE_READ, GPMC_ACCESSTYPE_SINGLE); //单读
GPMCBaseAddrSet(baseAddr, cs, 0); //基地址0,A29-A24:000000
GPMCMaskAddrSet(baseAddr, cs, GPMC_CS_SIZE_16MB); //片选 16MB空间
//单位 GPMC_FCLK
conf = GPMC_CS_TIMING_CONFIG(1, //CSWrOffTime
1, //CSRdOffTime
GPMC_CS_EXTRA_NODELAY, //无额外延时
0); //CSOnTime
GPMCCSTimingConfig(baseAddr, cs, conf);
conf = GPMC_ADV_TIMING_CONFIG(1, //ADVAADMuxWrOffTime
1, //ADVAADMuxRdOffTime
1, //ADVWrOffTime
1, //ADVRdOffTime
GPMC_ADV_EXTRA_NODELAY, //ADVExtDelayFlag
0, //ADVAADMuxOnTime
0); //ADVOnTime
GPMCADVTimingConfig(baseAddr, cs, conf);
conf = GPMC_WE_OE_TIMING_CONFIG(1, //WEOffTime
GPMC_WE_EXTRA_NODELAY, //EExtDelayFlag
0, //WEOnTime
1, //OEAADMuxOffTime
1, //OEOffTime
GPMC_OE_EXTRA_NODELAY, //OEExtDelayFlag
0, //OEAADMuxOnTime
0); //OEOnTime
GPMCWEAndOETimingConfig(baseAddr, cs, conf);
conf = GPMC_RDACCESS_CYCLETIME_TIMING_CONFIG(
3, //rdCycleTime
2,//wrCycleTime
2,//rdAccessTime
1);//pageBurstAccessTime
GPMCRdAccessAndCycleTimeTimingConfig(baseAddr, cs, conf);
conf = GPMC_CYCLE2CYCLE_BUSTURNAROUND_TIMING_CONFIG(
1,//cycle2CycleDelay
GPMC_CYCLE2CYCLESAMECSEN_NOC2CDELAY,//cycle2CycleDelaySameCSCfg
GPMC_CYCLE2CYCLEDIFFCSEN_C2CDELAY,//cycle2CycleDelayDiffCSCfg
1);//busTAtime
GPMCycle2CycleAndTurnArndTimeTimingConfig(baseAddr, cs, conf);
GPMCWrAccessAndWrDataOnADMUXBusTimingConfig(baseAddr, cs,
1, //wrAccessTime
0); //wrDataOnADMux
GPMCCSConfig(baseAddr, cs, GPMC_CS_ENABLE);
//cs1
cs = GPMC_CHIP_SELECT_1;
GPMCCSConfig(baseAddr, cs, GPMC_CS_DISABLE); //先禁止该片选
GPMCFclkDividerSelect(baseAddr, cs,GPMC_FCLK_DIV_BY_1); //GPMC_CLK 分频比
GPMCClkActivationTimeConfig(baseAddr, cs,GPMC_CLKACTIVATIONTIME_ONECLK_AFTR); //第一个上升沿时间
GPMCTimeParaGranularitySelect(baseAddr, cs, GPMC_TIMEPARAGRANULARITY_X1); //时钟粒度选为1倍
GPMCDevTypeSelect(baseAddr, cs, GPMC_DEVICETYPE_NORLIKE); //采用NOR 协议
GPMCDevSizeSelect(baseAddr, cs, GPMC_DEVICESIZE_16BITS); //数据线位宽为16位
GPMCAddrDataMuxProtocolSelect(baseAddr, cs, GPMC_MUXADDDATA_NOMUX); //无地址/数据复用
GPMCWriteTypeSelect(baseAddr, cs, GPMC_WRITETYPE_SYNC); //同步写
GPMCReadTypeSelect(baseAddr, cs, GPMC_READTYPE_SYNC); //同步读
GPMCDevPageLenSet(baseAddr, cs, GPMC_DEV_PAGELENGTH_FOUR); //异步是页长度,同步是突发长度
GPMCSyncWrapBurstConfig(baseAddr, cs,GPMC_WRAPBURST_DISABLE); //禁止地址绕回
GPMCAccessTypeSelect(baseAddr, cs, GPMC_MODE_WRITE, GPMC_ACCESSTYPE_SINGLE); //单写
GPMCAccessTypeSelect(baseAddr, cs, GPMC_MODE_READ, GPMC_ACCESSTYPE_MULTIPLE); //多读
GPMCBaseAddrSet(baseAddr, cs, 1); //基地址1,A29-A24:000001
GPMCMaskAddrSet(baseAddr, cs, GPMC_CS_SIZE_16MB); //片选 16MB空间
//单位 GPMC_FCLK
conf = GPMC_CS_TIMING_CONFIG(1, //CSWrOffTime
3, //CSRdOffTime
GPMC_CS_EXTRA_NODELAY, //无额外延时
0); //CSOnTime
GPMCCSTimingConfig(baseAddr, cs, conf);
conf = GPMC_ADV_TIMING_CONFIG(0, //ADVAADMuxWrOffTime
0, //ADVAADMuxRdOffTime
0, //ADVWrOffTime
0, //ADVRdOffTime
GPMC_ADV_EXTRA_NODELAY, //ADVExtDelayFlag
0, //ADVAADMuxOnTime
0); //ADVOnTime
GPMCADVTimingConfig(baseAddr, cs, conf);
conf = GPMC_WE_OE_TIMING_CONFIG(1, //WEOffTime
GPMC_WE_EXTRA_NODELAY, //EExtDelayFlag
0, //WEOnTime
2, //OEAADMuxOffTime
2, //OEOffTime
GPMC_OE_EXTRA_NODELAY, //OEExtDelayFlag
1, //OEAADMuxOnTime
1); //OEOnTime
GPMCWEAndOETimingConfig(baseAddr, cs, conf);
conf = GPMC_RDACCESS_CYCLETIME_TIMING_CONFIG(
3, //rdCycleTime
2, //wrCycleTime
2, //rdAccessTime
1); //pageBurstAccessTime,Delay between successive words in a multiple access
GPMCRdAccessAndCycleTimeTimingConfig(baseAddr, cs, conf);
conf = GPMC_CYCLE2CYCLE_BUSTURNAROUND_TIMING_CONFIG(
1,//cycle2CycleDelay
GPMC_CYCLE2CYCLESAMECSEN_NOC2CDELAY,//cycle2CycleDelaySameCSCfg
GPMC_CYCLE2CYCLEDIFFCSEN_C2CDELAY,//cycle2CycleDelayDiffCSCfg
1);//busTAtime,turn around
GPMCycle2CycleAndTurnArndTimeTimingConfig(baseAddr, cs, conf);
GPMCWrAccessAndWrDataOnADMUXBusTimingConfig(baseAddr, cs,
1, //wrAccessTime
0); //wrDataOnADMux
GPMCCSConfig(baseAddr, cs, GPMC_CS_ENABLE);
return(FPGA_STATUS_PASSED);
}

