我采用并口控制CH375,能夠正常的配置完成,使用DEBUG372.EXE測試,DEBUG372.EXE老是卡死,能夠找到硬件。 附代碼: /****************************************************/ //函數(shù)描述: 短延遲 //寫入?yún)?shù): Delaynum,延遲時間:不詳 //返回參數(shù): 無 //描述: 延時 /****************************************************/ void SDelay(unsigned int DelayNum) { while(DelayNum--); } /****************************************************/ //函數(shù)描述:CH375處于無效狀態(tài) //寫入?yún)?shù):無 //返回參數(shù):無 //描述: 讀、寫無效 /****************************************************/ void CH375Disable() { //add EALLOW; //運行寫EALLOW保護寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位設(shè)置為輸出(1為輸出,0為輸入) EDIS;
CH375_CS=0; CH375_Read=1; CH375_Write=1; CH375_A0=0; } /****************************************************/ //函數(shù)描述:CH375初始化 //寫入?yún)?shù):無 //返回參數(shù):無 //描述: 初始化順序:硬件復(fù)位,自測試(循環(huán)),寫模式,開中斷 /****************************************************/ void CH375Ini() { unsigned char i; CH375Disable(); //CH375無效 CH375_WriteCmd(CMD_RESET_ALL) ; //寫入復(fù)位命令 for(i=0;i<150;i++) { SDelay(4500); //延時>30MS } while(!CH375SelfTest()) //測試CH375 { } CH375Write_Mode(USBDevice); //設(shè)置USB驅(qū)動模式,為設(shè)備模式(0x02)
} /****************************************************/ //函數(shù)描述:CH375自動檢測 //寫入?yún)?shù):無 //返回參數(shù):無 //描述: // 測試數(shù)據(jù): 0XAA, // 返回數(shù)值:0 自測試失敗 // 1 自測試成功 /****************************************************/ unsigned char CH375SelfTest() { unsigned char DataTest; CH375_WriteCmd(CMD_CHECK_EXIST); //寫入測試命令 SDelay(200); //延時 CH375_WriteData(0xAA); //寫入測試數(shù)據(jù) DataTest=CH375_ReadData(); //讀出測試返回數(shù)據(jù) if(DataTest == 0x55) //判斷測試返回數(shù)據(jù), { return 1; } else { return 0; } } /****************************************************/ //函數(shù)描述:CH375寫命令函數(shù) //寫入?yún)?shù):命令控制字 //返回參數(shù):無 //描述: /****************************************************/ void CH375_WriteCmd(unsigned char CH375Command) { unsigned int CH375DATA=0xFF00; EALLOW; //運行寫EALLOW保護寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位設(shè)置為輸出 EDIS; GpioDataRegs.GPBDAT.all=0xFFFF; //對GPIOB賦初始值 CH375DATA|=CH375Command; CH375_CS=0; CH375_A0 = 1; //A0為1的時候,寫入命令,A0為0的時候,寫入數(shù)據(jù) CH375_Read=1;
GpioDataRegs.GPBDAT.all=(GpioDataRegs.GPBDAT.all & CH375DATA);
SDelay(200); CH375_Write=0; SDelay(200); CH375_Write=1; CH375Disable(); } /****************************************************/ //函數(shù)描述:CH375寫數(shù)據(jù) //寫入?yún)?shù):數(shù)據(jù) //返回參數(shù):無 //描述: // 2009.07.27 : V2.0: 從子程序中去除CH375Disable(),在連續(xù)寫數(shù)據(jù)過程中不能將CS變高,移到寫完整個數(shù)據(jù)塊后在Disable /****************************************************/ void CH375_WriteData(unsigned char CH375Data) { unsigned char CH375Data_Temp = 0xFF00; EALLOW; //運行寫EALLOW保護寄存器 GpioMuxRegs.GPBDIR.all=0xFFFF; //GPIOB口低8位設(shè)置為輸出 (1為輸出,0為輸入) EDIS; GpioDataRegs.GPBDAT.all=0xFFFF; //對GPIOB賦初始值 CH375Data_Temp|=CH375Data; CH375_CS=0; CH375_A0 = 0; //A0為1的時候,寫入命令,A0為0的時候,寫入數(shù)據(jù) CH375_Read=1;
GpioDataRegs.GPBDAT.all&= CH375Data_Temp; //這種處理方法有可能改變讀寫狀態(tài)。
SDelay(200); CH375_Write=0; SDelay(200); CH375_Write=1; CH375Disable(); } /****************************************************/ //函數(shù)描述:CH375讀數(shù)據(jù) //寫入?yún)?shù):無 //返回參數(shù):讀出數(shù)據(jù) //描述: //2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函數(shù) // 原因:在批量數(shù)據(jù)讀取時,CS線不能變低。將這部分功能移動到了數(shù)據(jù)讀取完后再進行Disable /****************************************************/ unsigned char CH375_ReadData() { unsigned char USBData;
EALLOW; //運行寫EALLOW保護寄存器 GpioMuxRegs.GPBDIR.all=0xFF00; //GPIOB口低8位設(shè)置為輸入 EDIS; CH375_CS=0; CH375_A0 = 0; //A0為1的時候,讀出中斷標志,A0為0的時候,讀出數(shù)據(jù) CH375_Read=0; CH375_Write=1; SDelay(200);
USBData= (GpioDataRegs.GPBDAT.all)&0xFF;;
SDelay(200); CH375_Read=1; CH375Disable(); return USBData; } /****************************************************/ //函數(shù)描述:CH375寫模式 //寫入?yún)?shù):模式數(shù)據(jù) //返回參數(shù):無 //描述: // 寫完命令自測試 /****************************************************/ void CH375Write_Mode(unsigned char CH375Mode) { //add CH375_WriteCmd(CMD_SET_USB_MODE); SDelay(20); CH375_WriteData(CH375Mode); while(CH375_ReadData()!=CMD_RET_SUCCESS) { } //UartTrans("USB Set Mode OK!\n",17); CH375Disable(); } /****************************************************/ //函數(shù)描述:CH375緩沖區(qū)復(fù)位 //寫入?yún)?shù):無 //返回參數(shù):無 //描述: // 長度清零、緩沖區(qū)清零 /****************************************************/ void USBReset() { unsigned char Count_Temp; for(Count_Temp=0;Count_Temp { USBBuffer[Count_Temp]=0; } USBData_Len = 0; } /****************************************************/ //函數(shù)描述:CH375發(fā)送數(shù)據(jù) //寫入?yún)?shù):數(shù)據(jù)以及數(shù)據(jù)包的長度 //返回參數(shù):無 //描述: // /****************************************************/ void USBSend_Data(unsigned char *USBSendBuffer,unsigned char SendBuffer_Len) { //add unsigned char Count_Temp; CH375_WriteCmd(CMD_WR_USB_DATA7); CH375_WriteData(SendBuffer_Len); for(Count_Temp=0;Count_Temp { CH375_WriteData(*(USBSendBuffer+Count_Temp)); } CH375Disable(); } /****************************************************/ //函數(shù)描述:CH375中斷 //寫入?yún)?shù):無 //返回參數(shù):無 //描述: // 中斷源:INT0 // 緩沖區(qū):USBBuffer[] // 長度 :USBData_Len ,Maxlen=64 /****************************************************/ void USBint() {
unsigned char USBStatus; unsigned char Count_Temp; CH375_WriteCmd(CMD_GET_STATUS); SDelay(1); USBStatus=CH375_ReadData(); switch(USBStatus) { case USB_INT_EP1_OUT: {
} break; case USB_INT_EP1_IN: CH375_WriteCmd(CMD_UNLOCK_USB); break; case USB_INT_EP2_OUT: { CH375_WriteCmd(CMD_RD_USB_DATA); USBData_Len=CH375_ReadData(); //接收長度 if(USBData_Len>64) { USBData_Len=64; } for(Count_Temp=0;Count_Temp< USBData_Len;Count_Temp++) //接收數(shù)據(jù)塊 { USBBuffer[Count_Temp]=CH375_ReadData(); } USBRecFlag=1; CH375Disable(); } break; case USB_INT_EP2_IN: CH375_WriteCmd(CMD_UNLOCK_USB); break; case USB_INT_USB_SUSPEND: break; case USB_INT_WAKE_UP: break; default: break; } } 請教高人指點。[Emot]1[/Emot]