把CH372在MSP430上轉(zhuǎn)起來了. /****************************************Copyright(c)*************************** ** 公司 ** 部門 **----文件信息---- **文 件 名: CH372usb.c **創(chuàng) 建 人: **最后修改日期: 2005-1-11 13:54 **描 述: CH372芯片硬件驅(qū)動 **I D E: IAR Embedded Workbench Version: 3.20A **編 譯 器: IAR Embedded Workbench Version: 3.20A **備 注: CHIP CH372 MSP430F149 **--歷史版本信息-- ** 創(chuàng)建人: ** 版 本: ** 日 期: ** 描 述: **--當(dāng)前版本修訂-- ** 修改人: ** 日 期: ** 描 述: ********************************************************************************/
#include "resource.h" #include "stddef.h" #include "DummyBus.h" #include "CH372INC.H" #include "delay.h" #include "ch372usb.h" // // 私有 USB ID // CH372芯片的 VID:0X4348 // PID:0X5537 // 根據(jù)應(yīng)用系統(tǒng)的不同改為應(yīng)用系統(tǒng)的ID // 同時必須改驅(qū)動文件的:INF文件 #define APP_USB_VENDOR_ID 0x4348 #define APP_USB_PRODUCT_ID 0x5537 // // USB數(shù)據(jù)緩沖區(qū) // UCHAR UsbLength; /* USB數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)的長度 */ UCHAR UsbBuffer[ CH375_MAX_DATA_LEN ]; /* USB數(shù)據(jù)緩沖區(qū) */ // 讀數(shù)據(jù) UCHAR USBReadData(void){ UCHAR x; x = ReadChar(DataAddress); Delay2us(); return x; } // 寫命令 // 周期不小于4uS, void USBWriteCMD(UCHAR x){ Delay2us(); Delay2us(); WriteChar(x,CMDAddress); Delay2us(); Delay2us(); } // 寫數(shù)據(jù) void USBWriteData(UCHAR x){ WriteChar(x,DataAddress); Delay2us(); }
// // CH375初始化 //
UCHAR CH375_Init( void ) { UCHAR i; #ifdef APP_USB_VENDOR_ID #ifdef APP_USB_PRODUCT_ID /* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作,不執(zhí)行該命令則使用默認的VID和PID, 如果設(shè)置使用自定義的ID,那么計算機端驅(qū)動程序INF安裝文件中的"USB\VID_4348& PID_5537"需要進行類似修改 */ USBWriteCMD( CMD_SET_USB_ID ); /* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作 */ USBWriteData( (UCHAR)APP_USB_VENDOR_ID ); /* 寫入廠商ID的低字節(jié) */ USBWriteData( (UCHAR)(APP_USB_VENDOR_ID>>8) ); /* 寫入廠商ID的高字節(jié) */ USBWriteData( (UCHAR)APP_USB_PRODUCT_ID ); /* 寫入產(chǎn)品ID的低字節(jié) */ USBWriteData( (UCHAR)(APP_USB_PRODUCT_ID>>8) ); /* 寫入產(chǎn)品ID的高字節(jié) */ #endif #endif
/* 設(shè)置USB工作模式, 必要操作 */ USBWriteCMD(CMD_SET_USB_MODE ); USBWriteData( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ /* 等待操作成功,通常需要等待10uS-20uS */ /* if ( i == 0 ) { CH372/CH375芯片內(nèi)部或者物理連接存在硬件錯誤 }; */ for ( i=100; i!=0; i-- ){ if ( USBReadData( ) == CMD_RET_SUCCESS ){ return true; // 初始化USB成功 } } return false; // 初始化USB失敗 }
//========================================================================================== // 函數(shù)名: mCH375Interrupt // 輸 入: 無 // 輸 出: 無 // 說 明: CH375服務(wù)程序,CH375的INT#引腳連接單片機的輸入引腳P2.3 // 當(dāng)程序不使用中斷接收功能時使用本函數(shù) // 當(dāng)有P2.3有下降沿時調(diào)用本函數(shù)處理USB的務(wù) // 作 者: // 時 間: 2005.1.15 // 測 試: //========================================================================================== void mCH375Interrupt( void ){ UCHAR IntStatus; UCHAR cnt; UCHAR * buf; USBWriteCMD( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ IntStatus = USBReadData( ); /* 獲取中斷狀態(tài) */ if ( IntStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功,接收到命令包 */ USBWriteCMD( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ UsbLength = cnt = USBReadData( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ if ( cnt ) { /* 接收到數(shù)據(jù)放到緩沖區(qū)中 */ buf = UsbBuffer; /* 指向緩沖區(qū) */ do { *buf = USBReadData( ); /* 接收命令包的數(shù)據(jù) */ buf ++; } while ( -- cnt ); } else return; /* 長度為0,沒有數(shù)據(jù),在某些應(yīng)用中也可以將長度0定義為一種特殊命令 */ /* 分析接收到的數(shù)據(jù)并處理,此處略去,下面演示回傳數(shù)據(jù) */ USBWriteCMD( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ cnt = UsbLength; USBWriteData( cnt ); /* 首先寫入后續(xù)數(shù)據(jù)長度 */ if ( cnt ) { /* 將緩沖區(qū)中的數(shù)據(jù)發(fā)出 */ buf = UsbBuffer; /* 指向緩沖區(qū) */ do { USBWriteData( *buf ); /* 寫入數(shù)據(jù)到CH375 */ buf ++; } while ( -- cnt ); } } else if ( IntStatus == USB_INT_EP2_IN ) { /* 批量數(shù)據(jù)發(fā)送成功,狀態(tài)包已發(fā)送 */ /* 如果還有數(shù)據(jù)需要接著發(fā)送,可在此通過CMD_WR_USB_DATA7命令寫入,參考前面的回傳 */ USBWriteCMD( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū),收到上傳成功中斷后,必須解鎖USB緩沖區(qū),以便繼續(xù)收發(fā) */ } else if ( IntStatus == USB_INT_EP1_IN ) { /* 中斷數(shù)據(jù)發(fā)送成功,本程序未用到 */ USBWriteCMD( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ } /* 內(nèi)置固件的USB方式下不應(yīng)該出現(xiàn)其它中斷狀態(tài) */ } 轉(zhuǎn)載請知道本人.