請(qǐng)教CH375和AVR單片機(jī)通信的問(wèn)題! 我用的CH375的主機(jī)方式,用并口和單片機(jī)連接,然后編了一個(gè)串口程序來(lái)檢測(cè)CH375的狀態(tài),并把數(shù)據(jù)返回PC機(jī)。用CMD_CHECK_EXIST命令來(lái)檢測(cè),結(jié)果串口調(diào)試助手返回的數(shù)據(jù)一直是0xFF,375的時(shí)鐘,復(fù)位等都檢查了沒問(wèn)題,請(qǐng)教一下是什么原因。下面是我編的程序: #include #include #include #include "CH375INC.H"
void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); } /*外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫命令,*/ void xWriteCH375Cmd(unsigned char mCmd) { PORTC|=0X02;/*PC1置高*/ delay2us( );/*至少延時(shí)1us*/ PORTC&=0XFD;/*PC1置低*/ PORTC|=0x01;/*A0=1*/ PORTB=mCmd;/*向CH375的并口輸出數(shù)據(jù)*/ DDRB=0xFF;/*并口D0-D7輸出*/ PORTD|=0x80;/*同上,RD=1*/ PORTC&=0xFB;/*輸出有效寫控制信號(hào),CS=0*/ //PORTC|=0X01;/*A0=1*/ PORTD&=0XBF;/*WR=0*/ DDRB=0xFF;/*該操作無(wú)意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100ns*/ PORTD|=0xC0;/*同上,WR=1,RD=1*/ PORTC|=0x05;/*輸出無(wú)效的控制信號(hào),完成操作CH375芯片,A0=1,CS=1*/ DDRB=0x00;/*禁止數(shù)據(jù)輸出*/ delay2us( );/*至少延時(shí)2US*/ }
/*外部定義的被CH375程序庫(kù)調(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;/*輸出有效寫控制信號(hào),寫CH375芯片的數(shù)據(jù)端口,A0=0,CS=0*/ PORTD&=0XBF;/*WR=0*/ DDRB=0xFF;/*該操作無(wú)意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100ns*/ PORTD|=0xC0;/*同上,WR=1,RD=1*/ PORTC|=0x04;/*輸出無(wú)效的控制信號(hào),完成操作CH375芯片,CS=1*/ //PORTC&=0XFE;/*A0=0*/ DDRB=0x00;/*禁止數(shù)據(jù)輸出*/ delay2us( );/*至少延時(shí)2us*/ }
/*外部定義的被CH375程序庫(kù)調(diào)用的子程序,從CH375讀數(shù)據(jù),*/ unsigned char xReadCH375Data(void) { unsigned char mData; delay2us( );/*至少延時(shí)1.2us*/ DDRB=0x00;/*數(shù)據(jù)輸入*/ PORTD|=0X40;/*WR=1*/ PORTC&=0xFA;/*輸出有效讀控制信號(hào),讀CH375的數(shù)據(jù)端口,A0=0,CS=0*/ PORTD&=0x7F;/*同上,RD=0*/ DDRB=0x00;/*該操作無(wú)意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100ns*/ mData=PINB;/*從CH375的并口PB輸入數(shù)據(jù)*/ //PORTC&=0xFE;/*A0=0*/ PORTD|=0xC0;/*WR=1,RD=1*/ PORTC|=0X04;/*CS=1*/ return(mData); }
//單片機(jī)串口初始化 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</* 從緩沖器中獲取并返回?cái)?shù)據(jù)*/ return UDR; }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { 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默認(rèn)為高電平 */ PORTD|=0xE0; /*設(shè)置WR,RD,INT默認(rèn)為高電平*/ }
/*利用PC機(jī)串口來(lái)檢測(cè)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( ); }