📄 main.c
字号:
DISK_BASE_BUF[0] = 0; //该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区
if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF ); //获取当前子程序库的版本号,版本太低则返回错误
return( CH375Init( ) ); //初始化CH375
}
#ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
#if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */
void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */
{
while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */
xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取当前中断状态,发出命令后至少延时2uS */
CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */
}
#else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */
void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */
{
unsigned char i;
while ( CH375IntStatus == 0 )
i = CH375IntStatus; /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */
//while ( CH375DiskStatus == DISK_DISCONNECT);
}
void CH375Interrupt( void ) interrupt 2 using 0 /* CH375中断服务程序,使用寄存器组1,由CH375的INT#的低电平或者下降沿触发单片机中断 */
{
unsigned char i;
//CH372_WrCmd (CMD_CHECK_EXIST); //测试CH375与单片机的物理连接是否正常
xWriteCH375Cmd( CMD_CHECK_EXIST );
//CH372_WrDat (0x55); //写入测试数据,任意数据
xWriteCH375Data( 0x88 );
//返回数据应该是测试数据取反
if (xReadCH375Data() == 0x77) //CH375不正常
{
//printf("pass!\r\n");
xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取当前中断状态,发出命令后至少延时2uS */
Delay_us(2);
CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */
i = CH375IntStatus;
if ( CH375IntStatus == USB_INT_DISCONNECT )
CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */
else if ( CH375IntStatus == USB_INT_CONNECT )
CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */
}
else
{
//printf("fail!\r\n");
i = xReadCH375Data();
}
#ifdef CLEAR_INT_MARK
CLEAR_INT_MARK( ); /* 某些单片机需要由软件清除中断标志 */
#endif
}
#endif
#endif
/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */
UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
/*************************************************************************************
* 主循环程序
*************************************************************************************/
void main (void)
{
UINT8 i, month, hour;
UINT16 date, adc, len;
WDTCN = 0xde;
WDTCN = 0xad;
SYSCLK_Init();
PORT_Init();
INT1_Set; //外中断1初始化设置
EA = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
Delay_ms(100);
LED1 = 0;
LED2 = 0;
LED3 = 0;
Uart0_Init(BaudRate_115200);
Uart1_Init(BaudRate_115200);
Uart0_Enable(1);
Uart1_Enable(1);
Uart0_SendString("www.mlarm.com\r\n");
Uart1_SendString("www.mlarm.com\r\n");
Uart0_SendString("TeL:029-88223597-802\r\n");
Uart1_SendString("TeL:029-88223597-802\r\n");
Uart1_SendString("Informition on Com1\r\n"); //提示在com1口观察信息
i = CH375LibInit(); //初始化CH375程序库和CH375芯片,操作成功返回0
mStopIfError(i); //其它电路初始化
while(1)
{
xWriteCH375Cmd( CMD_CHECK_EXIST );
xWriteCH375Data( 0x55 ); //返回数据应该是测试数据取反
if (xReadCH375Data() == 0xaa) //CH375不正常
{
printf("CH375 Test pass\r\n");
}
else
{
printf("CH375 Test fail\r\n");
}
printf("Wait Udisk\r\n");
while(CH375DiskStatus < DISK_CONNECT) //查询CH375中断并更新中断状态,等待U盘插入
{
xQueryInterrupt();
Delay_ms(100);
}
LED1 = 1; //LED亮
LED2 = 1; //LED亮
LED3 = 1; //LED亮
Delay_ms(200); //延时,可选操作,有的USB存储器需要几十毫秒的延时
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,
最多等待5*50mS,主要针对DiskReady不过的 */
for (i=0; i<100; i++) //最长等待时间,100*50ms
{
Delay_ms(100);
printf("Ready ?\r\n");
if (CH375DiskReady() == ERR_SUCCESS) break; //查询磁盘是否准备好
if (CH375DiskStatus < DISK_CONNECT) break; //检测到断开,重新检测并计时
if (CH375DiskStatus >= DISK_MOUNTED && i > 5) break;
/* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
}
if (CH375DiskStatus < DISK_CONNECT) //检测到断开,重新检测并计时
{
LED1 = 0;
LED2 = 0;
LED3 = 0;
printf("Device gone\r\n");
continue;
}
if (CH375DiskStatus < DISK_MOUNTED) //未知USB设备,例如USB键盘、打印机等
{
printf("Unknown device\r\n");
goto UnknownUsbDevice;
}
Delay_ms(20);
printf("DiskSize\r\n");//查询磁盘物理容量
i = CH375DiskSize();
mStopIfError(i);
printf("TotalSize = %u MB \r\n", (unsigned int)(mCmdParam.DiskSize.mDiskSizeSec >> 11)); //显示为以MB为单位的容量
/* 如果USB_TEST.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */
printf( "Open\n" );
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/USB_TEST.TXT" ); //文件名,该文件在根目录下
i = CH375FileOpen( ); //打开文件
if ( i == ERR_SUCCESS ) { //文件存在并且已经被打开,移动文件指针到尾部以便添加数据
printf( "File size = %ld\n", CH375vFileSize ); //V1.5以上子程序库在成功打开文件后,全局变量CH375vFileSize中是文件当前长度
printf( "Locate tail\n" );
mCmdParam.ByteLocate.mByteOffset = 0xffffffff; //移到文件的尾部
i = CH375ByteLocate( );
mStopIfError( i );
}
else if ( i == ERR_MISS_FILE ) { //没有找到文件,必须新建文件
printf( "Create\n" );
// mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/USB_TEST.TXT" ); //文件名,该文件在根目录下,刚才已经提供给CH375FileOpen
i = CH375FileCreate( ); //新建文件并打开,如果文件已经存在则先删除后再新建
mStopIfError( i );
}
else mStopIfError( i ); //打开文件时出错
printf( "Write begin\n" );
i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "此前文件长度= %ld 字节\xd\xa", CH375vFileSize );
mCmdParam.ByteWrite.mByteCount = i; //指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO
i = CH375ByteWrite( ); //以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO
mStopIfError( i );
printf( "Write Test data\n" );
for ( hour = 8; hour != 20; hour ++ ) { //用循环方式添加12行数据
TR0=1; //用定时器0的计数值做存储数据
month = 5; //假定是5月
date = TL1 & 0x1F; //因为测试板上没有实时时钟芯片,所以用定时器1的计数代替进行演示
adc = ( (UINT16)TH0 << 8 ) | TL0; //用定时器0的计数做数据存储演示
len = sprintf( mCmdParam.ByteWrite.mByteBuffer, "%02d.%02d.%02d Data=%u\xd\xa", (UINT16)month, date, (UINT16)hour, adc ); //将二制制数据格式为一行字符串
mCmdParam.ByteWrite.mByteCount = (unsigned char)len; //指定本次写入的字节数,不能超过MAX_BYTE_IO,否则另用缓冲区分多次写入
i = CH375ByteWrite( ); //以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO
mStopIfError( i );
}
mStopIfError( i );
printf( "Close\n" );
mCmdParam.Close.mUpdateLen = 1; //自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度
i = CH375FileClose( ); //关闭文件
mStopIfError( i );
printf( "Take out\n" );
while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); //查询CH375中断并更新中断状态,等待U盘拔出
Delay_ms(100);
UnknownUsbDevice:
printf("Take out\r\n");
while (CH375DiskStatus >= DISK_CONNECT) //查询CH375中断并更新中断状态,等待U盘拔出
{
CH375DiskConnect();
Delay_ms(100);
}
LED1 = 0; //LED灭
LED2 = 0; //LED灭
LED3 = 0; //LED灭
Delay_ms(200);
}
}
/******************************************************************************************
* 文件结束
******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -