有關(guān)CH372或CH375的USB通訊的問題解答

版主 你好,在這里請教一個問題: 目前的設(shè)計需求是這樣:做一個單片機數(shù)據(jù)采集系統(tǒng),一方面將數(shù)據(jù)以文件的形式存入SD卡內(nèi),另一方面將將數(shù)據(jù)與PC機進行USB通訊,PC上做一個上位機程序?qū)?shù)據(jù)進行顯示,目前我的設(shè)計方案是采用一個CH376模塊一方面用HOST模式對SD卡讀寫,一方面來用DEVICE模式來與PC通訊,不知道此方案是否可行?或者還有一些更好的建議嗎? 謝謝。。。


CH376在做主機和做設(shè)備的時候,是不允許同時使用的,和計算機通信的時候不允許操作SD卡,操作SD卡的時候不允許和計算機通信。


`我用at89s52和ch375與pc機通行,單片機燒的是text.c程序(接口經(jīng)過修改),pc機運行的是ch372dbg.exe,可以正確的上傳和下傳數(shù)據(jù),可是當pc機運行text.exe程序時老是出現(xiàn)長度錯誤,請問這是什么原因?是硬件的問題嗎?應(yīng)該如何修改!謝謝,不勝感激!

郵箱:個人信息保護,已隱藏


text.exe 要求下位機把接受到的數(shù)據(jù)取反,然后回傳!


這個我試過了,還是不行。在ch375dbg.exe上可以看到上傳的反碼。text.exe的原程序一定要在vc5.0或6.0上才能調(diào)試嗎,其他的可不可以,比如說win-tc等比較原始的平臺。

在線等待,謝謝!


win-tc不支持WIN32吧!最好是用VC6.0!


測試通過了! 想用c#開發(fā)一個應(yīng)用程序,不知道有沒有可參考的程序?


誰能提供ch375現(xiàn)成的當設(shè)備用的電路圖及單片機端程序,小弟遇到點問題,想?yún)⒖家幌拢萃辛?/p>


例子你可以去參考CH372EVT.ZIP里面的程序,原理圖建議你去看下CH372DS1,里面有例子程序。


有沒有C#的例子程序可供參考??!


新來的,最近要用到這個芯片,來學(xué)習(xí)一下,請各位高手多多幫助啊,謝謝啦


請教CH374和PC機的通訊問題: 1) 數(shù)據(jù)塊上傳。如果數(shù)據(jù)塊長度取64,上傳一個數(shù)據(jù)塊需要2毫秒;如果把數(shù)據(jù)長度改為63,則傳一個數(shù)據(jù)快 是1毫秒。正常長度應(yīng)該是64吧? 2) 上傳速度太低。采用直接上傳模式時,每毫秒只能上傳一個數(shù)據(jù)塊,上傳速度為64K/S,后改為內(nèi)部緩沖上傳模式(程序如下所述),mDEFAULT_BUFFER_LEN=0x1000。但上傳速度還是不變,最高為64.5K/S.據(jù)資料介紹理想情況下速度可達到500K/S. 不知問題出在哪,請指教。

1.單片機程序使用 \ CH374 \ PUB\EXAM \ DEVICE \ DEVICE.C void USB_DeviceInterrupt( void ) // USB設(shè)備中斷服務(wù)程序 { 。。。。。。 else if ( s & BIT_IF_TRANSFER ) { // USB傳輸完成 s = Read374Byte( REG_USB_STATUS ); switch( s & BIT_STAT_PID_ENDP ) { // USB設(shè)備中斷狀態(tài) 0x0F case USB_INT_EP2_OUT: // 批量端點下傳成功 { UINT8 buf[64]; if ( s & BIT_STAT_TOG_MATCH ) { // 僅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 數(shù)據(jù)取反由計算機驗證 for(s=0;s<64;s++) { upstream[s]=s; } Write374Byte (REG_USB_ENDP2,M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); } break; } case USB_INT_EP2_IN: // 批量端點上傳成功,未處理 { //本段程序用時34微秒 M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_TRAN_TOG ); tranCtl=1; break; } 。。。。。。 }

void main(void) { 。。。。。。 for(;;) { if(tranCtl==1) { //向CH374寫數(shù)據(jù)耗時330微秒 Write374Block( RAM_ENDP2_TRAN, 63, upstream ); Write374Byte( REG_USB_LENGTH, 63 ); tranCtl=0; } if(USBint==0) { USB_DeviceInterrupt( ); } } }

2、計算機程序使用 \ DEBUG372 \ PC \ CH372UpDown.dsp void CCH372UpDownDlg::OnButton2Up() //端點2上傳 { CWinThread * mTrdUp2 = NULL; UpdateData(TRUE); if(!m_open){ MessageBox("請先打開設(shè)備!","DEBUG372",MB_OK|MB_ICONSTOP); return; } if(T2UHandle == INVALID_HANDLE_VALUE) { UCHAR DeviceName[128]; memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName)); T2UHandle = CreateFile( (char *)&DeviceName[0], GENERIC_READ | ERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // 打開設(shè)備 if(T2UHandle == INVALID_HANDLE_VALUE) { MessageBox("無法打開設(shè)備!","DEBUG372",MB_OK|MB_ICONSTOP); return; } } if(m_uplen2 > mCH375_PACKET_LENGTH*8 ) { MessageBox("上傳長度無效!","DEBUG372",MB_OK); return; } Sleep(10); CH375SetBufUpload(0,1); // 設(shè)定內(nèi)部緩沖上傳模式 UpdateData(FALSE); }

每隔15mS讀一次數(shù)據(jù): void CCH372UpDownDlg::OnTimer(UINT nIDEvent) { UCHAR mBuf[9800]; static int UpCount2,second0,timec=0; CTime theTime; timec++; int pakage=CH375QueryBufUpload(0); if(pakage>0) { ULONG dlen=pakage*64; if(CH375ReadData((ULONG)T2UHandle,&mBuf[0],&dlen)) { theTime = CTime::GetCurrentTime(); UpCount2=UpCount2+dlen; int second=theTime.GetSecond( ); if(second!=second0) { second0=second; char tem[50]=""; memset(&tem,0,sizeof(tem)); sprintf(tem,"Sp: %d /s",UpCount2); ::SetDlgItemText(m_hWnd,IDC_SPEED,tem); UpCount2=0; timec=0; } } } }


1、USB傳輸以幀為單位,一個幀的時長為1mS,對于批量傳輸,一幀中可以傳輸多個數(shù)據(jù)包 2、CH374的端點2緩沖區(qū)是64B,想達到最快速度,每次必須傳輸以滿包64B傳輸 3、速度與單片機的主頻,數(shù)據(jù)處理復(fù)雜度有關(guān),測速度的話,下載CH372EVT.ZIP,下位機參參考\BULK\MCU_C51,上位機直接用\BULK\WIN\BULKTEST.EXE 4、你的這段下位機程序流程有錯誤,數(shù)據(jù)是在主程序中上傳的話,那么 case USB_INT_EP2_IN: // 批量端點上傳成功,未處理 { Write374Byte( REG_USB_ENDP2,M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ^ BIT_EP2_TRAN_TOG ); tranCtl=1; break; } 而主程序中向374寫入數(shù)據(jù)塊后增加: Write374Byte( REG_USB_ENDP2,M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) );


請教CH375和AVR單片機通信的問題! 我用的CH375的主機方式,用并口和單片機連接,然后編了一個串口程序來檢測CH375的狀態(tài),并把數(shù)據(jù)返回PC機。用CMD_CHECK_EXIST命令來檢測,結(jié)果串口調(diào)試助手返回的數(shù)據(jù)一直是0xFF,375的時鐘,復(fù)位等都檢查了沒問題,請教一下是什么原因。下面是我編的程序: #include #include #include #include "CH375INC.H"

void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); } /*外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令,*/ void xWriteCH375Cmd(unsigned char mCmd) { PORTC|=0X02;/*PC1置高*/ delay2us( );/*至少延時1us*/ PORTC&=0XFD;/*PC1置低*/ PORTC|=0x01;/*A0=1*/ PORTB=mCmd;/*向CH375的并口輸出數(shù)據(jù)*/ DDRB=0xFF;/*并口D0-D7輸出*/ PORTD|=0x80;/*同上,RD=1*/ PORTC&=0xFB;/*輸出有效寫控制信號,CS=0*/ //PORTC|=0X01;/*A0=1*/ PORTD&=0XBF;/*WR=0*/ DDRB=0xFF;/*該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100ns*/ PORTD|=0xC0;/*同上,WR=1,RD=1*/ PORTC|=0x05;/*輸出無效的控制信號,完成操作CH375芯片,A0=1,CS=1*/ DDRB=0x00;/*禁止數(shù)據(jù)輸出*/ delay2us( );/*至少延時2US*/ }

/*外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù)*/ void xWriteCH375Data(unsigned char mData) { PORTC&=0xFE;/*A0=0*/ PORTB=mData;/*向CH375的并口輸出數(shù)據(jù)*/ DDRB=0xFF;/*并口D0-D7輸出*/ PORTD|=0x80;/*同上,RD=1*/ PORTC&=0xFA;/*輸出有效寫控制信號,寫CH375芯片的數(shù)據(jù)端口,A0=0,CS=0*/ PORTD&=0XBF;/*WR=0*/ DDRB=0xFF;/*該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100ns*/ PORTD|=0xC0;/*同上,WR=1,RD=1*/ PORTC|=0x04;/*輸出無效的控制信號,完成操作CH375芯片,CS=1*/ //PORTC&=0XFE;/*A0=0*/ DDRB=0x00;/*禁止數(shù)據(jù)輸出*/ delay2us( );/*至少延時2us*/ }

/*外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù),*/ unsigned char xReadCH375Data(void) { unsigned char mData; delay2us( );/*至少延時1.2us*/ DDRB=0x00;/*數(shù)據(jù)輸入*/ PORTD|=0X40;/*WR=1*/ PORTC&=0xFA;/*輸出有效讀控制信號,讀CH375的數(shù)據(jù)端口,A0=0,CS=0*/ PORTD&=0x7F;/*同上,RD=0*/ DDRB=0x00;/*該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100ns*/ mData=PINB;/*從CH375的并口PB輸入數(shù)據(jù)*/ //PORTC&=0xFE;/*A0=0*/ PORTD|=0xC0;/*WR=1,RD=1*/ PORTC|=0X04;/*CS=1*/ return(mData); }

//單片機串口初始化 void USART_Init(void) { UCSRA=0x02;/*倍速*/ UCSRB=0x18;/*允許接收和發(fā)送*/ UCSRC=0x86;/*8位數(shù)據(jù)*/ UBRRH=0x00; UBRRL=0x08;/*設(shè)置波特率,115.2K*/ }

void USART_Transmit( unsigned char data ) { /* 等待發(fā)送緩沖器為空 */ while ( !( UCSRA & (1</* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */ UDR = data; }

unsigned char USART_Receive( void ) { /* 等待接收數(shù)據(jù)*/ while ( !(UCSRA & (1</* 從緩沖器中獲取并返回數(shù)據(jù)*/ return UDR; }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { unsigned char i, k; //unsigned char RD_Data;

DDRB=0x00; /* 設(shè)置8位并口為輸入 */ DDRC=0x07; /*設(shè)置CS、A0為輸出*/ DDRD=0xC0; /* 設(shè)置WR,RD為輸出,設(shè)置INT#為輸入 */ PORTC|=0x04; /* 設(shè)置CS默認為高電平 */ PORTD|=0xE0; /*設(shè)置WR,RD,INT默認為高電平*/ }

/*利用PC機串口來檢測CH375是否正常工作*/ void CH375_TEST( ) { unsigned char temp; unsigned char RD_Data; DDRD=0x02;/*TXD,RXD引腳PD1,PD2分別置為輸出和輸入,*/ while(1) { /*等待接收數(shù)據(jù)*/ temp=USART_Receive(); /*把接收到的數(shù)據(jù)寫到CH375里面*/ xWriteCH375Cmd( CMD_CHECK_EXIST ); xWriteCH375Data(temp); /*從CH375讀數(shù)據(jù)*/ temp=~temp; RD_Data=xReadCH375Data(); /*發(fā)送接收到得數(shù)據(jù)*/ USART_Transmit(RD_Data); } }

main( ) { delay2us( ); CH375_PORT_INIT( ); USART_Init( ); CH375_TEST( ); }


1、接口程序?qū)懙挠悬c亂,參考下面的寫,不要隨意增加額外的代碼 /* 單片機的引腳 CH375芯片的引腳 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) D7-D0 */

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { DDRA = 0x00; /* 設(shè)置8位并口為輸入 */ PORTB = 0x07; /* 設(shè)置CS,WR,RD默認為高電平 */ DDRB = 0x0F; /* 設(shè)置CS,WR,RD,A0為輸出,設(shè)置INT#為輸入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) { PORTB |= 0x08; /* 輸出A0=1 */ PORTA = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF9; /* 輸出有效寫控制信號, CS=0; WR=0 */ DDRA = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于60nS */ PORTB |= 0x07; /* 輸出無效的控制信號, CS=1; WR=1; */ DDRA = 0x00; /* 禁止數(shù)據(jù)輸出 */ PORTB &= 0xF7; /* 輸出A0=0; 可選操作 */ mDelay2uS( ); /* 至少延時1.5uS */ }

void xWriteCH375Data( UINT8 mData ) { PORTA = mData; /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF1; /* 輸出有效寫控制信號, CS=0; WR=0; */ DDRA = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于60nS */ PORTB |= 0x07; /* 輸出無效的控制信號, CS=1; WR=1; */ DDRA = 0x00; /* 禁止數(shù)據(jù)輸出 */ mDelay1uS( ); /* 至少延時0.6uS */ }

UINT8 xReadCH375Data( void ) { UINT8 mData;

mDelay1uS( ); /* 至少延時0.6uS */ DDRA = 0x00; /* 數(shù)據(jù)輸入 */ PORTB &= 0xF2; /* 輸出有效讀控制信號, CS=0; RD=0; */ DDRA = 0x00; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于60nS */ mData = PINA; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTB |= 0x07; /* 輸出無效的控制信號, CS=1; RD=1; */ return( mData ); } 2、單片機上電后,需要延時100mS,等375復(fù)位完成后才能操作 3、測試命令的過程繁瑣了,直接寫入常數(shù)測試,把結(jié)果從串口輸出 xWriteCH375Cmd( CMD_CHECK_EXIST ); xWriteCH375Data( 0x55 ); dat = xReadCH375Data(); 把dat從串口發(fā)出去


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

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