求助CH375和单片机通讯问题

请教CH375和AVR单片机通信的问题! 我用的CH375的主机方式,用并口和单片机连接,然后编了一个串口程序来检测CH375的状态,并把数据返回PC机。用CMD_CHECK_EXIST命令来检测,结果串口调试助手返回的数据一直是0xFF,375的时钟,复位等都检查了没问题,请教一下是什么原因。下面是我编的程序: #include #include #include #include "CH375INC.H"

void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); } /*外部定义的被CH375程序库调用的子程序,向CH375写命令,*/ void xWriteCH375Cmd(unsigned char mCmd) { PORTC|=0X02;/*PC1置高*/ delay2us( );/*至少延时1us*/ PORTC&=0XFD;/*PC1置低*/ PORTC|=0x01;/*A0=1*/ PORTB=mCmd;/*向CH375的并口输出数据*/ 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;/*禁止数据输出*/ delay2us( );/*至少延时2US*/ }

/*外部定义的被CH375程序库调用的子程序,向CH375写数据*/ void xWriteCH375Data(unsigned char mData) { PORTC&=0xFE;/*A0=0*/ PORTB=mData;/*向CH375的并口输出数据*/ DDRB=0xFF;/*并口D0-D7输出*/ PORTD|=0x80;/*同上,RD=1*/ PORTC&=0xFA;/*输出有效写控制信号,写CH375芯片的数据端口,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;/*禁止数据输出*/ delay2us( );/*至少延时2us*/ }

/*外部定义的被CH375程序库调用的子程序,从CH375读数据,*/ unsigned char xReadCH375Data(void) { unsigned char mData; delay2us( );/*至少延时1.2us*/ DDRB=0x00;/*数据输入*/ PORTD|=0X40;/*WR=1*/ PORTC&=0xFA;/*输出有效读控制信号,读CH375的数据端口,A0=0,CS=0*/ PORTD&=0x7F;/*同上,RD=0*/ DDRB=0x00;/*该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns*/ mData=PINB;/*从CH375的并口PB输入数据*/ //PORTC&=0xFE;/*A0=0*/ PORTD|=0xC0;/*WR=1,RD=1*/ PORTC|=0X04;/*CS=1*/ return(mData); }

//单片机串口初始化 void USART_Init(void) { UCSRA=0x02;/*倍速*/ UCSRB=0x18;/*允许接收和发送*/ UCSRC=0x86;/*8位数据*/ UBRRH=0x00; UBRRL=0x08;/*设置波特率,115.2K*/ }

void USART_Transmit( unsigned char data ) { /* 等待发送缓冲器为空 */ while ( !( UCSRA & (1</* 将数据放入缓冲器,发送数据 */ UDR = data; }

unsigned char USART_Receive( void ) { /* 等待接收数据*/ while ( !(UCSRA & (1</* 从缓冲器中获取并返回数据*/ return UDR; }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { unsigned char i, k; //unsigned char RD_Data;

DDRB=0x00; /* 设置8位并口为输入 */ DDRC=0x07; /*设置CS、A0为输出*/ DDRD=0xC0; /* 设置WR,RD为输出,设置INT#为输入 */ PORTC|=0x04; /* 设置CS默认为高电平 */ PORTD|=0xE0; /*设置WR,RD,INT默认为高电平*/ }

/*利用PC机串口来检测CH375是否正常工作*/ void CH375_TEST( ) { unsigned char temp; unsigned char RD_Data; DDRD=0x02;/*TXD,RXD引脚PD1,PD2分别置为输出和输入,*/ while(1) { /*等待接收数据*/ temp=USART_Receive(); /*把接收到的数据写到CH375里面*/ xWriteCH375Cmd( CMD_CHECK_EXIST ); xWriteCH375Data(temp); /*从CH375读数据*/ temp=~temp; RD_Data=xReadCH375Data(); /*发送接收到得数据*/ USART_Transmit(RD_Data); } }

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

请严格按照下面的时序写:

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P0 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P0 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延时1.2uS */ P0 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P0; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }


只有登录才能回复,可以选择微信账号登录