📄 host.c
字号:
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
unsigned char i;
// if((ReadData(0x02)&0x7f)==0x8) /* 检查是否第一次启动,是则初始化时间,检查对象为秒(0x02)最高位为1则初始化*/
{
for(i=0;i<=6;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
P8563_settime();
}
}
/********************************************
把时间数据形式转库十进制
***********************************************/
unsigned char convert_time(unsigned char x)
{
return (x>>4)*10+(x&0x0f);
}
/*----------------------------------------------------
函数名:ftoa()
功能 :将一个浮点数转为一个精度为jd的字符串,存于s中
------------------------------------------------------*/
char * ftoa(float dat,char *s,unsigned char jd)
{
int len,temp,flag=dat<0?dat=-dat,1:0,i;
char t[10];
temp=(int)dat;
for(len=0;temp>0;temp/=10,len++)
t[len]=temp%10+48;
for(i=0;i<=len;i++)
s[len-i-1]=t[i];
s[len++]=jd?'.':0;
for(i=0,temp=(int)((dat-(int)dat)*pow(10,jd));temp>0;temp/=10,i++)
t[i]=temp%10+48;
for(i=0;i<jd;i++)
s[len++]=t[jd-i-1];
s[len]=0;
return s;
}
void time2string()
{
unsigned int temprature;
//mCmdParam.ByteWrite.mByteBuffer[0]='2';
//mCmdParam.ByteWrite.mByteBuffer[1]='0';
mCmdParam.ByteWrite.mByteBuffer[0]=2+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=0+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]=(convert_time(g8563_Store[6]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[3]=(convert_time(g8563_Store[6]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[4]="年"[0];
mCmdParam.ByteWrite.mByteBuffer[5]="年"[1];
mCmdParam.ByteWrite.mByteCount=6;
CH375ByteWrite();
mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[5]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[5]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]="月"[0];
mCmdParam.ByteWrite.mByteBuffer[3]="月"[1];
mCmdParam.ByteWrite.mByteCount=4;
CH375ByteWrite();
mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[3]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[3]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]="日"[0];
mCmdParam.ByteWrite.mByteBuffer[3]="日"[1];
mCmdParam.ByteWrite.mByteCount=4;
CH375ByteWrite();
mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[2]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[2]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]="时"[0];
mCmdParam.ByteWrite.mByteBuffer[3]="时"[1];
mCmdParam.ByteWrite.mByteCount=4;
CH375ByteWrite();
mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[1]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[1]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]="分"[0];
mCmdParam.ByteWrite.mByteBuffer[3]="分"[1];
mCmdParam.ByteWrite.mByteCount=4;
CH375ByteWrite();
mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[0]))/10+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[0]))%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]="秒"[0];
mCmdParam.ByteWrite.mByteBuffer[3]="秒"[1];
mCmdParam.ByteWrite.mByteBuffer[4]=':';
mCmdParam.ByteWrite.mByteBuffer[5]=' ';
mCmdParam.ByteWrite.mByteCount=6;
CH375ByteWrite();
temprature=ReadTemperature();
mCmdParam.ByteWrite.mByteBuffer[0]=temprature/1000+0x30;
mCmdParam.ByteWrite.mByteBuffer[1]=(temprature/100)%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[2]='.';
mCmdParam.ByteWrite.mByteBuffer[3]=(temprature/10)%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[4]=(temprature)%10+0x30;
mCmdParam.ByteWrite.mByteBuffer[5]=0x0d;
mCmdParam.ByteWrite.mByteBuffer[6]=0x0a;
mCmdParam.ByteWrite.mByteCount=7;
CH375ByteWrite();
}
#ifdef NO_DEFAULT_CH375_INT /* 自行编写中断处理程序,加上了超时处理,并且在等待中断的过程中可以做其它事 */
void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态,该程序基本框架可以参考CH375HF?.H文件 */
{
UINT16 i;
for ( i = 65535; i != 0; i -- ) { /* 正常情况下该过程为几毫秒到几十毫秒,偶尔也会达到几百毫秒 */
if ( CH375_INT_WIRE == 0 ) break; /* 如果CH375的中断引脚输出低电平则说明CH375操作完成 */
/* if ( ( CH375_CMD_PORT & 0x80 ) == 0 ) break; 对于CH375B芯片,也查询CH375B的命令端口的位7为0说明中断引脚输出低电平 */
在等待CH375中断的过程中,可以做些需要及时处理的事情
}
if ( i == 0 ) CH375超时,通常是硬件问题;
CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */
mDelay2uS( ); /* 操作无意义,用于至少延时2uS,可以用多个NOP空操作指令实现 */
CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */
}
#endif
/* 以毫秒为单位延时,不精确,适用于24MHz时钟 */
void mDelaymS( UINT8 delay )
{
unsigned char i, j, c;
for ( i = delay; i != 0; i -- ) {
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
}
}
/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */
UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource ) {
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
/* 检查操作状态,如果错误则显示错误代码并停机 */
void mStopIfError( UINT8 iError )
{
if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */
while ( 1 ) {
LED_UDISK_IN( ); /* LED闪烁 */
mDelaymS( 100 );
LED_UDISK_OUT( );
mDelaymS( 100 );
}
}
void host( ) {
UINT32 i;
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */
#endif
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
mStopIfError( i );
while ( 1 ) {
printf( "Insert USB disk\n" );
while ( CH375DiskStatus < DISK_CONNECT ) { /* 等待U盘插入 */
if ( IsKeyPress( ) ) { /* 有键按下 */
printf( "Exit USB host mode\n" );
return;
}
/* if ( CH375_INT_WIRE == 0 ) xQueryInterrupt( );*/ /* 如果CH375中断,那么查询CH375中断并更新中断状态,可以改成中断方式 */
mDelaymS( 100 ); /* 没必要频繁查询 */
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 查询方式: 检查磁盘是否连接,返回成功说明连接 */
}
LED_UDISK_IN( ); /* LED亮 */
mDelaymS( 250 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 检查U盘是否准备好,但是某些U盘必须要执行这一步才能工作 */
for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */
mDelaymS( 100 );
printf( "Ready ?\n" );
// if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好,不支持CH375S,节约代码空间 */
if ( CH375sDiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好,支持CH375S和CH375A,但占用更多的代码空间 */
}
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */
printf( "Too large sector size\n" );
while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 );
continue;
}
#endif
#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */
/* 产生新文件(覆盖原文件数据),关于向原有文件中添加数据的例子请参考EXAM7和EXAM8 */
LED_WR_NOW( ); /* 写操作 */
printf( "Create\n" );
mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/TIME.TXT" ); /* 新文件名,在根目录下,中文文件名 */
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
mStopIfError( i );
printf( "Write\n" );
strcpy(mCmdParam.ByteWrite.mByteBuffer,"U盘实时温度记录器 开始记录......\xd\xa");
mCmdParam.ByteWrite.mByteCount=34;
CH375ByteWrite();
while(P1&0x04)
{
P8563_Read();
time2string();
delay(50000);
}
strcpy(mCmdParam.ByteWrite.mByteBuffer,"U盘实时温度记录器 记录完毕!!\xd\xa");
mCmdParam.ByteWrite.mByteCount=32;
CH375ByteWrite();
printf( "Close\n" );
mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
i = CH375FileClose( );
mStopIfError( i );
LED_NOT_WR( );
#endif
printf( "Take out USB disk\n" );
// while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */
while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘拔出 */
if ( CH375DiskConnect( ) != ERR_SUCCESS ) break;
mDelaymS( 100 );
}
LED_UDISK_OUT( ); /* LED灭 */
mDelaymS( 100 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -