CH375和CH372常見問題的解決[討論]

/* CH375中斷服務(wù)程序,使用寄存器組1 */ void mCh375Interrupt( void ) //interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; //unsigned char data buffer[ 64 ]; unsigned char buffer[ 64 ]; unsigned char Lenth[ 60 ]; //a++; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ CH375_RD_DAT_PORT( ); length = RD_DATA; /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) { CH375_RD_DAT_PORT( ); buffer[ i ] = RD_DATA; /* 接收數(shù)據(jù)包 */ } CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i { buffer[ i ] = ~buffer[ i ] ; CH375_WR_DAT_PORT( buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確 */ } break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ PTCD_PTCD5 = 0; break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

void main(void) {

MCUinit(); port_init(); Delay50ms( ); /* 延時(shí)等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號(hào)則不必延時(shí) */ CH375_Init( ); /* 初始化CH375 */ while ( 1 ) /* 以下指令開始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */ { if(!CH375_INT) { mCh375Interrupt(); } } }


void mCh375Interrupt(void ) //interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; // unsigned char data buffer[ 64 ]; unsigned char buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ DataLong = length; for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

void main(void) {

unsigned char Lenth[64] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a}; MCUinit(); port_init(); Delay50ms( ); /* 延時(shí)等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號(hào)則不必延時(shí) */ CH375_Init( ); /* 初始化CH375 */ //EA = 1; /* 允許中斷 */ //mCh375Interrupt(); while ( 1 ) /* 以下指令開始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */ { b++; if(!CH375_INT) { mCh375Interrupt(); } } }


這個(gè)簡潔點(diǎn)

原來是沒有把讀數(shù)據(jù)的函數(shù)加進(jìn)去了。用TEST文件夾的程序試了,可以了

現(xiàn)在有個(gè)這樣的情況。。。我把數(shù)據(jù)長度顯示出來,DataLong = length;

數(shù)據(jù)的長度到了48字節(jié)之后,就一直顯示48

曾經(jīng)試過發(fā)64個(gè)字節(jié),長度就是一直顯示0xfd 但是通過DEBUG372收到的數(shù)據(jù)是64個(gè),是UP顯示64 端點(diǎn)2上傳框框,哪里的長度一直都是灰色的64??

數(shù)據(jù)長度是不是有問題?????? 還有端點(diǎn)1上傳那個(gè)框框有什么用的?。???


使用DEBUG372調(diào)試,如果你接收的數(shù)據(jù)和你發(fā)送的數(shù)據(jù)長度相等,并且是按位取反,則說明傳輸沒有問題, 不知道你用什么顯示數(shù)據(jù)長度,有沒有單獨(dú)測試過? 端點(diǎn)1上傳那個(gè)框框 是通過端點(diǎn)1上傳的,原理和端點(diǎn)2是一樣的,只是單次只能上傳8字節(jié).


用仿真器在電腦上顯示的 DataLong = length; 直接把收到的數(shù)據(jù)長度給一個(gè)寄存器。通過仿真就可以看到數(shù)據(jù)長度了。。。。

現(xiàn)在知道是什么原因了,是那個(gè)類型說明,在函數(shù)里面說明數(shù)據(jù)類型的話,顯示的數(shù)據(jù)長度就有問題,在函數(shù)外面說明數(shù)據(jù)類型就正確了。。。

接收的數(shù)據(jù)和你發(fā)送的數(shù)據(jù)長度相等,并且是按位取反。這都沒有問題了

然后我用那個(gè)Test的文件夾里面的上位機(jī)測試程序。顯示的是 一大堆

這是什么問題??????


S1-T1-C2441 return data error at 3: 01H S1-T1-C2441 return data error at 4: 01H S1-T1-C2441 return data error at 5: 01H S1-T1-C2441 return data error at 6: 01H S1-T1-C2441 return data error at 7: 01H S1-T1-C2441 return data error at 8: 01H S1-T1-C2441 return data error at 9: 01H S1-T1-C2441 return data error at 10: 01H


我也遇到4,5,6樓的問題,還是沒有解決,每步大于10ms的延時(shí)都沒有用

奇怪的是單步(按住F10)把第一個(gè)64位走完居然能走到第二個(gè)64位,我一生氣,在每個(gè)讀字節(jié)加了很大延時(shí),都不行,不懂,感覺這個(gè)芯片有點(diǎn)什么問題,怎么都遇到這個(gè)問題


出現(xiàn)上述的情況主要還是時(shí)序上面的問題,建議你把三個(gè)讀寫子函數(shù)貼出來看下。


我的硬件是MC9S08,模擬總線訪問flash芯片和ch375芯片,總線頻率20MHz(50ns), MC9S08訪問端口需要5個(gè)總線周期,片選擇信號(hào)在主程序的每個(gè)指令前設(shè)置,整個(gè)命令操作完畢后取消 出現(xiàn)訪問第一個(gè)64字節(jié)可以,但是第二個(gè)就出現(xiàn)不能訪問,或者一直按住F10仿真才能運(yùn)行

void usb_send_cmd(uint8_t cmd) { USB_PORT_A0 = 1; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_OUT; USB_PORT_DATA = cmd; USB_PORT_WR = 0; USB_PORT_WR = 1; } void usb_send_data(uint8_t dat) { USB_PORT_A0 = 0; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_OUT; USB_PORT_DATA = dat; USB_PORT_WR = 0; delay_05us(2); USB_PORT_WR = 1; delay_05us(2); } uint8_t usb_rev_data(void) { uint8_t dat; USB_PORT_A0 = 0; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_IN; USB_PORT_RE = 0; delay_05us(2); dat = USB_PORT_DATA; USB_PORT_RE = 1; return dat; }

這是我看了本帖的修改的,在主程序中,將所有有關(guān)CS的語句全部去掉,但是好像問題更嚴(yán)重,CMD_CHECK_EXIST都不能得到正確返回值,

void usb_send_cmd(uint8_t cmd) { delay_05us(3); USB_PORT_DATA = cmd; USB_PORT_A0 = 1; // 選擇CH375的命令口 USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_OUT; //對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 //CH375_RD = 1; // 如果I/O默認(rèn)電平是高電平,那么這是可選操作 USB_PORT_CS = 0; USB_PORT_WR = 0; //CH375_CS = 0; // 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 USB_PORT_WR = 1; USB_PORT_CS = 1; USB_PORT_A0 = 0; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_IN; // 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 //CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 delay_05us(3); } void usb_send_data(uint8_t dat) { USB_PORT_DATA = dat; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_OUT; //對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 USB_PORT_CS = 0; USB_PORT_WR = 0; // CH375_CS = 0; 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 USB_PORT_WR = 1; USB_PORT_CS = 1; USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_IN; // 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 //CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 delay_05us(1); // 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) } uint8_t usb_rev_data(void) { uint8_t dat; // 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) delay_05us(1); // 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) USB_PORT_DATA_DIR = USB_PORT_DATA_DIR_IN; // 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 //CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 USB_PORT_CS = 0; USB_PORT_RE = 0; // CH375_CS = 0; 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_RD產(chǎn)生寬度至少為80nS的低電平脈沖 dat = USB_PORT_DATA; USB_PORT_RE = 1; USB_PORT_CS = 1; // USB_PORT_DATA = 0xFF; 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 return(dat); }


unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ 為什么是 0xBDF1和 0xBCF0 呢?

還有資料里有這樣一段話: U4(單片機(jī)89C51 等)用于測試CH372 的USB 數(shù)據(jù)通訊功能,本例中CH372 的地址A0 由U4 的 P20 驅(qū)動(dòng),CH372 的片選線CS#由U4 的P21 驅(qū)動(dòng),所以CH372 的命令口的地址可以是FDXXH(例子程 序中使用地址BDF1H),數(shù)據(jù)口的地址可以是FCXXH(例子程序中使用地址BCF0H)

只看見資料上說跟硬件電路有關(guān),到底是怎么得來這個(gè)數(shù)的呢?

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); } 上面這個(gè)函數(shù)是向命令端寫入命令,CH372資料上面寫的是A0=0的時(shí)候才能寫命令,為什么這個(gè)函數(shù)不需要,而且沒有遵守資料上所說的時(shí)序。 如果是那樣的話,單片機(jī)為什么要跟 #CS #WR #RD 連接,連接了之后程序根本就沒對(duì)這幾個(gè)引腳操作,連接起來干嘛的?以上兩個(gè)問題誰能回答我!


至于地址怎么定義的,你可以參考一下51MCU的總線部分,其實(shí)就是一個(gè)XRAM的地址。 您需要查一下相關(guān)教材,這是標(biāo)準(zhǔn)做法。


第一遍能讀數(shù)據(jù)長度成功,不過不是64而是0x24,不知道為什么,讀完這0x24字節(jié)數(shù)據(jù)后,進(jìn)入第二遍 第一個(gè)if 就返回了,錯(cuò)誤碼是1F,為什么呢????

while(cnt--) { if(xWaitInterrupt() != USB_INT_DISK_READ)break; //等待就緒 出錯(cuò)跳出 xWriteCH375Cmd(CMD_RD_USB_DATA); //發(fā)讀數(shù)據(jù)命令 temp = xReadCH375Data(); //讀數(shù)據(jù)長度 while(temp--)*buffer++ = xReadCH375Data(); //依次讀出數(shù)據(jù) SysTickDelay(10); xWriteCH375Cmd(CMD_DISK_RD_GO); //發(fā)繼續(xù)命令 }


返回0x1f說明存儲(chǔ)器操作失敗,前面的初始化操作是否都已經(jīng)成功?特別是DISK_READY命令


write_command(CMD_CHECK_EXIST); /* 1. 測試工作狀態(tài)是否正常? */ write_data(0x5a); /* 測試數(shù)據(jù) */ c = read_data(); for(j=0;j<100;j++) /* 延時(shí)等待U盤進(jìn)入正常工作狀態(tài) */ for(i=0; i<10000; i++); for(j=0;j<100;j++) for(i=0; i<10000; i++); 這里為什么延延時(shí)???


dddddddd?。。⌒率謭?bào)道?。《嘀С諿Emot]12[/Emot][Emot]27[/Emot]


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

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