ch375B外置固件模式問題

我的調(diào)試信息如下: ============================================================================= 測試CH375工作狀態(tài):0xED 芯片ID:0xB7 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x08 端點0寫入數(shù)據(jù)成功0x0A 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 端點0接收Setup包成功

標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x08 端點0寫入數(shù)據(jù)成功0x0A 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x08 端點0寫入數(shù)據(jù)成功0x0A 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 端點0接收Setup包成功

標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 端點0接收Setup包成功 0x00 0x05 0x01 0x00 0x00 0x00 0x00 0x00 標準輸出請求--設(shè)置地址 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功

標準輸出請求--設(shè)置地址 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x07 USB復(fù)位 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x08 端點0寫入數(shù)據(jù)成功0x0A 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 端點0接收Setup包成功

標準請求輸入--獲取描述符 設(shè)備描述符 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 端點0接收Setup包成功 0x00 0x05 0x01 0x00 0x00 0x00 0x00 0x00 標準輸出請求--設(shè)置地址 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功

標準輸出請求--設(shè)置地址 =============================================================================

我現(xiàn)在遇到的問題是:1.能收到pc發(fā)送的獲取設(shè)備描述符命令 即調(diào)試輸出中的: 有中斷產(chǎn)生,中斷狀態(tài)為:0x0C 端點0接收Setup包成功 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 標準請求輸入--獲取描述符 設(shè)備描述符 2.也成功返回了設(shè)備描述符的前8個字節(jié) 即調(diào)試輸出中的: 有中斷產(chǎn)生,中斷狀態(tài)為:0x08 端點0寫入數(shù)據(jù)成功0x0A (這里0X0A表示發(fā)送8個字節(jié)后剩余字節(jié)數(shù)) 3.問題再這里: 這時產(chǎn)生了USB_INT_EP0_OUT中斷 即調(diào)試輸出中的: 有中斷產(chǎn)生,中斷狀態(tài)為:0x00 按理說這時PC應(yīng)將總線復(fù)位一次,然后發(fā)送設(shè)置地址命令的,不明白,問題會出在哪呢?

================================================================ 代碼見2樓:mega16+ch375B+GCCAVR

#include "includes.h"

unsigned char Req_Buf[8];// /*設(shè)備描述符變量定義*/ unsigned char bmRequestType; unsigned char bRequest; unsigned int wValue; unsigned int wIndex; unsigned int wLength; /*數(shù)據(jù)傳輸控制變量*/ const unsigned char* pSendData;//當前發(fā)送數(shù)據(jù)的位置 unsigned int SendLength;//需要發(fā)送數(shù)據(jù)的長度 unsigned char NeedZeroPacket;//是否返回0長度數(shù)據(jù)包標志 unsigned char SendBuf[8];

/************************************************************************************ **函數(shù)功能:USB連接函數(shù) **入口參數(shù):無 **返 回:無 **備 注:無 ************************************************************************************/ void USB_Connect(void) { CH375_Write_Cmd(CMD_SET_USB_MODE); CH375_Write_Data(USB_MODE1); delay_10us(5); } //=================================================================================== /************************************************************************************ **函數(shù)功能:USB斷開連接函數(shù) **入口參數(shù):無 **返 回:無 **備 注:無 ************************************************************************************/ void USB_Disconnect(void) { CH375_Write_Cmd(CMD_SET_USB_MODE); CH375_Write_Data(USB_MODE0); delay_10us(5); } //=================================================================================== /************************************************************************************ **函數(shù)功能:USB設(shè)備復(fù)位處理函數(shù) **入口參數(shù):無 **返 回:無 **備 注:對于任何一個CH375中斷,必須唯一對應(yīng)一個UNLOCK_USB命令或者RD_USB_DATA命令 ************************************************************************************/ void USB_Reset(void) { #ifdef DEBUG usartTransStr("USB復(fù)位"); usartTransStr("\r\n"); #endif CH375_Write_Cmd(CMD_UNLOCK_USB); } //=================================================================================== /************************************************************************************ **函數(shù)功能:USB接收建立包成功處理函數(shù) **入口參數(shù):無 **返 回:無 **備 注:無 ************************************************************************************/ void USB_Ep0_Setup(void) { unsigned char i; unsigned char Len; //pUSB_Req p = &Req_Buf; #ifdef DEBUG usartTransStr("端點0接收Setup包成功"); usartTransStr("\r\n"); #endif CH375_Write_Cmd(CMD_RD_USB_DATA); Len = CH375_Read_Data(); //接收到的數(shù)據(jù)長度 for(i=0; i { Req_Buf[i] = CH375_Read_Data(); #ifdef DEBUG usartTransHex(Req_Buf[i]); #endif } #ifdef DEBUG usartTransStr("\r\n"); #endif bmRequestType = Req_Buf[0]; bRequest = Req_Buf[1]; wValue = (((unsigned int)Req_Buf[3])<<8) + Req_Buf[2]; wIndex = (((unsigned int)Req_Buf[5])<<8) + Req_Buf[4]; wLength = (((unsigned int)Req_Buf[7])<<8) + Req_Buf[6];

