外部接口找到了CH372/CH375,我想連接是沒問題的。 不好意思,在在線下載里找不到CH372DUG,請問在哪里可以找到?是一個調(diào)試軟件嗎?
謝謝,我用CH372搜索就找到了。
我剛才試了發(fā)1個數(shù)據(jù),貌似能正常接收,我想多數(shù)據(jù)發(fā)送時,請問要數(shù)據(jù)間是怎么隔開的?此外,CH372DBG是不是都是按16進制數(shù)據(jù)發(fā)送?在線等,謝謝。
這種問題你做一下實驗就可以了.數(shù)據(jù)不要分開,空格為0x20.
呵呵,謝謝,實驗結(jié)果貌似是都按2位的16進制數(shù)傳輸?shù)摹?/p>
單片機接收數(shù)據(jù)沒問題了,可是上傳數(shù)據(jù)沒有任何反應,麻煩各位幫忙看看。 void main(void) { unsigned char i; IE = 0x84; IT1 = 1; EX1 = 1; Delay_mS(500); Delay12uS(); CH375_Device_Init(); CH375_WR_CMD(CMD_WR_USB_DATA7); USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } while(1) { if (B_USB_Ready) { B_USB_Ready = FALSE; CH375_WR_CMD(CMD_GET_STATUS); CH375_Status = CH375_RD_DAT(); if(CH375_Status == USB_INT_EP2_OUT) { CH375_WR_CMD(CMD_RD_USB_DATA); USB_Count = CH375_RD_DAT(); if(USB_Count == 0) { CH375_WR_CMD( CMD_SET_ENDP7 ); /* 設(shè)置USB端點2的IN,也就是批量上傳端點 */ CH375_WR_DAT( 0x0E ); /* 同步觸發(fā)位不變,設(shè)置USB端點2的IN正忙,返回NAK,實際是清除上傳緩沖區(qū)的已有內(nèi)容 */ } for (i = 0; i < USB_Count; i++) { USB_dat[i] = CH375_RD_DAT(); } } if(CH375_Status == USB_INT_EP2_IN) { CH375_WR_CMD(CMD_UNLOCK_USB); } Delay(); } } }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay(void) //短延時 { ; }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay12uS(void) //12us延時 { uchar i; for(i = 0; i < C_DelayTime12uS; i++) { ; } }
//+++++++++++++++++++++++++++++++++++++++++++++
void Delay_mS(uint n) //1ms延時 { uint t; uint h; for(h = 0; h < n; h++) { for(t = 0; t < C_DelayTime1mS; t++) { ; } } }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_WR_CMD(uchar cmd) //向CH375的命令端口寫入命令 { Delay(); CH375_CMD_PORT = cmd; Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_WR_DAT(uchar dat) //向CH375的數(shù)據(jù)端口寫入數(shù)據(jù) { CH375_DAT_PORT = dat; Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
uchar CH375_RD_DAT(void) { Delay(); return(CH375_DAT_PORT); }
//+++++++++++++++++++++++++++++++++++++++++++++
void CH375_Device_Init(void) //CH375設(shè)備方式初始化 { uchar i,j; i = 0; j = 0; CH375_WR_CMD(CMD_RESET_ALL); Delay_mS(1); CH375_WR_CMD(CMD_SET_USB_MODE); CH375_WR_DAT(0x02); //設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 while(i != CMD_RET_SUCCESS && j < 200) { i = CH375_RD_DAT(); j++; } Delay(); }
//+++++++++++++++++++++++++++++++++++++++++++++
static void Interrupt2_serve(void) interrupt 2 { B_USB_Ready = TRUE; }
//+++++++++++++++++++++++++++++++++++++++++++++
在這個函數(shù)之后需要加上這一段數(shù)據(jù)之后在進行寫數(shù)據(jù)就可以了: CH375_Device_Init(); while(1){ /*用來確定主機是否準備好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } 后面在加上你自己的上傳數(shù)據(jù)函數(shù)就可以了。
謝謝,我去看看對應的指令作用。 看著例程搬過來的,有很多指令多不清楚。謝謝你的回復,我繼續(xù)調(diào)試。
我收到的返回數(shù)據(jù)是0x04,請問我0x0a在CH372DS2的描述是說外部固件,對于GET_TOGGLE是讓CH375與PC同步嗎?
你只需要按照上面程序來做就可以了,這個命令是為了確保計算機把CH372初始化完成,而不是你想象的那樣。
Delay_mS(500); Delay12uS(); CH375_Device_Init(); CH375_WR_CMD(0x0a);//GET_TOGGLE命令 CH375_WR_DAT(0x20); i = CH375_RD_DAT(); if((i&0x20)==0x20) { CH375_WR_CMD(CMD_WR_USB_DATA7); USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } }
真是抱歉,我是這樣改的,可是返回值是0x04.
while(1){ /*用來確定主機是否準備好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } 你用if可以嗎?上面是等待,你這個條件判斷一次通不過就往下走了.好好考慮一下代碼為什么這樣,寫代碼不是簡單的移植和修改.
呵呵,不好意思,我之前理解有誤,我以為hcn跟我說的是在if后面加發(fā)送數(shù)據(jù)的程序,而沒想到是在while(1)循環(huán)結(jié)束之后。經(jīng)你這么一說,我知道了。 我之前用了不少時間在研究海量存儲的基礎(chǔ)知識,現(xiàn)在老板要求這周要出項目的雛形,所以沒有仔細的去研究網(wǎng)站上的例程,問了很多“簡單”的問題,實在抱歉。
我循環(huán)等待之后讀到了返回值0x24。 然后在while循環(huán)后嵌入發(fā)送數(shù)據(jù),PC還是接受不到上傳數(shù)據(jù);但單片機能接收到PC下傳的數(shù)據(jù)。 USB_Count = 8; for(i = 0; i < USB_Count; i++) { USB_dat[i] = 0x40+i; } CH375_WR_CMD(CMD_WR_USB_DATA7); CH375_WR_DAT(USB_Count); for(i = 0; i < USB_Count; i++) { CH375_WR_DAT(USB_dat[i]); } 請指教。
謝謝各位,已經(jīng)解決了,上傳數(shù)據(jù)原來是手動獲取的。 這段時間這是謝謝各位的幫忙,接下來要開始實踐U盤讀寫文件了。