📄 ch375hf1.c
字号:
TI = 0;
SBUF = mModeBigEndian ? (UINT8)back : (UINT8)( back >> 8 );
while ( TI == 0 );
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
return;
}
SBUF = USB_INT_DISK_READ; /* 操作状态码: 请求读取数据 */
mBuffer[0] = CH375_DAT_PORT; /* 00H */
mBuffer[1] = CH375_DAT_PORT; /* 从CH375取出数据暂存到串口数据收发缓冲区再发送 */
mBuffer[2] = CH375_DAT_PORT;
mBuffer[3] = CH375_DAT_PORT;
mBuffer[4] = CH375_DAT_PORT;
mBuffer[5] = CH375_DAT_PORT;
mBuffer[6] = CH375_DAT_PORT;
mBuffer[7] = CH375_DAT_PORT;
mBuffer[8] = CH375_DAT_PORT;
mBuffer[9] = CH375_DAT_PORT;
mBuffer[10] = CH375_DAT_PORT;
mBuffer[11] = CH375_DAT_PORT;
mBuffer[12] = CH375_DAT_PORT;
mBuffer[13] = CH375_DAT_PORT;
mBuffer[14] = CH375_DAT_PORT;
mBuffer[15] = CH375_DAT_PORT;
mBuffer[16] = CH375_DAT_PORT; /* 10H */
mBuffer[17] = CH375_DAT_PORT;
mBuffer[18] = CH375_DAT_PORT;
mBuffer[19] = CH375_DAT_PORT;
mBuffer[20] = CH375_DAT_PORT;
mBuffer[21] = CH375_DAT_PORT;
mBuffer[22] = CH375_DAT_PORT;
mBuffer[23] = CH375_DAT_PORT;
mBuffer[24] = CH375_DAT_PORT;
mBuffer[25] = CH375_DAT_PORT;
mBuffer[26] = CH375_DAT_PORT;
mBuffer[27] = CH375_DAT_PORT;
mBuffer[28] = CH375_DAT_PORT;
mBuffer[29] = CH375_DAT_PORT;
mBuffer[30] = CH375_DAT_PORT;
mBuffer[31] = CH375_DAT_PORT;
mBuffer[32] = CH375_DAT_PORT; /* 20H */
mBuffer[33] = CH375_DAT_PORT;
mBuffer[34] = CH375_DAT_PORT;
mBuffer[35] = CH375_DAT_PORT;
mBuffer[36] = CH375_DAT_PORT;
mBuffer[37] = CH375_DAT_PORT;
mBuffer[38] = CH375_DAT_PORT;
mBuffer[39] = CH375_DAT_PORT;
mBuffer[40] = CH375_DAT_PORT;
mBuffer[41] = CH375_DAT_PORT;
mBuffer[42] = CH375_DAT_PORT;
mBuffer[43] = CH375_DAT_PORT;
mBuffer[44] = CH375_DAT_PORT;
mBuffer[45] = CH375_DAT_PORT;
mBuffer[46] = CH375_DAT_PORT;
mBuffer[47] = CH375_DAT_PORT;
mBuffer[48] = CH375_DAT_PORT; /* 30H */
mBuffer[49] = CH375_DAT_PORT;
mBuffer[50] = CH375_DAT_PORT;
mBuffer[51] = CH375_DAT_PORT;
mBuffer[52] = CH375_DAT_PORT;
mBuffer[53] = CH375_DAT_PORT;
mBuffer[54] = CH375_DAT_PORT;
mBuffer[55] = CH375_DAT_PORT;
mBuffer[56] = CH375_DAT_PORT;
mBuffer[57] = CH375_DAT_PORT;
mBuffer[58] = CH375_DAT_PORT;
mBuffer[59] = CH375_DAT_PORT;
mBuffer[60] = CH375_DAT_PORT;
mBuffer[61] = CH375_DAT_PORT;
mBuffer[62] = CH375_DAT_PORT;
mBuffer[63] = CH375_DAT_PORT; /* 3FH */
while ( TI == 0 ); /* 等待状态码发送完成 */
INT_OUT = 1;
for ( count = 0; count != 64; count ++ ) { /* 通过串口输出64字节数据 */
TI = 0;
SBUF = mBuffer[ count ]; /* 输出数据 */
while ( TI == 0 );
}
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
}
/* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
void xReadFromExtBuf( UINT8 mLength )
{
UINT8 fill, count;
PUINT8I SerBuf;
UINT16 back;
INT_OUT = 0; /* 输出中断请求 */
TI = 0;
if ( mLength == 0 ) { /* 重试 */
SBUF = USB_INT_DISK_RETRY; /* 操作状态码: 重试 */
while ( TI == 0 ); /* 等待状态码发送完成 */
INT_OUT = 1;
back = 0 - (UINT16)mCmdParam.WriteX.mDataBuffer;
mCmdParam.WriteX.mDataBuffer = 0;
TI = 0;
SBUF = mModeBigEndian ? (UINT8)( back >> 8 ) : (UINT8)back;
while ( TI == 0 );
TI = 0;
SBUF = mModeBigEndian ? (UINT8)back : (UINT8)( back >> 8 );
while ( TI == 0 );
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
return;
}
SBUF = USB_INT_DISK_WRITE; /* 操作状态码: 请求写入数据 */
RI = 0;
fill = 64;
count = CH375_MAX_DATA_LEN;
while ( TI == 0 ) { /* 等待状态码发送完成 */
CH375_DAT_PORT = ACC; /* 因为串口数据接收较慢,为避免CH375等待而导致U盘挂起,必须先用任意数据结束写数据命令 */
fill --;
if ( TI == 0 ) {
CH375_DAT_PORT = ACC; /* 用任意数据结束写数据命令 */
fill --;
if ( TI == 0 ) {
CH375_DAT_PORT = ACC; /* 用任意数据结束写数据命令 */
fill --;
if ( TI == 0 ) {
CH375_DAT_PORT = ACC; /* 用任意数据结束写数据命令 */
fill --;
if ( fill == 0 ) { /* 写数据命令填充完成 */
while ( TI == 0 );
break;
}
}
else break;
}
else break;
}
else break;
}
INT_OUT = 1;
SerBuf = mBuffer;
do { /* 通过串口输入64字节数据 */
if ( RI == 0 ) {
do {
if ( fill ) { /* 填充写数据命令 */
CH375_DAT_PORT = ACC; /* 用任意数据结束写数据命令 */
fill --;
}
} while ( RI == 0 );
}
*SerBuf = SBUF; /* 输入数据 */
RI = 0;
SerBuf ++;
} while ( -- count );
if ( fill ) { /* 写数据命令尚未结束 */
do {
CH375_DAT_PORT = ACC; /* 用任意数据结束写数据命令 */
} while ( -- fill );
}
RI = 0; /* 至少延时2uS */
CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 向USB端点2的发送缓冲区写入数据块 */
if ( TI ) TI = 0; /* 至少延时2uS */
CH375_DAT_PORT = CH375_MAX_DATA_LEN; /* 后续数据的长度 */
CH375_DAT_PORT = mBuffer[0]; /* 00H */
CH375_DAT_PORT = mBuffer[1]; /* 将暂存在串口数据收发缓冲区中的数据写给CH375 */
CH375_DAT_PORT = mBuffer[2];
CH375_DAT_PORT = mBuffer[3];
CH375_DAT_PORT = mBuffer[4];
CH375_DAT_PORT = mBuffer[5];
CH375_DAT_PORT = mBuffer[6];
CH375_DAT_PORT = mBuffer[7];
CH375_DAT_PORT = mBuffer[8];
CH375_DAT_PORT = mBuffer[9];
CH375_DAT_PORT = mBuffer[10];
CH375_DAT_PORT = mBuffer[11];
CH375_DAT_PORT = mBuffer[12];
CH375_DAT_PORT = mBuffer[13];
CH375_DAT_PORT = mBuffer[14];
CH375_DAT_PORT = mBuffer[15];
CH375_DAT_PORT = mBuffer[16]; /* 10H */
CH375_DAT_PORT = mBuffer[17];
CH375_DAT_PORT = mBuffer[18];
CH375_DAT_PORT = mBuffer[19];
CH375_DAT_PORT = mBuffer[20];
CH375_DAT_PORT = mBuffer[21];
CH375_DAT_PORT = mBuffer[22];
CH375_DAT_PORT = mBuffer[23];
CH375_DAT_PORT = mBuffer[24];
CH375_DAT_PORT = mBuffer[25];
CH375_DAT_PORT = mBuffer[26];
CH375_DAT_PORT = mBuffer[27];
CH375_DAT_PORT = mBuffer[28];
CH375_DAT_PORT = mBuffer[29];
CH375_DAT_PORT = mBuffer[30];
CH375_DAT_PORT = mBuffer[31];
CH375_DAT_PORT = mBuffer[32]; /* 20H */
CH375_DAT_PORT = mBuffer[33];
CH375_DAT_PORT = mBuffer[34];
CH375_DAT_PORT = mBuffer[35];
CH375_DAT_PORT = mBuffer[36];
CH375_DAT_PORT = mBuffer[37];
CH375_DAT_PORT = mBuffer[38];
CH375_DAT_PORT = mBuffer[39];
CH375_DAT_PORT = mBuffer[40];
CH375_DAT_PORT = mBuffer[41];
CH375_DAT_PORT = mBuffer[42];
CH375_DAT_PORT = mBuffer[43];
CH375_DAT_PORT = mBuffer[44];
CH375_DAT_PORT = mBuffer[45];
CH375_DAT_PORT = mBuffer[46];
CH375_DAT_PORT = mBuffer[47];
CH375_DAT_PORT = mBuffer[48]; /* 30H */
CH375_DAT_PORT = mBuffer[49];
CH375_DAT_PORT = mBuffer[50];
CH375_DAT_PORT = mBuffer[51];
CH375_DAT_PORT = mBuffer[52];
CH375_DAT_PORT = mBuffer[53];
CH375_DAT_PORT = mBuffer[54];
CH375_DAT_PORT = mBuffer[55];
CH375_DAT_PORT = mBuffer[56];
CH375_DAT_PORT = mBuffer[57];
CH375_DAT_PORT = mBuffer[58];
CH375_DAT_PORT = mBuffer[59];
CH375_DAT_PORT = mBuffer[60];
CH375_DAT_PORT = mBuffer[61];
CH375_DAT_PORT = mBuffer[62];
CH375_DAT_PORT = mBuffer[63]; /* 3FH */
RI = 0;
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
}
/* 至少延时2uS */
void mDelay2uS( )
{
_nop_( );
}
/* 向CH375写入命令码 */
void mWriteCmdCH375( UINT8 iCmd )
{
CH375_CMD_PORT = iCmd;
_nop_( );
_nop_( );
_nop_( );
}
/* 以毫秒为单位延时 */
void mDelaymS( UINT8 iDelay )
{
UINT8 i, j;
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
for ( i = iDelay; i != 0; i -- ) {
j = 0;
do {
_nop_( ); /* 每循环周期为3个机器周期,时间为0.651uS*3 */
} while ( -- j ); /* 在18.432MHz时钟下延时500uS */
j = 0;
do {
_nop_( );
} while ( -- j ); /* 在18.432MHz时钟下延时500uS */
}
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
}
/* USB主机模式: 查询CH375是否请求中断 */
UINT8 mQueryCH375( )
{
UINT8 status;
if ( CH375_INT_WIRE == 0 ) { /* 如果CH375的中断引脚输出低电平 */
_nop_( );
CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */
_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( ); /* 至少延时2uS */
CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_CONNECT || CH375IntStatus == USB_INT_DISCONNECT ) { /* 检测到USB设备连接或者断开事件 */
mDelaymS( 50 ); /* USB设备刚刚连接或者断开,延时等待50毫秒 */
if ( CH375_INT_WIRE == 0 ) { /* 如果CH375的中断引脚输出低电平 */
_nop_( );
CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */
_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( ); /* 至少延时2uS */
CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */
}
}
if ( CH375IntStatus == USB_INT_DISCONNECT ) { /* 检测到USB设备断开事件 */
CH375DiskStatus = DISK_DISCONNECT;
status = ERR_DISK_DISCON;
}
else if ( CH375IntStatus == USB_INT_CONNECT ) { /* 检测到USB设备连接事件 */
CH375DiskStatus = DISK_CONNECT;
status = ERR_USB_CONNECT;
}
else {
CH375DiskStatus = DISK_UNKNOWN;
status = ERR_CH375_ERROR; /* CH375硬件错误,可能需要复位CH375 */
}
}
else status = ERR_SUCCESS;
return( status );
}
/* USB设备模式: 查询CH375是否请求中断 */
UINT8 mQueryCH375Device( )
{
UINT8 status;
if ( CH375_INT_WIRE == 0 ) { /* 如果CH375的中断引脚输出低电平 */
_nop_( );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -