各位大俠,我利用CH375的設(shè)備方式與PC進(jìn)行通信,控制器是STC89C52,利用IO口模擬的方式編寫的下位機(jī)程序,程序運行后,設(shè)置CH375內(nèi)部固件模式成功,電腦能夠正常識別硬件,利用那個CH372里的TEST.EXE和DEBUG.EXE工具給下位機(jī)發(fā)數(shù)據(jù)時,發(fā)現(xiàn)一直收不到回來的數(shù)據(jù),并且死機(jī),檢測了一下INT#電平發(fā)現(xiàn),設(shè)置模式成功時,為高電平,打開DEBUG.EXE軟件,點端點2的下傳命令后,INT#就變?yōu)榈碗娖剑笠恢笔堑?,并且沒有收到返回數(shù)據(jù),請各位大俠看看,這是什么問題,非常感謝!
估計是程序沒有進(jìn)入中斷,讀取中斷狀態(tài)。如果沒有讀取中斷狀態(tài),INT#會一直處于低電平
同上,主程序沒開中斷吧?
主程序已經(jīng)開中斷了, 通過串口測試發(fā)現(xiàn), H375_WR_CMD_PORT(CMD_GET_STATUS); 這條命令執(zhí)行后,并沒有讓INT#引腳變高電平,而且,status = CH375_RD_DAT_PORT(); 獲取的中斷狀態(tài)也不正確,我發(fā)到串口上一看,數(shù)據(jù)是 0x51,也就是 CMD_RET_SUCCSESS 的值,并不是獲取的CH375中斷的值,所以下面一直沒法執(zhí)行了,這個不知道怎么回事???請教給位大俠!
你說的現(xiàn)象應(yīng)該不會存在的,你檢查你的中斷,看是不是其它什么地方進(jìn)入的中斷,而不是下傳的中斷
大俠,下面是程序,請幫忙看看,執(zhí)行完那個獲取中斷狀態(tài)后,獲取的值是0x51,現(xiàn)在也沒調(diào)試通,謝謝! #include "config.h" #include #include "CH375INC.H" #include #include #include #include #include #include
#define USBDevice 0x02 // 定義USB設(shè)備種類 #define USBBuffer_MaxLen 64 // USB設(shè)備的緩沖區(qū)地址
extern uchar USBBuffer[64]; // 緩沖數(shù)組 extern bit USBRecFlag; // USB接收標(biāo)志 extern uchar USBData_Len; // 字節(jié)長度
/********************************************/ //*與硬件相關(guān),需要根據(jù)自己的硬件來更改
sbit CH375_Read = P1^0 ; //RD sbit CH375_Write = P1^1; //WR sbit CH375_CS = P1^2; //CS sbit CH375_1Cmd_0Data = P1^3; //A0 //sbit USB_INT0 = P1^4;
#define CH375Port P2 //P2 Port // INT#====INT0
/*******************************************/ bit USBRecFlag=0; //USB接收到數(shù)據(jù)包后的標(biāo)志位 bit flag_1 = 0; uchar USBBuffer[64]={0}; //USB接收數(shù)據(jù)緩沖區(qū) uchar USBData_Len=0; //USB數(shù)據(jù)包長度
/*************************************************************** * 函數(shù)名稱: Delay() * 功能描述:短延遲 * 輸入?yún)?shù): ui * 返回參數(shù): 無 // 2--延時2us; // 8--延時50us; // 16-延時100us; // 180--延時1ms *****************************************************************/ void Delay(unsigned int ui) { while(ui--); }
/*************************************************************** * 函數(shù)名稱: CH375_Disable() * 功能描述: * 輸入?yún)?shù): 無 * 返回參數(shù): 無 *****************************************************************/ void CH375_Disable(void) { CH375_CS=1; CH375_Read=1; CH375_Write=1; CH375_1Cmd_0Data=0; }
/*************************************************************** * 函數(shù)名稱: CH375初始化 * 功能描述: 初始化順序:硬件復(fù)位,自測試(循環(huán)),寫模式,開中斷 * 輸入?yún)?shù): 無 * 返回參數(shù): 無 *****************************************************************/ void CH375_Initial(void) { EA = 0; //Disable all interrupt EX1 = 0; CH375_Disable(); Delay(9000); // 延時50ms CH375_WriteCmd(CMD_RESET_ALL); // 執(zhí)行硬件復(fù)位 Delay(9000); // 延時50ms // 執(zhí)行測試命令 if(!CH375_SelfTest()) { send_strs_com("CH375-Error!\n"); } Delay(9000); // 延時50ms // 執(zhí)行工作模式設(shè)置 CH375_Write_Mode(USBDevice); // 已啟用的設(shè)備方式并且使用內(nèi)置固件模式 send_strs_com("Wrtie mode!\n"); IT0 = 0; // 置外部信號為低電平觸發(fā) IE0 = 0; // 清中斷標(biāo)志 EX0 = 1; // 允許CH375中斷 }
/*************************************************************** * 函數(shù)名稱: CH375_SelfTest() * 功能描述: CH375自測試 * 輸入?yún)?shù): 無 * 返回參數(shù): 無 * 補(bǔ)充說明: 測試數(shù)據(jù):0XAA,0--自測試失敗 ,1--自測試成功 *****************************************************************/ bit CH375_SelfTest(void) { uchar DataTest; CH375_WriteCmd(CMD_CHECK_EXIST); /* 測試工作狀態(tài) */ Delay(20); CH375_WriteData(0XAA); Delay(20); DataTest= CH375_ReadData(); if(DataTest == 0X55) { //send_strs_com(" USB Self Test OK!"); return 1; } else { send_strs_com(" USB Self Test Error!"); return 0; } }
/*************************************************************** * 函數(shù)名稱: CH375_WriteCmd * 功能描述: CH375寫命令函數(shù) * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: *****************************************************************/ void CH375_WriteCmd(uchar CH375Command) { uchar Command_Temp; Command_Temp = CH375Command; CH375_CS = 0; CH375_1Cmd_0Data = 1; CH375Port = Command_Temp; Delay(2); CH375_Write=0; Delay(1); CH375_Write=1; CH375_Disable(); }
/*************************************************************** * 函數(shù)名稱: CH375_WriteData * 功能描述: CH375寫數(shù)據(jù) * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: /* 2009.07.27 : V2.0: 從子程序中去除CH375Disable(),在連續(xù)寫數(shù)據(jù)過程中不能將CS變高,移到寫完整個數(shù)據(jù)塊后在Disable *****************************************************************/
void CH375_WriteData(uchar CH375Data) { uchar CH375Data_Temp; CH375Data_Temp = CH375Data; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port = CH375Data_Temp; Delay(2); CH375_Write=0; Delay(1); CH375_Write=1; } /*************************************************************** * 函數(shù)名稱: CH375_ReadData * 功能描述: CH375讀數(shù)據(jù) * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: /*2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函數(shù) /* 原因:在批量數(shù)據(jù)讀取時,CS線不能變低。將這部分功能移動到了數(shù)據(jù)讀取完后再進(jìn)行Disable *****************************************************************/ uchar CH375_ReadData(void) { uchar USBData; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port=0XFF; CH375_Read=0; CH375Port=0XFF; Delay(2); USBData=CH375Port; Delay(1); CH375_Read=1; return USBData; }
/*************************************************************** * 函數(shù)名稱: CH375Write_Mode * 功能描述: CH375寫模式 * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: *****************************************************************/ void CH375_Write_Mode(uchar CH375Mode) { uchar CH375Mode_Temp; CH375Mode_Temp = CH375Mode; CH375_WriteCmd(CMD_SET_USB_MODE); // 設(shè)置USB工作模式 Delay(2); CH375_WriteData(CH375Mode_Temp); Delay(2); while(CH375_ReadData()!=CMD_RET_SUCCESS) //命令操作成功 { //send_strs_com("CH375-MODE-Error!\n"); //CH375_WriteData(CH375Mode_Temp); } //send_strs_com("CH375-MODE-OK!\n"); CH375_Disable(); }
/*************************************************************** * 函數(shù)名稱: USB_Buffer_Reset * 功能描述: CH375緩沖區(qū)復(fù)位 * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: 長度清零、緩沖區(qū)清零 *****************************************************************/ void USB_Buffer_Reset(void) { uchar Count_Temp; for( Count_Temp=0;Count_Temp { USBBuffer[Count_Temp]=0; } USBData_Len = 0; } /*************************************************************** * 函數(shù)名稱: USB_Send_Data * 功能描述: CH375發(fā)送數(shù)據(jù) * 輸入?yún)?shù): 數(shù)據(jù)以及數(shù)據(jù)包的長度 * 返回參數(shù): 無 * 補(bǔ)充說明: 長度清零、緩沖區(qū)清零 *****************************************************************/ void USB_Send_Data(uchar *USBSendBuffer,uchar SendBuffer_Len) { //add uchar Count_Temp; CH375_WriteCmd(CMD_WR_USB_DATA7); // 向USB端點2或者主機(jī)端點的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 Delay(2); CH375_WriteData(SendBuffer_Len); Delay(2); for(Count_Temp=0;Count_Temp { CH375_WriteData(*(USBSendBuffer+Count_Temp)); } CH375_Disable(); } /*************************************************************** * 函數(shù)名稱: USB_int * 功能描述: CH375中斷 * 輸入?yún)?shù): 數(shù)據(jù)以及數(shù)據(jù)包的長度 * 返回參數(shù): 無 * 補(bǔ)充說明: /* 中斷源:INT1 /* 緩沖區(qū):USBBuffer[] /* 長度 :USBData_Len ,Maxlen=64 // CH375中斷服務(wù)程序,使用寄存器組1 *****************************************************************/ void USB_int() interrupt 0 using 1 { //add uchar USBStatus; // USB中斷狀態(tài) uchar Count_Temp;
CH375_WriteCmd(CMD_GET_STATUS); // 獲取中斷狀態(tài)并取消中斷請求 Delay(200); USBStatus = CH375_ReadData(); send_char_com(USBStatus) ; // 程序在這里出錯誤,發(fā)到串口上是0X51 Delay(2); switch(USBStatus) { case USB_INT_EP2_OUT: /* USB端點2的OUT *//* 批量端點下傳成功 */ { CH375_WriteCmd(CMD_RD_USB_DATA); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */
說明,設(shè)置工作模式成功,電腦可以識別,利用DEBUG372上位機(jī)下傳數(shù)據(jù)后,可以進(jìn)入中斷,發(fā)送的串口數(shù)據(jù)為:0x51 【 send_char_com(USBStatus) 】
在你發(fā)送獲取中斷狀態(tài)之后,也就是你獲取的狀態(tài)為51H的時候。中斷引腳是高還是低?
中斷引腳是高電平的,因為獲取的狀態(tài)是51H,所有沒法執(zhí)行下面的程序,上位機(jī)也就無法收到數(shù)據(jù)了
那可能讀取數(shù)據(jù)函數(shù)有問題,建議你做測試命令的時候先發(fā)0XAA數(shù)據(jù),讀取回來的數(shù)據(jù)位0X55 在發(fā)0X55數(shù)據(jù),讀取回來的數(shù)據(jù)應(yīng)該為0XAA。你看下這樣測試命令是否可以。
大俠,我已經(jīng)做過測試了,上面就是那個源程序,測試沒有問題
/*************************************************************** * 函數(shù)名稱: CH375_ReadData * 功能描述: CH375讀數(shù)據(jù) * 輸入?yún)?shù): 命令控制字 * 返回參數(shù): 無 * 補(bǔ)充說明: /*2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函數(shù) /* 原因:在批量數(shù)據(jù)讀取時,CS線不能變低。將這部分功能移動到了數(shù)據(jù)讀取完后再進(jìn)行Disable *****************************************************************/ uchar CH375_ReadData(void) { uchar USBData; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port=0XFF; CH375_Read=0; CH375Port=0XFF; Delay(2); USBData=CH375Port; Delay(1); CH375_Read=1; CH375DISABLE(); return USBData; }
大俠,加入 CH375DISABLE();語句后,調(diào)試了一下,還是那個問題,原來的 CH375_ReadData()函數(shù)是沒問題的,要不設(shè)置工作模式的時候就不會成功,真是奇怪,還請大俠幫忙再分析一下,謝謝!
如果你單片機(jī)IO口不需要設(shè)置方向的話時序是沒有什么問題的。不知道你單片機(jī)的晶振有多快,也不知道你的單片機(jī)是不是12個時鐘周期為一個機(jī)器周期,但我想最慢的6M晶振下函數(shù)Delay(9000)延遲也沒有50MS。還有檢查:1、硬件是不是按照我們手冊給的標(biāo)準(zhǔn)接的2、檢查芯片是不是工作在并口模式下3、檢查你的你的中斷引腳有沒有可能是被別的什么拉低了,還有你在執(zhí)行CH375_WriteCmd(CMD_GET_STATUS)后PC端還能看到設(shè)備么?
1、大俠,晶振頻率22.1184MHZ,單片機(jī)是STC89C52,比51快一些,利用示波器測試 Delay(180) 大約1ms,Delay(9000)延時50ms是沒有問題的。 2、硬件是按照平口模式連接的,采用IO模擬時序的方法。硬件測試命令和設(shè)置工作模式命令都可以成功執(zhí)行,電腦能夠識別CH372/375設(shè)備,不過電腦端是 "外部接口" ch372/375設(shè)備, 沒有在USB總線適配器下面。 3、源程序見上面,沒有其它地方的干擾呢,在執(zhí)行CH375_WriteCmd(CMD_GET_STATUS)后,PC端還是能看到設(shè)備的。 4、利用DEBUG372發(fā)送下傳數(shù)據(jù),第一次后,產(chǎn)生中斷,串口發(fā)51H,然后DEBUG372軟件就假死了,打開設(shè)備按鈕沒反應(yīng),也沒法關(guān)閉軟件,除非把375硬件設(shè)備拔掉,然后重新插上才可以識別,調(diào)試了一周了,沒有結(jié)果,真的不知道哪里出錯了,感謝大俠們的指導(dǎo)!非常感謝!
你可以嘗試用我們公司提供的TEST.C程序測試,是不是存在你上面的問題