今天把DEVICE例程移植到MC9S12DG128中,沒有產(chǎn)生USB中斷,來請教各位大俠,賦上電路圖和程序UploadImages/2009811454164.rar
先得確保單片機與374能正常通訊,對40H-7FH寄存器進行讀寫測試,比對讀取的數(shù)據(jù)與寫入的數(shù)據(jù)是否一致,來驗證硬件連接與接口程序是否正確
這么個讀寫法,用移植程序中的讀寫函數(shù)嗎
是不是先不和電腦連接,先測試ECU與374的通訊(用DEVICE中的讀寫函數(shù))
如果不是從電腦取電的話,可以先不連接電腦 直接調(diào)用讀寫寄存器的函數(shù):Write374Byte、Read374Byte,注意是連續(xù)寫,再連續(xù)讀
可以讀寫寄存器啦,但是我連接到電腦上時,系統(tǒng)提示無法識別硬件,安裝了CH372驅(qū)動也不行
燒寫完程序后USB第一次插上電腦,電腦顯示不識別,等著等著就把ECU電源電壓給拉低了,再次插上時S什么也不顯示啦
經(jīng)過一天的奮戰(zhàn),終于可以識別設(shè)備啦,在這里謝謝貴公司的工作人員
現(xiàn)在還有個新問題,查詢中斷引腳電平方式可以識別設(shè)備,而中斷方式就無法實現(xiàn)
中斷配置是否正確呢,能否正常進入中斷 使用電平中斷方式試試
我用的是mc9s12dg128的外部中斷IRQ,我把設(shè)置代碼貼出來給您看看
/* CH374芯片 應(yīng)用層 V1.0 */ /* USB設(shè)備,模擬CH372或CH375的TEST程序與計算機通訊 */
#include "HAL.H" // 以MCS51為例,其它單片機需修改HAL*硬件抽象層的幾個文件 #include "HAL_BASE.C" // 基本子程序及中斷查詢子程序
/* 硬件接口層,以下連接方式任選一種 */ //#include "..\PARA_HW.C" /* 硬件標(biāo)準(zhǔn)8位并口 */ #include "PARA_SW.C" /* 軟件I/O模擬8位并口 */ //#include "..\SPI_HW.C" /* 硬件標(biāo)準(zhǔn)4線SPI串口 */ //#include "..\SPI_SW.C" /* 軟件I/O模擬4線SPI串口 */ //#include "..\SPI3_SW.C" /* 軟件I/O模擬3線SPI串口,SDO和SDI合用一個引腳 */
// 設(shè)備描述符 const UINT8C MyDevDescr[] = { 0x12, 0x01, 0x10, 0x01, 0xFF, 0x80, 0x37, 0x08, 0x48, 0x43, 0x37, 0x55, // 廠商ID和產(chǎn)品ID 0x00, 0x01, 0x01, 0x02, 0x00, 0x01 }; // 配置描述符 const UINT8C MyCfgDescr[] = { 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x37, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x03, 0x08, 0x00, 0x00 }; // 語言描述符 const UINT8C MyLangDescr[] = { 0x04, 0x03, 0x09, 0x04 }; // 廠家信息 const UINT8C MyManuInfo[] = { 0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0 }; // 產(chǎn)品信息 const UINT8C MyProdInfo[] = { 0x0C, 0x03, 'C', 0, 'H', 0, '3', 0, '7', 0, '4', 0 };
UINT8 UsbConfig = 0; // USB配置標(biāo)志
void USB_DeviceInterrupt( void ); // USB設(shè)備中斷服務(wù)程序
void Init374Device( void ); // 初始化USB設(shè)備
void USB_DeviceInterrupt( void ) // USB設(shè)備中斷服務(wù)程序 { UINT8 s, l; static UINT8 SetupReq, SetupLen; static PUINT8 pDescr; s = Read374Byte( REG_INTER_FLAG ); // 獲取中斷狀態(tài) if ( s & BIT_IF_BUS_RESET ) { // USB總線復(fù)位 Write374Byte( REG_USB_ADDR, 0x00 ); // 清USB設(shè)備地址 Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( 0 ) ); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_BUS_RESET ); // 清中斷標(biāo)志 } else if ( s & BIT_IF_TRANSFER ) { // USB傳輸完成 s = Read374Byte( REG_USB_STATUS ); switch( s & BIT_STAT_PID_ENDP ) { // USB設(shè)備中斷狀態(tài) case USB_INT_EP2_OUT: { // 批量端點下傳成功 UINT8 buf[64]; if ( s & BIT_STAT_TOG_MATCH ) { // 僅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 數(shù)據(jù)取反由計算機驗證 Write374Block( RAM_ENDP2_TRAN, l, buf ); // 演示回傳 Write374Byte( REG_USB_LENGTH, l ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); // Write374Index( REG_USB_ENDP2 ); // 對于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時間,提高效率 // Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); } break; } case USB_INT_EP2_IN: { // 批量端點上傳成功,未處理 Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_TRAN_TOG ); // Write374Index( REG_USB_ENDP2 ); // 對于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時間,提高效率 // Write374Data( M_SET_EP2_TRAN_NAK( Read374Data0( ) ) ^ BIT_EP2_TRAN_TOG ); break; } case USB_INT_EP1_IN: { // 中斷端點上傳成功,未處理 Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); break; } case USB_INT_EP0_SETUP: { // 控制傳輸 USB_SETUP_REQ SetupReqBuf; l = Read374Byte( REG_USB_LENGTH ); if ( l == sizeof( USB_SETUP_REQ ) ) { Read374Block( RAM_ENDP0_RECV, l, (PUINT8)&SetupReqBuf ); SetupLen = SetupReqBuf.wLengthL; if ( SetupReqBuf.wLengthH || SetupLen > 0x7F ) SetupLen = 0x7F; // 限制總長度 l = 0; // 默認(rèn)為成功并且上傳0長度 if ( ( SetupReqBuf.bType & DEF_USB_REQ_TYPE ) != DEF_USB_REQ_STAND ) { /* 只支持標(biāo)準(zhǔn)請求 */ l = 0xFF; // 操作失敗 } else { // 標(biāo)準(zhǔn)請求 SetupReq = SetupReqBuf.bReq; // 請求碼 switch( SetupReq ) { case DEF_USB_GET_DESCR: switch( SetupReqBuf.wValueH ) { case 1: pDescr = (PUINT8)( &MyDevDescr[0] ); l = sizeof( MyDevDescr ); break; case 2: pDescr = (PUINT8)( &MyCfgDescr[0] ); l = sizeof( MyCfgDescr ); break; case 3: switch( SetupReqBuf.wValueL ) { case 1: pDescr = (PUINT8)( &MyManuInfo[0] ); l = sizeof( MyManuInfo ); break; case 2: pDescr = (PUINT8)( &MyProdInfo[0] ); l = sizeof( MyProdInfo ); break; case 0: pDescr = (PUINT8)( &MyLangDescr[0] ); l = sizeof( MyLangDescr ); break; default: l = 0xFF; // 操作失敗 break; } break; default: l = 0xFF; // 操作失敗 break; } if ( SetupLen > l ) SetupLen = l; // 限制總長度 l = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE : SetupLen; // 本次傳輸長度 Write374Block( RAM_ENDP0_TRAN, l, pDescr ); /* 加載上傳數(shù)據(jù) */ SetupLen -= l; pDescr += l; break; case DEF_USB_SET_ADDRESS: SetupLen = SetupReqBuf.wValueL; // 暫存USB設(shè)備地址 break; case DEF_USB_GET_CONFIG: Write374Byte( RAM_ENDP0_TRAN, UsbConfig ); if ( SetupLen >= 1 ) l = 1; break; case DEF_USB_SET_CONFIG: UsbConfig = SetupReqBuf.wValueL; break; case DEF_USB_CLR_FEATURE: if ( ( SetupReqBuf.bType & 0x1F ) == 0x02 ) { // 不是端點不支持 switch( SetupReqBuf.wIndexL ) { case 0x82: Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ); break; case 0x02: Write374Byte( REG_USB_ENDP2, M_SET_EP2_RECV_ACK( Read374Byte( REG_USB_ENDP2 ) ) ); break; case 0x81: Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ); break; case 0x01: Write374Byte( REG_USB_ENDP1, M_SET_EP1_RECV_ACK( Read374Byte( REG_USB_ENDP1 ) ) ); break; default: l = 0xFF; // 操作失敗 break; } } else l = 0xFF; // 操作失敗 break; case DEF_USB_GET_INTERF: Write374Byte( RAM_ENDP0_TRAN, 0 ); if ( SetupLen >= 1 ) l = 1; break; case DEF_USB_GET_STATUS: Write374Byte( RAM_ENDP0_TRAN, 0 ); Write374Byte( RAM_ENDP0_TRAN + 1, 0 ); if ( SetupLen >= 2 ) l = 2; else l = SetupLen; break; default: l = 0xFF; // 操作失敗 break; } } } else l = 0xFF; // 操作失敗 if ( l == 0xFF ) { // 操作失敗 Write374Byte( REG_USB_ENDP0, M_SET_EP0_RECV_STA( M_SET_EP0_TRAN_STA( 0 ) ) ); // STALL } else if ( l <= RAM_ENDP0_SIZE ) { // 上傳數(shù)據(jù) Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ), l ) | BIT_EP0_TRAN_TOG ); // DATA1 } else { // 下傳數(shù)據(jù)或其它 Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ) ) | BIT_EP0_RECV_TOG ); // DATA1 } break; } case USB_INT_EP0_IN: { switch( SetupReq ) { case DEF_USB_GET_DESCR: l = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE : SetupLen; // 本次傳輸長度 Write374Block( RAM_ENDP0_TRAN, l, pDescr ); /* 加載上傳數(shù)據(jù) */ SetupLen -= l; pDescr += l; Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( Read374Byte( REG_USB_ENDP0 ), l ) ^ BIT_EP0_TRAN_TOG ); break; case DEF_USB_SET_ADDRESS: Write374Byte( REG_USB_ADDR, S
我在Init374Device( )最后幾行開的中斷
其他代碼和查詢方式是一摸一樣的(查詢方式可以正常識別設(shè)備)
這個單片機我們也不熟悉,確認(rèn)一下: 374連接PC后,INT#腳是否為低電平,如果是低電平,卻沒有進入中斷程序,那么表示中斷配置有問題;如果是高電平,那么檢查一下UD+的電平,為低的話表示設(shè)備模式?jīng)]有設(shè)置成功
好的,我再看看