请问谁有这方面的经验能分享下~
如果单片机与CH375是串口连接,主要是把原来并口的读写子程序用串口方式来写,其他基本类似,可以参考下面的子程序: void CH375_PORT_INIT( ) { SCON = 0xD0; // 设置串口为9位数据 PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; // 24MHz晶振, 9600bps TR1 = 1; TI = 1; // RI = 0; //设置波特率和其它串口参数 }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); }
发命令还是数据是通过TB8位来辨别的吗? unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */ 就可以不用了是吧
TB8是数据的第9位,为1时前8位被作为命令码写入CH375芯片中,为0时前8位的数据被写入CH375芯片中。 下面两个并口地址不需要了去掉就行。
void CH375_PORT_INT() //1200bps@18.432MHz { S2CON = 0xd0; //9位数据,可变波特率 BRT = -(FOSC/32/BAUD); //设定独立波特率发生器重装值 AUXR &= 0xfb; //独立波特率发生器时钟为Fosc/12,即12T AUXR |= 0x10; //启动独立波特率发生器 S2CON |=0x02; //S2TI=1 IE2=0x01; EA=1; } void CH375_Write_Cmd(uchar cmd) { S2CON &=0xfd; //S2TI=0 S2CON |=0x08; //S2TB8 = 1; S2BUF = cmd; while (!(S2CON & S2TI)); S2CON&=~S2TI; //S2TI=0; }
void CH375_Write_Dat(uchar dat) { S2CON &=0xfd; //S2TI=0 S2CON &=0xf7; // S2TB8 = 0; S2BUF = dat; while ( S2TI == 0 ); }
uchar CH375_Read_Dat() { while (!(S2CON&S2RI)); S2CON&=~S2RI; // S2RI = 0; return( S2BUF ); }
void Uart2() interrupt 8 using 1 { if(S2CON&S2RI) { S2CON&=~S2RI; //清除S2RI位 } if(S2CON&S2TI) { S2CON&=~S2TI; //清除S2TI位 } } uchar CH375_Wait_Init()//等待中断信号,回复高电平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } void main() { CH375_PORT_INT(); CH375_InitDisk(); while(1); }
uchar CH375_InitDisk() { uchar status; UART_Send_Str("初始化U盘:\n"); UART_Send_Str("请插入U盘\n"); status=CH375_Wait_Init(); //等待U盘插入时产生中断,INT回复高电平 if(status==USB_INT_CONNECT) //如果状态码表明U盘已连接 { UART_Send_Str("U盘已插入\n"); } else { UART_Send_Str("U盘插入错误\n"); } CH375_Write_Cmd(CMD_DISK_INIT); status=CH375_Wait_Init(); if(status!=USB_INT_SUCCESS) { UART_Send_Str("U盘初始化失败\n"); return(status); } UART_Send_Str("初始化U盘成功n"); UART_Send_Str("\n"); return(0); //U盘已经成功初始化 } 麻烦帮我看看,我用串口2来驱动CH375却不能实现初始化,看看我哪里配置的不对?
在检测U盘连接之前需要设置模式,另外在设置模式之前你可以做一下测试命令确保串口通讯没有问题。
您好,我的串口配置好了,U盘模式也设置了,还是不能初始化CH375,下面这个函数没有执行。 uchar CH375_Wait_Init()//等待中断信号,回复高电平 { INT=1; while(INT); CH375_Write_Send(CMD_GET_STATUS); return CH375_Read_Dat(); } 这里CMD_GET_STATUS怎么处理? 因为在ch375hf4.h头文件中如果如果把 unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */ 去掉的话,
while ( CH375_CMD_PORT & 0x80 ); /* 查询CH375B的命令端口的位7为1说明中断引脚输出高电平则等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作无意义,用于至少延时2uS */ CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */ 应该怎么处理呢?麻烦你了,我很困惑!
你中断那块配置有点问题,CMD_GET_STATUS是产生中断的时候获取中断状态的命令。你可以先检查一下INT引脚插上U盘有没有低电平产生?然后用单片机的IO口来检测即可。
您好,查出来,确实是INT引脚在插上U盘之后没有低电平产生。重新修改了中断处理,麻烦您帮忙分析下~ void CH375_PORT_INT() //1200bps@18.432MHz { S2CON = 0xd0; //9位数据,可变波特率 BRT = -(FOSC/32/BAUD); //设定独立波特率发生器重装值 AUXR = 0x14; //独立波特率发生器时钟为Fosc/12,即12T IE2=0x01; EA=1; } void CH375_Write_Cmd(uchar cmd) { while(busy); ACC = cmd; S2CON |=S2TB8; busy=1; S2BUF = ACC; } void Uart2() interrupt 8 using 1 { if(S2CON&S2RI) { S2CON&=~S2RI; //清除S2RI位 } if(S2CON&S2TI) { S2CON&=~S2TI; //清除S2TI位 busy = 0; } } void CH375_Write_Dat(uchar dat) { while(busy); ACC = dat; S2CON &=~S2TB8; busy = 1; S2BUF = ACC; } uchar CH375_Read_Dat() { while (!(S2CON&S2RI)); S2CON&=~S2RI; // S2RI = 0; return( S2BUF ); } uchar CH375_Wait_Init()//等待中断信号,回复高电平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } //U盘初始化 uchar CH375_InitDisk() { uchar status; // RESULT = CH375LibInit( ); //初始化CH375程序库和CH375芯片,操作成功返回0 status=CH375_Wait_Init(); //等待U盘插入时产生中断,INT回复高电平 if(status==USB_INT_CONNECT) //如果状态码表明U盘已连接 { UART_Send_Str("U盘已插入\n"); } else { UART_Send_Str("U盘插入错误\n"); } CH375_Write_Cmd(CMD_DISK_INIT); status=CH375_Wait_Init(); } void main() { CH375_PORT_INT(); do { CH375_Write_Cmd(CMD_SET_USB_MODE);//U盘配置 CH375_Write_Cmd(6); CH375_InitDisk();//U盘初始化 } }
正常的话,你设置模式成功,我们CH375芯片的INT引脚会在插上U盘的时候拉低。这样的话与你后面的检测中断函数无关,需要你检测一下我们芯片有没有正常工作?复位有没有完成?设置模式是否成功(返回0x51)? 另一种情况,如果你产生了低电平,检测U盘连接不能通过的话,肯定是你的中断检测函数有问题。
检查了复位部分,进行了RSTI=0;处理后, 发现插上U盘后,INT有低电平输出,ACT指示灯也亮了,但是RESULT = CH375LibInit( ); 返回的值是0x81, #define ERR_CH375_ERROR 0x81 /* CH375硬件错误,可能需要复位CH375 */ 请问这个怎么判定哪里有问题呢?
单片机上电之后需要加50MS以上的延时之后在初始化芯片,或者调用CH375LibInit();函数。在调用之前可以发送0X06命令测试下硬件。
上电后加了延时,然后调用CH375LibInit();函数。有个现象是,我如果不调用CH375LibInit();调用初始化芯片函数,执行下面这个函数时,程序会卡死!应该还是初始化失败了! uchar CH375_Wait_Init()//等待中断信号,回复高电平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } 求高手 有没有别的可能性帮忙分析下~
补充上述:也即返回来的是0x5f,不是0x51, #define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */ #define CMD_RET_ABORT 0x5F /* 命令操作失败 */ 请问这个是硬件问题,还是程序的故障呢?
你应该测试命令(0x06)都没有通过,这一般都是硬件问题。你可以直接用电脑的串口调试助手软件调试一下,如果不行说明硬件有问题。
现在测试通过了,设置了波特率 CH375_Write_Cmd(CMD_SET_BAUDRATE); 之后,返回值为0x51;