if((bmRequestType&0x80) == 0x80) //設(shè)備到主機 { switch((bmRequestType>>5) & 0x03) { case 0: //標準請求 #ifdef DEBUG usartTransStr("標準請求輸入--"); //usartTransStr("\r\n"); #endif switch(bRequest) { case GET_CONFIGURATION://獲取配置 #ifdef DEBUG usartTransStr("獲取配置"); usartTransStr("\r\n"); #endif break; case GET_DESCRIPTOR: //獲取描述符 #ifdef DEBUG usartTransStr("獲取描述符"); usartTransStr("\r\n"); #endif switch((wValue>>8) & 0xFF) { case DEVICE_DESCRIPTOR: //設(shè)備描述符 #ifdef DEBUG usartTransStr("設(shè)備描述符"); usartTransStr("\r\n"); #endif pSendData = &DeviceDescriptor[0]; if(wLength > 0x12) { SendLength = 0x12; } else { SendLength = wLength; } USB_Ep0_Send_Data(); break; case CONFIGURATION_DESCRIPTOR://配置描述符 #ifdef DEBUG usartTransStr("配置描述符"); usartTransStr("\r\n"); #endif break; case STRING_DESCRIPTOR: //字符串描述符 #ifdef DEBUG usartTransStr("字符串描述符"); usartTransStr("\r\n"); #endif break; default: //其他描述符 #ifdef DEBUG usartTransStr("其他描述符"); usartTransStr("\r\n"); #endif break; } break; case GET_INTERFACE: //獲取接口 #ifdef DEBUG usartTransStr("獲取接口"); usartTransStr("\r\n"); #endif break; case GET_STATUS: //獲取狀態(tài) #ifdef DEBUG usartTransStr("獲取狀態(tài)"); usartTransStr("\r\n"); #endif break; case SYNCH_FRAME: //同步幀 #ifdef DEBUG usartTransStr("同步幀"); usartTransStr("\r\n"); #endif break; default: #ifdef DEBUG usartTransStr("未知"); usartTransStr("\r\n"); #endif break; } break; case 1: //類請求 #ifdef DEBUG usartTransStr("類請求輸入--"); #endif break; case 2: //廠商請求 #ifdef DEBUG usartTransStr("廠商請求輸入--"); #endif break; default: #ifdef DEBUG usartTransStr("未知請求輸入--"); #endif break; } } else //主機到設(shè)備 { switch((bmRequestType>>5) & 0x03) { case 0: //標準輸出請求 #ifdef DEBUG usartTransStr("標準輸出請求--"); #endif switch(bRequest) { case CLEAR_FEATURE: //清除特性 #ifdef DEBUG usartTransStr("清除特性"); usartTransStr("\r\n"); #endif break; case SET_ADDRESS: //設(shè)置地址 #ifdef DEBUG usartTransStr("設(shè)置地址"); usartTransStr("\r\n"); #endif //CH375_Write_Cmd(CMD_SET_USB_ADDR); //CH375_Write_Data((unsigned char)wValue); break; case SET_CONFIGURATION: //設(shè)置配置 #ifdef DEBUG usartTransStr("設(shè)置配置"); usartTransStr("\r\n"); #endif break; case SET_DESCRIPTOR: //設(shè)置描述符 #ifdef DEBUG usartTransStr("設(shè)置描述符"); usartTransStr("\r\n"); #endif break; case SET_FEATURE: //設(shè)置特性 #ifdef DEBUG usartTransStr("設(shè)置特性"); usartTransStr("\r\n"); #endif break; case SET_INTERFACE: //設(shè)置接口 #ifdef DEBUG usartTransStr("設(shè)置接口"); usartTransStr("\r\n"); #endif break; default: //未知標準輸出請求 #ifdef DEBUG usartTransStr("未知標準輸出請求"); usartTransStr("\r\n"); #endif break; } break; case 1: //類輸出請求 #ifdef DEBUG usartTransStr("類輸出請求--"); #endif break; case 2: //廠商輸出請求 #ifdef DEBUG usartTransStr("廠商輸出請求--"); #endif break; default: //未知輸出請求 #ifdef DEBUG usartTransStr("未知輸出請求--"); #endif break; } } } //=================================================================================== /************************************************************************************ **函數(shù)功能:端點0輸入中斷處理函數(shù) **入口參數(shù):無 **返 回:無 **備 注:無 ************************************************************************************/ void USB_Ep0_In(void) { #ifdef DEBUG usartTransStr("端點0寫入數(shù)據(jù)成功"); usartTransHex(SendLength); usartTransStr("\r\n"); #endif //CH375_Write_Cmd(CMD_UNLOCK_USB); //if(bRequest == GET_DESCRIPTOR) //{ // USB_Write_Ep0_Buff(); USB_Ep0_Send_Data(); //} //else if(bRequest == SET_ADDRESS) //{ // CH375_Write_Cmd(CMD_SET_USB_ADDR); // CH375_Write_Data(wValue); //} CH375_Write_Cmd(CMD_UNLOCK_USB); } //=================================================================================== /************************************************************************************ **函數(shù)功能:向端點0緩沖區(qū)寫入數(shù)據(jù)函數(shù) **入口參數(shù):len-->寫入數(shù)據(jù)長度 ** p---->數(shù)據(jù)緩沖區(qū)首地址 **返 回:無 **備 注:無 ************************************************************************************/

