有幾個問題需要咨詢一下:
1?外部總線配置寄存器(R8_XBUS_CONFIG)的RB_XBUS_EN_32BIT為1,表示使用16位或32位的數(shù)據(jù)總線。哪么,使用16位數(shù)據(jù)總線時,D15~D0作為數(shù)據(jù)總線使用,D31~D16是否也會受到影響不能作為普通IO呢?
2? 以下是CH563EVT的例程HOST.C中的函數(shù),能否解釋一下其中的循環(huán)目的是什么,會受到什么效果;而且,我覺得代碼中的PRINT( "setup clk=1:\n" );及PRINT( "setup clk=2:\n" );之后的代碼沒有看出clk=1和clk=2的區(qū)別,能否解答一下?
void XbusTest( void )
{
? ? UINT8? ?mFstDat, mTstDat;
? ? UINT8? ?mHoldClk;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* hold clk */
? ? UINT32? ? i, j;
? ? PRINT( "Xbus Test\n" );
? ? R32_PA_DIR = (1<<21)|( 1<<20 )|0x7FFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 置地址、WR、RD信號輸出 */?
? ? mFstDat = 0x55;
? ? PRINT( "setup clk=1:\n" );
? ? for( mHoldClk = 0; mHoldClk <= RB_XBUS_HOLD; mHoldClk ++ ){
? ? ? ? R8_SAFE_ACCESS_SIG = 0x57;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* unlock step 1 */
? ? ? ? R8_SAFE_ACCESS_SIG = 0xA8;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* unlock step 2 */?
? ? ? ? R8_XBUS_CONFIG = RB_XBUS_ENABLE | RB_XBUS_ADDR_OE;? ? ? ? ? ? ? ? ? ? ? /* 外部總線使能 */?
? ? ? ? R8_XBUS_SETUP_HOLD = mHoldClk;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 1 setup clocks */?
? ? ? ? R8_SAFE_ACCESS_SIG = 0x00;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* lock, to prevent unexpected writing */
? ? ? ? j = 1024 * 32;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部32K RAM */?
? ? ? ? pXbusPt = ( PUINT8V )0x00C00000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部總線基址 */?
? ? ? ? mTstDat = mFstDat;
? ? ? ? PRINT( "? ? mHoldClk=0x%x, FstDat=0x%x\n", ( UINT16 )mHoldClk, ( UINT16 )mFstDat );
? ? ? ? PRINT( "? ? ? ? write: " );
? ? ? ? for( i = 0; i < j; i ++ ){
? ? ? ? ? ? if( i < 16 ) PRINT( "%x ",( UINT16 )mTstDat );? ? ? ? ? ? ? ? ? ? ? /* 顯示前16個數(shù)據(jù) */?
? ? ? ? ? ? *pXbusPt = mTstDat;
? ? ? ? ? ? pXbusPt ++;
? ? ? ? ? ? mTstDat ^= 0xFF;
? ? ? ? }
? ? ? ? PRINT( "\n" );
? ? ? ? PRINT( "? ? ? ? read:? " );
? ? ? ? pXbusPt = ( PUINT8V )0x00C00000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部總線基址 */?
? ? ? ? mTstDat = mFstDat;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 測試首數(shù)據(jù) */
? ? ? ? for( i = 0; i < j; i ++ ){
? ? ? ? ? ? if( i < 16 ) PRINT( "%x? ", ( UINT16 )*pXbusPt );
? ? ? ? ? ? if( *pXbusPt != mTstDat ){
? ? ? ? ? ? ? ? PRINT( "? ? ? ? err: i=0x%lX, mTstDat=%x\n", ( UINT32 )i, ( UINT16 )mTstDat );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? pXbusPt ++;
? ? ? ? ? ? mTstDat ^= 0xFF;
? ? ? ? }
? ? ? ? PRINT( "\n? ? ? ? over\n" );
? ? ? ? mFstDat ^= 0xFF;
? ? }
? ? PRINT( "setup clk=2:\n" );
? ? for( mHoldClk = 0; mHoldClk <= RB_XBUS_HOLD; mHoldClk ++ ){
? ? ? ? R8_SAFE_ACCESS_SIG = 0x57;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* unlock step 1 */?
? ? ? ? R8_SAFE_ACCESS_SIG = 0xA8;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* unlock step 2 */
? ? ? ? R8_XBUS_CONFIG = RB_XBUS_ENABLE | RB_XBUS_ADDR_OE;? ? ? ? ? ? ? ? ? ? ? /* 外部總線使能 */
? ? ? ? R8_XBUS_SETUP_HOLD = mHoldClk;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 1 setup clocks */?
? ? ? ? R8_SAFE_ACCESS_SIG = 0x00;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* lock, to prevent unexpected writing */
? ? ? ? j = 1024 * 32;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部32K RAM */
? ? ? ? pXbusPt = ( PUINT8V )0x00C00000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部總線基址 */?
? ? ? ? mTstDat = mFstDat;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 測試首數(shù)據(jù) */?
? ? ? ? PRINT( "? ? mHoldClk=0x%x, FstDat=0x%x\n", ( UINT16 )mHoldClk, ( UINT16 )mFstDat );
? ? ? ? PRINT( "? ? ? ? write: " );
? ? ? ? for( i = 0; i < j; i ++ ){
? ? ? ? ? ? if( i < 16 ) PRINT( "%x ",( UINT16 )mTstDat );? ? ? ? ? ? ? ? ? ? ? /* 顯示前16個數(shù)據(jù) */?
? ? ? ? ? ? *pXbusPt = mTstDat;
? ? ? ? ? ? pXbusPt ++;
? ? ? ? ? ? mTstDat ^= 0xFF;
? ? ? ? }
? ? ? ? PRINT( "\n" );
? ? ? ? PRINT( "? ? ? ? read:? " );
? ? ? ? pXbusPt = ( PUINT8V )0x00C00000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 外部總線基址 */?
? ? ? ? mTstDat = mFstDat;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 測試首數(shù)據(jù) */?
? ? ? ? for( i = 0; i < j; i ++ ){
? ? ? ? ? ? if( i < 16 ) PRINT( "%x? ", ( UINT16 )*pXbusPt );
? ? ? ? ? ? if( *pXbusPt != mTstDat ){
? ? ? ? ? ? ? ? PRINT( "? ? ? ? err: i=0x%lX, mTstDat=%x\n", ( UINT32 )i, ( UINT16 )mTstDat );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? pXbusPt ++;
? ? ? ? ? ? mTstDat ^= 0xFF;
? ? ? ? }
? ? ? ? PRINT( "\n? ? ? ? over\n" );
? ? ? ? mFstDat ^= 0xFF;
? ? }
}