我是用的STC89S516RD+单片机和CH375芯片。根据网上视频写的代码,我刚开始学USB,把优盘当做普通的外部存储器来操作的。我现在的问题是,我在main()中没有让其while循环,但我在串口接收时,程序一直在i=CH375LibInit( ); 指令之前循环接收显示“通信实验室”我如果去掉i=CH375LibInit( ); 则可以执行到CH375_InitDisk();指令内部,接收到“初始化U盘:” “请插入U盘:” “U盘已插入:” “U盘初始化成功” 然后就再次从头开始接收 “通信实验室” “初始化U盘:” “请插入U盘:” “U盘已插入:” “U盘初始化成功”。。。。 我如果再把初始化指令CH375_InitDisk();去掉,那接收的还可以多一点“Ready ?” 以此循环执行。但我程序中根本没有让其循环,我下载其他你们给的例程EXAM7,模拟I/O口例程是没有问题的,但我不知道我的程序错在哪里了,网上的视频讲解是可以正常工作的。 我这程序生成的代码也不多呀?为什么总是循环开始执行,还不能执行到最后就返回重新开始?
#include #include #include #include"CH375HFC.h" #define uchar unsigned char #define uint unsigned int uchar rxdata3[]="通信实验很成功 A2022-21-12 07:25 34.5% 5789ppm B"; uchar xdata buf[];
//总线方式驱动定义 地址 #define CH375_CMD_PORT_ADDR
/*------------------------------------------------- 功能:晶振为11.0592MHz时 1MS延时子程序 -------------------------------------------------*/ sbit CH375_CS=P2^0; //CH375片选信号 低电平有效 sbit CH375_A0=P2^1; //CH375命令/数据选择端 1为命令 0为数据 sbit CH375_INT=P3^2;//CH375的INT#端 在复位完成后为中断请求输出 低电平有效 sbit CH375_WR=P3^6; //CH375写选通端,低电平有效 sbit CH375_RD=P3^7; //CH375读选通端,低电平有效 //延时子程序 void Delay_xMs(unsigned int x) { unsigned int i,j; for( i =0;i < x;i++ ) { for( j =0;j<111;j++ ); _nop_(); _nop_(); _nop_(); } } //串口发送上位机子函数 波特率为9600Bps void Uart_T(uchar *uart) { uchar i=0; while(uart[i]!='\0') { SBUF=uart[i]; while(!TI); TI=0; i++; } Delay_xMs(100); //发送完一组数据后,延时100ms } void Uart_turn(uchar turn) { uchar i=0; SBUF=turn; while(!TI); TI=0; Delay_xMs(100); //发送完一组数据后,延时100ms } //串口通信初始化 void Uart_init() { TMOD=0x20; //T1,方式2 8位自动重装 TH1=0xfd; TL1=0xfd; //波特率9600Hz TR1=1; //启动T1 SM0=0; //串口方式1 8位 SM1=1; REN=1; //允许接收 PCON=0x00; //SMOD=0 } void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口输入 */ } //CH375 的底层写命令驱动函数 void xWriteCH375Cmd( UINT8 mCmd ) { CH375_CS=0; CH375_A0=1; P0=mCmd; CH375_RD=1; CH375_WR=1; _nop_(); CH375_WR=0; _nop_(); _nop_(); CH375_WR=1; CH375_A0=1; CH375_CS=1; } //CH375底层写数据驱动函数 void CH375_Write_Dat(uchar dat) { CH375_CS=0; CH375_A0=0; P0=dat; CH375_RD=1; CH375_WR=1; _nop_(); CH375_WR=0; _nop_(); _nop_(); CH375_WR=1; CH375_A0=1; CH375_CS=1; } //CH375底层读数据驱动函数 uchar CH375_Read_Dat() { uchar dat; CH375_CS=0; CH375_A0=0; CH375_RD=1; CH375_WR=1; P0=0xff; //P0作为输入口,首先要将其置位1 CH375_RD=0; _nop_(); _nop_(); dat=P0; _nop_(); CH375_RD=1; CH375_A0=1; CH375_CS=1; return dat; } /*uchar xReadCH375Cmd() { uchar dat; CH375_CS=0; CH375_A0=1; CH375_RD=1; CH375_WR=1; P0=0xff; //P0作为输入口,首先要将其置位1 CH375_RD=0; _nop_(); _nop_(); dat=P0; _nop_(); CH375_RD=1; CH375_A0=1; CH375_CS=1; return dat; }*/ //CH375底层查询等待CH375中断信号 读取状态码驱动函数 uchar CH375_Wait_Int() { uchar status=0; CH375_INT=1; //初始化单片机的中断查询I/O口,作为输入口 while(CH375_INT==1); //如果为高电平等待,低电平则为产生中断,开始写入读取状态码命令 xWriteCH375Cmd(CMD_GET_STATUS ); //写入读取中断状态码命令 status=CH375_Read_Dat(); return status; //返回读取到的状态码 } //CH375 初始化磁盘 uchar CH375_InitDisk() { uchar status; Uart_T("初始化U盘: \n"); Uart_T("请插入U盘: \n"); status=CH375_Wait_Int();//等待U盘插入产生低电平中断请求 if(status==USB_INT_CONNECT) Uart_T("U盘已插入: \n"); else Uart_T("U盘插入错误: \n"); xWriteCH375Cmd(CMD_DISK_INIT); //写入初始化U盘状态码命令 status=CH375_Wait_Int();//等待U盘插入产生低电平中断请求 并返回中断状态码 if(status!=USB_INT_SUCCESS) //返回初始化成功状态码 { Uart_T("U盘初始化失败 \n"); return status;//返回初始化错误代码 } if(status==USB_INT_SUCCESS) { Uart_T("U盘初始化成功 \n"); //初始化成功 Uart_T(" \n"); return 0; } /* Delay_xMs(100); xWriteCH375Cmd(CMD_DISK_READY); //磁盘准备就绪命令 status=CH375_Wait_Int(); if(status!=USB_INT_SUCCESS) //返回准备成功状态码 { Uart_T("U盘为准备好 \n"); return status;//返回初始化错误代码 } if(status==USB_INT_SUCCESS) { Uart_T("U盘准备就绪 \n"); //磁盘准备成功 Uart_T(" \n"); return 0; }*/
}
//CH375读取扇区子函数 uchar CH375_ReadSector(unsigned long addr,uchar *pBuff)//addr 为扇区32位地址,低字节先送入 *pBuff为扇区读出来的数据缓存区,每个扇区512个字节 { uchar i=0,j; uchar status,len; xWriteCH375Cmd(CMD_DISK_READ);//磁盘读取命令 CH375_Write_Dat(addr); //先写入低字节 CH375_Write_Dat(addr>>8); CH375_Write_Dat(addr>>16); CH375_Write_Dat(addr>>24);//送入32位扇区地址 CH375_Write_Dat(1); //送入读取扇区的个数 for(i=0;i<8;i++) //CH375的扇区数据缓存区为64字节,而每个扇区为512位字节 因此要循环读取8次,读完一个扇区数据 { status=CH375_Wait_Int();//送入地址完成后,会产生中断返回码 Uart_T("开始读取 \n"); Uart_T("\n"); if(status==USB_INT_DISK_READ) //状态码为USB_INT_DISK_REAK 说明磁盘准备完毕,可以写入扇区读写命令 { xWriteCH375Cmd(CMD_RD_USB_DATA);//写入读数据的命令 len=CH375_Read_Dat();//先读到的是数据的长度 for(j=0;j { *pBuff=CH375_Read_Dat(); pBuff++; } xWriteCH375Cmd(CMD_DISK_RD_GO);//写入继续读数据的命令 读取下一64字节的数据缓存 } else { Uart_T("读取发生错误 \n"); return status; //发生读取错误,返回状态码 } } status=CH375_Wait_Int();//读取8次数据后,会产生一次中断返回码 if(status==USB_INT_SUCCESS)//状态码为USB_INT_SUCCESS 说明一个扇区读写成功 { Uart_T("读取扇区成功 \n"); return 0; //发生读取扇区成功,返回0 } else { Uart_T("读取扇区失败 \n"); return status; //发生读取扇区错误,返回1 } } //CH375写数据至扇区子函数 uchar CH375_WriteSector(unsigned long addr,uchar *pBuff)//addr 为扇区32位地址,低字节先送入 *pBuff为扇区读出来的数据缓存区,每个扇区512个字节 { uchar i=0,j; uchar status; xWriteCH375Cmd(CMD_DISK_WRITE);//磁盘读取命令 CH375_Write_Dat(addr); //先写入低字节 CH375_Write_Dat(addr>>8); CH375_Write_Dat(addr>>16); CH375_Write_Dat(addr>>24);//送入32位扇区地址 CH375_Write_Dat(1); //送入读取扇区的个数 for(i=0;i<8;i++) //CH375的扇区数据缓存区为64字节,而每个扇区为512位字节 因此要循环写入8次,写完一个扇区数据 { status=CH375_Wait_Int();//送入地址完成后,会产生中断返回码 Uart_T("开始写入\n"); Uart_T("\n"); if(status==USB_INT_DISK_WRITE) //状态码为USB_INT_DISK_WRITE 说明磁盘准备完毕,可以写入扇区读写命令 { xWriteCH375Cmd(CMD_WR_USB_DATA7);//写入读数据的命令 CH375_Write_Dat(64);//先写入的是数据的长度 for(j=0;j<64;j++) //将随后的数据放入*pBuff数据缓存区内 { CH375_Write_Dat(*pBuff); pBuff++; }
xWriteCH375Cmd(CMD_DISK_WR_GO);//写入继续读数据的命令 读取下一64字节的数据缓存 } else { Uart_T("写入数据发生错误 \n"); Uart_T("写扇区失败 \n"); return status; //发生读取错误,返回状态码 } } status=CH375_Wait_Int();//读取8次数据后,会产生一次中断返回码 if(status==USB_INT_SUCCESS)//状态码为USB_INT_SUCCESS 说明一个扇区读写成功 { Uart_T("写扇区成功 \n"); return 0; //发生读取扇区成功,返回0 } //else if(status!=USB_INT_SUCCESS) { Uart_T("写扇区失败 \n"); return status; //发生读取扇区错误,返回1 } }
void main() { uint i=0; uchar t=0x31; Uart_init(); CH375_PORT_INIT();