下面是STM32控制CH375的CH375并口读写时序的程序: void CH375_PORT_INIT(void) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0X00000000; GPIOA->CRL|=0X00077774; //设置INT#为浮空输入,CS,WR,RD,A0为开漏输出,速度为50MHZ GPIOA->ODR|=0X0000001C; //设置CS,WR,RD默认为高电平 GPIOA->CRH&=0X00000000; GPIOA->CRH|=0X44444444; //设置8位并口为浮空输入 RCC->APB2ENR|=1<<3; //使能PORTB时钟 GPIOB->CRL&=0X00000000; GPIOB->CRL|=0X00077774; //设置INT#为浮空输入,CS,WR,RD,A0为开漏输出,速度为50MHZ GPIOB->ODR|=0X0000001C; //设置CS,WR,RD默认为高电平 GPIOB->CRH&=0X00000000; GPIOB->CRH|=0X44444444; //设置8位并口为浮空输入 }
void xWriteCH375Cmd( u8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { if(Change_Bit==0x01) { mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ GPIOA->CRH|=0X77777777; //设置8位并口为开漏输出 GPIOA->ODR&=0X00FF; GPIOA->ODR|=(u16)mCmd << 8 ; // 向CH375的并口输出数据 GPIOA->CRL|=0X00077770; // 写操作所以数据输出, 设置CS,WR,RD,A0为输出 /* 输出有效写控制信号, 写CH375芯片的命令端口 */ PAout(1)=1; // A0=1 PAout(2)=0; // CS=0 PAout(3)=0; // WR==0 PAout(4)=1; // RD=1 PAout(4)=1;PAout(4)=1;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /* 输出无效的控制信号, 完成操作CH375芯片*/ PAout(2)=1; // CS=1 PAout(3)=1; // WR=1 PAout(4)=1; // RD=1 PAout(1)=0; // A0=0 GPIOA->CRH&=0X00000000; // 禁止数据输出 GPIOA->CRH|=0X44444444; mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时2uS } if(Change_Bit==0x02) { mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ GPIOB->CRH|=0X77777777; //设置8位并口为开漏输出 GPIOB->ODR&=0X00FF; GPIOB->ODR|=(u16)mCmd << 8 ; // 向CH375的并口输出数据 GPIOB->CRL|=0X00077770; // 写操作所以数据输出, 设置CS,WR,RD,A0为输出 /* 输出有效写控制信号, 写CH375芯片的命令端口 */ PBout(1)=1; // A0=1 PBout(2)=0; // CS=0 PBout(3)=0; // WR==0 PBout(4)=1; // RD=1 PBout(4)=1;PBout(4)=1;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /* 输出无效的控制信号, 完成操作CH375芯片*/ PBout(2)=1; // CS=1 PBout(3)=1; // WR=1 PBout(4)=1; // RD=1 PBout(1)=0; // A0=0 GPIOB->CRH&=0X00000000; // 禁止数据输出 GPIOB->CRH|=0X44444444; mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时2uS } }
void xWriteCH375Data( u8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { if(Change_Bit==0x01) { GPIOA->CRH|=0X77777777; //设置8位并口为开漏输出 GPIOA->ODR&=0X00FF; GPIOA->ODR|=(u16)mData << 8 ; // 向CH375的并口输出数据 GPIOA->CRL|=0X00077770; // 写操作所以数据输出, 设置CS,WR,RD,A0为输出 /* 向CH375的并口输出数据 */ PAout(1)=0; // A0=0 PAout(2)=0; // CS=0 PAout(3)=0; // WR=0 PAout(4)=1; // RD=1 PAout(4)=1;PAout(4)=1;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /* 输出无效的控制信号, 完成操作CH375芯片*/ PAout(2)=1; // CS=1 PAout(3)=1; // WR=1 PAout(4)=1; // RD=1 PAout(1)=0; // A0=0 GPIOA->CRH&=0X00000000; // 禁止数据输出 GPIOA->CRH|=0X44444444; mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时2uS } if(Change_Bit==0x02) { GPIOB->CRH|=0X77777777; //设置8位并口为开漏输出 GPIOB->ODR&=0X00FF; GPIOB->ODR|=(u16)mData << 8 ; // 向CH375的并口输出数据 GPIOB->CRL|=0X00077770; // 写操作所以数据输出, 设置CS,WR,RD,A0为输出 /* 向CH375的并口输出数据 */ PBout(1)=0; // A0=0 PBout(2)=0; // CS=0 PBout(3)=0; // WR=0 PBout(4)=1; // RD=1 PBout(4)=1;PBout(4)=1;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /* 输出无效的控制信号, 完成操作CH375芯片*/ PBout(2)=1; // CS=1 PBout(3)=1; // WR=1 PBout(4)=1; // RD=1 PBout(1)=0; // A0=0 GPIOB->CRH&=0X00000000; // 禁止数据输出 GPIOB->CRH|=0X44444444; mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时2uS } }
u8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { u8 mData; if(Change_Bit==0x01) { mDelay1_2uS( ); /* 至少延时1.2uS */ GPIOA->CRH&=0X00000000; GPIOA->CRH|=0X44444444; //设置8位并口为浮空输入 /* 输出有效读控制信号, 读CH375芯片的数据端口*/ PAout(1)=0; // A0=0 PAout(2)=0; // CS=0 PAout(3)=1; // WR=1 PAout(4)=0; // RD=0 mData = (u8)( GPIOA->IDR>> 8 ); //从CH375的并口PA.15-PA.8输入数据 PAout(4)=0;PAout(4)=0;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /*输出无效的控制信号, 完成操作CH375芯片 */ PAout(1)=0; // A0=0 PAout(2)=1; // CS=1 PAout(3)=1; // WR=1 PAout(4)=1; // RD=1 return( mData ); } if(Change_Bit==0x02) { mDelay1_2uS( ); /* 至少延时1.2uS */ GPIOB->CRH&=0X00000000; GPIOB->CRH|=0X44444444; //设置8位并口为浮空输入 /* 输出有效读控制信号, 读CH375芯片的数据端口*/ PBout(1)=0; // A0=0 PBout(2)=0; // CS=0 PBout(3)=1; // WR=1 PBout(4)=0; // RD=0 mData = (u8)( GPIOA->IDR>> 8 ); //从CH375的并口PB.15-PB.8输入数据 PBout(4)=0;PBout(4)=0;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns /*输出无效的控制信号, 完成操作CH375芯片 */ PBout(1)=0; // A0=0 PBout(2)=1; // CS=1 PBout(3)=1; // WR=1 PBout(4)=1; // RD=1 return( mData ); } return( mData ); } 1、PAout(4)=1;PAout(4)=1;//此操作无意义,仅作延时,CH375要求读写脉冲宽度大于100ns 我用这条语句做延时语句可不可以,达得到脉冲宽度大于100ns的要求吗? 2、编译的时候出现这个错误: STM32CH375.axf: Error: L6218E: Undefined symbol xReadCH375Cmd (referred from main.o).这是什么意思? 而再在程序里定义好 u8 xReadCH375Cmd( void ) { u8 i; return i; } 编译的时候才不出现bug,这是为什么? 3、以上我附的CH375并口读写时序的程序还存在什么问题,请帮我指出错误。 最后附上真挚的感谢,谢谢!