void USB_Write_Ep0_Buff(unsigned char len, const unsigned char* p) { unsigned char i;

CH375_Write_Cmd(CMD_WR_USB_DATA3); CH375_Write_Data(len); for(i=0; i { CH375_Write_Data(p[i]); } }

/* void USB_Write_Ep0_Buff(void) { unsigned char i;

for(i=0; i { SendBuf[i] = *pSendData; pSendData++; } } */ //===========================================================


按照道理來講的話,你應(yīng)該給計算機只返回設(shè)備描述符的前9個字節(jié),或者只給計算機返回4個字節(jié)的描述符,因為你返回的是整包數(shù)據(jù),計算機會認為你還有數(shù)據(jù),這個時候你只需要在寫一個非滿包的數(shù)據(jù)通過端點0,這樣的話,計算機就會給你總線復(fù)位,發(fā)送設(shè)置地址的命令的。


另外不要加這么多調(diào)試信息,這樣會占用大量的時間,可能會導(dǎo)致計算機認為超時,這點務(wù)必注意。


貌似還是不對, ========================================================================== USB復(fù)位 USB復(fù)位 USB復(fù)位 USB復(fù)位 端點0接收Setup包成功 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 標準請求輸入--獲取描述符 設(shè)備描述符 端點0發(fā)送8字節(jié)數(shù)據(jù)成功 端點0收到數(shù)據(jù)成功 端點0收到數(shù)據(jù)成功 端點0收到數(shù)據(jù)成功 端點0接收Setup包成功 0x00 0x05 0x01 0x00 0x00 0x00 0x00 0x00 標準輸出請求--設(shè)置地址 =============================================================================== 在我返回8字節(jié)的設(shè)備描述符后,pc又發(fā)送了0字節(jié)的數(shù)據(jù)包,我在USB_INT_EP0_OUT中斷中返回0字節(jié)數(shù)據(jù)包, 這時USB_INT_EP0_OUT還是會觸發(fā)2次,沒有復(fù)位,就接收到設(shè)置地址的包 (另外,我不加調(diào)試信息的話也是一樣的結(jié)果)


標準輸出請求--設(shè)置地址 這一步需要做兩個動作 1:設(shè)置CH375的地址 2:返回0長度的數(shù)據(jù)包 請參考我們提供的程序,你只要把硬件層接口寫好,直接移植即可。 到在線下載里搜索CH372EVT.ZIP,找到XFIRM文件夾,就是MCU的參考程序。


thanks,我先看看


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频