📄 testusb.c
字号:
#include "C8051F340.h"
#include "intrins.h"
#include <PORTDEFINE.H>
#include <MCU.H>
#include <USB.H>
#include <CH375HF5.H>
unsigned int SecCount;
unsigned int NewSize;
unsigned char xdata USB_data_buff[512];
bit USB_connect;
bit USB_disconnect;
void xDelay100uS(void) //延时100uS
{
Delayus(100);
}
void xDelayAfterWrite(void) //写操作后延时
{
Delayus(200); //延时200uS左右
}
void xQueryInterrupt(void) //查询中断状态,等待硬件中断
{
while(CH375IntStatus==0);
//子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回
}
void INT0(void) interrupt INTERRUPT_INT0
{
xWriteCH375Cmd(CMD_GET_STATUS); //获取中断状态并取消中断请求
CH375IntStatus=xReadCH375Data(); //获取中断状态
if(CH375IntStatus==USB_INT_DISCONNECT)
CH375DiskStatus = DISK_DISCONNECT; //检测到USB设备断开事件
else if(CH375IntStatus==USB_INT_CONNECT)
{
CH375DiskStatus = DISK_CONNECT; //检测到USB设备连接事件
USB_connect=1;
}
}
//将程序空间的字符串复制到内部RAM中,返回字符串长度
unsigned char mCopyCodeStringToIRAM(UINT8 idata *iDestination, UINT8 code *iSource)
{
UINT8 i = 0;
while(*iDestination = *iSource)
{
iDestination ++;
iSource ++;
i ++;
}
return(i);
}
unsigned char SafeRemoveDisk(void)
{
unsigned char i;
for(i=0;i<10;i++) //有的U盘总是返回未准备好,不过可以被忽略
{
Delayms(100);
if(CH375DiskReady()==ERR_SUCCESS)
break; //查询磁盘是否准备好
}
Delayms(10);
xWriteCH375Cmd(CMD_SET_CONFIG); //设置USB配置
xWriteCH375Data(0); //取消配置,会导致很多U盘的LED灯灭
xQueryInterrupt(); //查询CH375中断并更新中断状态
Delayms(10);
if(i<5&&CH375IntStatus==USB_INT_SUCCESS)
return( USB_INT_SUCCESS ); //操作成功
else return(0xFF);
//以下取消SOF包会导致绝大多数U盘的LED灯灭
//如果此处取消SOF, 那么与此对应, 在检测到U盘插入后应该再恢复为模式6即恢复SOF包 */
// xWriteCH375Cmd( CMD_SET_USB_MODE ); /* 设置USB工作模式 */
// xWriteCH375Data( 5 ); /* 停止发出SOF包,检测到U盘插入后必须用模式6恢复SOF包发出 */
// mDelaymS( 1 );
}
void main(void)
{
unsigned char i;
unsigned char c;
unsigned int ui1,ui2;
CloseWDT();
Init_Device();
CloseWDT();
Clr_DOG();
EA=0;
Selectchip(0,2); //片选选择USB
for(ui1=0;ui1<512;ui1++)
{
USB_data_buff[ui1]=0;
}
//初始化USB,并测试USB---------------------------
USB_RESET();
i=CH375LibInit(); //初始化CH375程序库和CH375芯片,操作成功返回0
//----------------------------------------------
//设置USB工作模式-------------------------------
xWriteCH375Cmd(CMD_SET_USB_MODE);
xWriteCH375Data(0x06); //设置为已启用的主机方式并且自动产生SOF包
//当USB设备连接或者断开的时候会自动产生中断通知外部单片机
//等待操作成功,通常需要等待10uS-20uS
Delayus(20);
if(xReadCH375Data()==CMD_RET_SUCCESS)
_nop_();
//----------------------------------------------
//启动USB中断(外部中断)-------------------------
EA=1;
//----------------------------------------------
while(1)
{
//看是否有U盘插入,如果有U盘插入,只处理U盘的信息,其他操作停止
if(USB_connect==1)
{
USB_connect=0;
while(1)
{
// 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作
for(i=0;i<5;i++) //有的U盘总是返回未准备好,不过可以被忽略
{
Delayms(100);
if(CH375DiskReady()==ERR_SUCCESS)
break; //查询磁盘是否准备好
}
//操作U盘文件
i=CH375DiskConnect(); //正确返回0
//不考虑U盘的盘符
i=mCopyCodeStringToIRAM(mCmdParam.Open.mPathName, "\\S_DATA\\GDEMO.HEX");
i=CH375FileOpen(); //打开文件,正确返回0
if(i==ERR_MISS_DIR || i==ERR_MISS_FILE)
//没有找到文件,子目录名出错或者是文件名出错
{
_nop_();
}
else if(i==ERR_SUCCESS)
//恭喜,找到了
{
ui1=CH375vFileSize; //该文件的大小
ui2=CH375vSectorSize; //磁盘的扇区大小
while(1)
{
c=1; //每次读取1个扇区
mCmdParam.Read.mSectorCount=c; //指定读取的扇区数
i=CH375FileRead(); //读完后文件指针自动后移
//处理数据--------
for(ui1=0;ui1<FILE_DATA_BUF_LEN;ui1++)
{
USB_data_buff[ui1]=FILE_DATA_BUF[ui1];
}
//写FLASH
//----------------
if(mCmdParam.Read.mSectorCount<c)
break; //实际读出的扇区数较小则说明文件已经结束
}
i=CH375FileClose(); //关闭文件,正确返回0
if(SafeRemoveDisk()==USB_INT_SUCCESS)
break;
}
else
//不知道是什么问题的错误出现了
{
_nop_();
}
}
}
else
{
_nop_();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -