?? ch37d51.c
字號:
}
}
return( FALSE );
}
BOOL CH375DBG_ReadSFR( ULONG addr, PUCHAR data ) { // 從SFR一個單元讀取數(shù)據(jù)
// 輸入?yún)?shù): addr 指定SFR的地址
// data 指向一個字節(jié)變量單元,用于存放讀出的數(shù)據(jù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_SFR;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = addr;
down.mLength = 1;
len = mOFFSET( USB_DOWN_PKT, mBuffer );
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot && up.mLength >= 1 ) { // 操作成功,并且返回數(shù)據(jù)
*data = up.mBuffer[0]; // 返回數(shù)據(jù)
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_WriteSFR( ULONG addr, UCHAR data ) { // 向SFR一個單元寫入數(shù)據(jù)
// 輸入?yún)?shù): addr 指定SFR的地址
// data 指定準備寫入的數(shù)據(jù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_SFR | USB_CMD_MEM_DIR_WR;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = addr;
down.mLength = 1;
down.mBuffer[0] = data;
len = mOFFSET( USB_DOWN_PKT, mBuffer ) + down.mLength;
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot ) { // 操作成功
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_ReadIRAM( ULONG StartAddr, PUCHAR buffer, UCHAR count ) { // 從內(nèi)部RAM讀取數(shù)據(jù)塊
// 輸入?yún)?shù): StartAddr 指定內(nèi)部RAM的起始地址
// buffer 指向一個足夠大的數(shù)據(jù)緩沖區(qū),用于存放讀出的數(shù)據(jù)塊
// count 指定讀取的字節(jié)數(shù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
if ( count > MAX_DATA_SIZE ) return( FALSE ); // 限制單次處理的數(shù)據(jù)長度,可以與單片機程序的MAX_DATA_SIZE一起同步修改為更大或更小的值
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_IRAM;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = StartAddr;
down.mLength = count;
len = mOFFSET( USB_DOWN_PKT, mBuffer );
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot && up.mLength >= count ) { // 操作成功,并且返回數(shù)據(jù)
for ( len = 0; len < (ULONG)count; len ++ ) buffer[ len ] = up.mBuffer[ len ]; // 返回數(shù)據(jù)
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_WriteIRAM( ULONG StartAddr, PUCHAR buffer, UCHAR count ) { // 向內(nèi)部RAM寫入數(shù)據(jù)塊
// 輸入?yún)?shù): StartAddr 指定內(nèi)部RAM的起始地址
// buffer 指向一個數(shù)據(jù)緩沖區(qū),存放準備寫入的數(shù)據(jù)塊
// count 指定寫入的字節(jié)數(shù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
if ( count > MAX_DATA_SIZE ) return( FALSE ); // 限制單次處理的數(shù)據(jù)長度,可以與單片機程序的MAX_DATA_SIZE一起同步修改為更大或更小的值
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_IRAM | USB_CMD_MEM_DIR_WR;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = StartAddr;
down.mLength = count;
for ( len = 0; len < (ULONG)count; len ++ ) down.mBuffer[ len ] = buffer[ len ];
len = mOFFSET( USB_DOWN_PKT, mBuffer ) + down.mLength;
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot ) { // 操作成功
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_ReadXRAM( ULONG StartAddr, PUCHAR buffer, UCHAR count ) { // 從外部RAM讀取數(shù)據(jù)塊
// 輸入?yún)?shù): StartAddr 指定外部RAM的起始地址
// buffer 指向一個足夠大的數(shù)據(jù)緩沖區(qū),用于存放讀出的數(shù)據(jù)塊
// count 指定讀取的字節(jié)數(shù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
if ( count > MAX_DATA_SIZE ) return( FALSE ); // 限制單次處理的數(shù)據(jù)長度,可以與單片機程序的MAX_DATA_SIZE一起同步修改為更大或更小的值
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_XRAM;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = StartAddr;
down.mLength = count;
len = mOFFSET( USB_DOWN_PKT, mBuffer );
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot && up.mLength >= count ) { // 操作成功,并且返回數(shù)據(jù)
for ( len = 0; len < (ULONG)count; len ++ ) buffer[ len ] = up.mBuffer[ len ]; // 返回數(shù)據(jù)
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_WriteXRAM( ULONG StartAddr, PUCHAR buffer, UCHAR count ) { // 向外部RAM寫入數(shù)據(jù)塊
// 輸入?yún)?shù): StartAddr 指定外部RAM的起始地址
// buffer 指向一個數(shù)據(jù)緩沖區(qū),存放準備寫入的數(shù)據(jù)塊
// count 指定寫入的字節(jié)數(shù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
if ( count > MAX_DATA_SIZE ) return( FALSE ); // 限制單次處理的數(shù)據(jù)長度,可以與單片機程序的MAX_DATA_SIZE一起同步修改為更大或更小的值
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_XRAM | USB_CMD_MEM_DIR_WR;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = StartAddr;
down.mLength = count;
for ( len = 0; len < (ULONG)count; len ++ ) down.mBuffer[ len ] = buffer[ len ];
len = mOFFSET( USB_DOWN_PKT, mBuffer ) + down.mLength;
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot ) { // 操作成功
return( TRUE );
}
}
}
return( FALSE );
}
BOOL CH375DBG_ReadROM( ULONG StartAddr, PUCHAR buffer, UCHAR count ) { // 從程序ROM讀取數(shù)據(jù)塊
// 輸入?yún)?shù): StartAddr 指定程序ROM的起始地址
// buffer 指向一個足夠大的數(shù)據(jù)緩沖區(qū),用于存放讀出的數(shù)據(jù)塊
// count 指定讀取的字節(jié)數(shù)
USB_DOWN_PKT down;
USB_UP_PKT up;
ULONG len;
if ( count > MAX_DATA_SIZE ) return( FALSE ); // 限制單次處理的數(shù)據(jù)長度,可以與單片機程序的MAX_DATA_SIZE一起同步修改為更大或更小的值
down.mCommand = USB_CMD_MEM_ACCESS | USB_CMD_MEM_W_BYTE | USB_CMD_MEM_S_ROM;
down.mCommandNot = ~ down.mCommand;
down.u.mDword = StartAddr;
down.mLength = count;
len = mOFFSET( USB_DOWN_PKT, mBuffer );
if ( CH375WriteData( CH375DBG_Index, &down, &len ) ) { // 寫出命令塊
len = sizeof( USB_UP_PKT );
if ( CH375ReadData( CH375DBG_Index, &up, &len ) ) { // 讀取應答塊
if ( up.mStatus == ERR_SUCCESS && up.mCommandNot == down.mCommandNot && up.mLength >= count ) { // 操作成功,并且返回數(shù)據(jù)
for ( len = 0; len < (ULONG)count; len ++ ) buffer[ len ] = up.mBuffer[ len ]; // 返回數(shù)據(jù)
return( TRUE );
}
}
}
return( FALSE );
}
UCHAR CH375DBG_GetPortP1( VOID ) { // 獲取MCS51單片機端口P1的狀態(tài)
// 輸出結(jié)果: 返回當前端口狀態(tài)值
UCHAR d;
CH375DBG_ReadSFR( 0x90, &d ); // 從SFR一個單元讀取數(shù)據(jù)
return( d );
}
VOID CH375DBG_PutPortP1( UCHAR d ) { // 設置MCS51單片機端口P1的狀態(tài)
// 輸入?yún)?shù): d 指定新的端口狀態(tài)值
CH375DBG_WriteSFR( 0x90, d ); // 向SFR一個單元寫入數(shù)據(jù)
}
#ifdef __cplusplus
}
#endif
#endif // _CH375_DBG_H
/* **************************************************************************************************** */
// 主程序示例
#if 0
main( void ) {
UCHAR v, i, p1;
UCHAR buf[32];
if ( CH375DBG_GetFirmwareInfo( &v ) ) // 獲取調(diào)試固件程序的版本,并取消未完成的上傳數(shù)據(jù)塊
printf( "This Firmware Version is %02X \n", v );
else return(1); // 無法打開CH372/CH375,可能未工作或者單片機未執(zhí)行調(diào)試程序
if ( CH375DBG_ReadIRAM( 0x20, buf, 10 ) ) { // 從內(nèi)部RAM讀取數(shù)據(jù)塊,從20H地址開始的10個字節(jié)
printf( "Read Internal RAM address 20H-29H: " );
for ( i=0; i<10; i++ ) printf( "%02X ", buf[i] );
printf( "\n" );
}
else printf( "Read Internal RAM ERROR !\n" );
p1 = CH375DBG_GetPortP1( ); // 獲取MCS51單片機端口P1的狀態(tài)
p1 &= ~ 0x10; // P1.4=0
CH375DBG_PutPortP1( p1 ); // 設置MCS51單片機端口P1的狀態(tài)
if ( CH375DBG_WriteSFR( 0x99, '$' ) ) { // 向SFR一個單元寫入數(shù)據(jù),寫SBUF,如果事先單片機已經(jīng)設置串口發(fā)送使能,則能夠?qū)⒆址?從串口發(fā)出
printf( "Write char $ to SFR-SBUF\n" );
}
else printf( "Write SFR ERROR !\n" );
CH375DBG_CloseExit( ); //關閉CH372/CH375設備
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -