完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有几个问题需要咨询一下:
1 外部总线配置寄存器(R8_XBUS_CONFIG)的RB_XBUS_EN_32BIT为1,表示使用16位或32位的数据总线。哪么,使用16位数据总线时,D15~D0作为数据总线使用,D31~D16是否也会受到影响不能作为普通IO呢? 2 以下是CH563EVT的例程HOST.C中的函数,能否解释一下其中的循环目的是什么,会受到什么效果;而且,我觉得代码中的PRINT( "setup clk=1:n" );及PRINT( "setup clk=2:n" );之后的代码没有看出clk=1和clk=2的区别,能否解答一下? void XbusTest( void ) { UINT8 mFstDat, mTstDat; UINT8 mHoldClk; /* hold clk */ UINT32 i, j; PRINT( "Xbus Testn" ); 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%xn", ( UINT16 )mHoldClk, ( UINT16 )mFstDat ); PRINT( " write: " ); for( i = 0; i < j; i ++ ){ if( i < 16 ) PRINT( "%x ",( UINT16 )mTstDat ); /* 显示前16个数据 */ *pXbusPt = mTstDat; pXbusPt ++; mTstDat ^= 0xFF; } PRINT( "n" ); PRINT( " read: " ); pXbusPt = ( PUINT8V )0x00C00000; /* 外部总线基址 */ mTstDat = mFstDat; /* 测试首数据 */ for( i = 0; i < j; i ++ ){ if( i < 16 ) PRINT( "%x ", ( UINT16 )*pXbusPt ); if( *pXbusPt != mTstDat ){ PRINT( " err: i=0x%lX, mTstDat=%xn", ( UINT32 )i, ( UINT16 )mTstDat ); break; } pXbusPt ++; mTstDat ^= 0xFF; } PRINT( "n overn" ); 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; /* 测试首数据 */ PRINT( " mHoldClk=0x%x, FstDat=0x%xn", ( UINT16 )mHoldClk, ( UINT16 )mFstDat ); PRINT( " write: " ); for( i = 0; i < j; i ++ ){ if( i < 16 ) PRINT( "%x ",( UINT16 )mTstDat ); /* 显示前16个数据 */ *pXbusPt = mTstDat; pXbusPt ++; mTstDat ^= 0xFF; } PRINT( "n" ); PRINT( " read: " ); pXbusPt = ( PUINT8V )0x00C00000; /* 外部总线基址 */ mTstDat = mFstDat; /* 测试首数据 */ for( i = 0; i < j; i ++ ){ if( i < 16 ) PRINT( "%x ", ( UINT16 )*pXbusPt ); if( *pXbusPt != mTstDat ){ PRINT( " err: i=0x%lX, mTstDat=%xn", ( UINT32 )i, ( UINT16 )mTstDat ); break; } pXbusPt ++; mTstDat ^= 0xFF; } PRINT( "n overn" ); mFstDat ^= 0xFF; } } |
|
相关推荐
3个回答
|
|
1,可以作为普通的GPIO使用
2这些代码,应该是测试的读写的 数据周期和保持时间,两个代码没有区别, 但是如果在调用前给 R8_XBUS_CYCLE 不同的初始值,表现就会不同 具体你可以参见官网最新的手册,CH563DS1( V1.1 ) 的P58/P59: |
|
|
|
单片机无法通过寄存器的设置识别要写入的是16位数据还是32位数据,如果在使用16位数据线的情况下,发出写16位数据指令的时候,这时低16位为有效数据,高16位为零,此刻D16~D31会输出0吧,如果是这样的情况,就可能干扰了作为输出IO的D16~D31,所以说当做IO使用会存在问题吧。
|
|
|
|
你好,我们实测使用低16位主动并口高16位可以作为普通IO使用。
|
|
|
|
只有小组成员才能发言,加入小组>>
267 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2746 浏览 2 评论
2256 浏览 1 评论
227浏览 4评论
主机NRF52832从机ch9141,ch9141断电后无法发送数据怎么解决?
410浏览 3评论
296浏览 3评论
286浏览 3评论
请问CH573怎么接到linux系统?能通过CH343串口模块接入吗?
347浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-23 03:24 , Processed in 0.993048 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号