📄 ch375hf1.c
字号:
CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */
_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( ); /* 至少延时2uS */
CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_EP2_OUT ) { /* USB端点2的OUT */
status = ERR_USB_DAT_DOWN;
}
else if ( CH375IntStatus == USB_INT_EP2_IN ) { /* USB端点2的IN */
status = ERR_USB_DAT_UP;
}
else if ( CH375IntStatus == USB_INT_EP1_IN ) { /* USB端点1的IN */
status = ERR_SUCCESS;
}
else {
status = ERR_CH375_ERROR; /* CH375硬件错误,可能需要复位CH375 */
}
}
else status = ERR_SUCCESS;
return( status );
}
/* 将字符串复制到内部RAM中,返回字符串长度 */
UINT8 mCopyCodeString( PUINT8I iDestination, UINT8 code *iSource )
{
UINT8 i;
i = 0;
while ( *iDestination = *iSource ) {
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
/* 磁盘缓冲区清零 */
void mClrDiskBaseBuf( void )
{
UINT8 c1, c2;
PUINT8X DirXramBuf;
DirXramBuf = &DISK_BASE_BUF[0];
for ( c1 = 2; c1 != 0; c1 -- ) {
c2 = 0;
do {
*DirXramBuf = 0;
DirXramBuf ++;
} while ( -- c2 );
}
}
/* 将字节数据转换为十六进制字符串(两位数) */
void mByteToString( PUINT8I iBuffer, UINT8 iBcd )
{
UINT8 c;
c = ( iBcd >> 4 ) & 0x0F;
*iBuffer = c + ( c >= 10 ? 'A' - 10 : '0' );
iBuffer ++;
c = iBcd & 0x0F;
*iBuffer = c + ( c >= 10 ? 'A' - 10 : '0' );
}
/* 将缓冲区中的双字数据交换字节顺序 */
void mConvertDword( PUINT32I iBuffer )
{
PUINT8I iBuf;
iBuf = (PUINT8I)iBuffer;
R7X = *iBuf;
iBuf ++;
R6X = *iBuf;
iBuf ++;
B = *iBuf;
iBuf ++;
ACC = *iBuf;
*iBuf = R7X;
iBuf --;
*iBuf = R6X;
iBuf --;
*iBuf = B;
iBuf --;
*iBuf = ACC;
}
/* 将缓冲区中的字数据交换字节顺序 */
void mConvertWord( PUINT16I iBuffer )
{
PUINT8I iBuf;
iBuf = (PUINT8I)iBuffer;
B = *iBuf;
iBuf ++;
ACC = *iBuf;
*iBuf = B;
iBuf --;
*iBuf = ACC;
}
/* 测试CH375是否正常, 返回0则正常 */
UINT8 mTestCH375( void )
{
if ( CH375_DAT_PORT & 1 ) {
mWriteCmdCH375( CMD_CHECK_EXIST ); /* 测试工作状态 */
CH375_DAT_PORT = 0x55; /* 测试数据 */
mDelay2uS( );
return( CH375_DAT_PORT ^ 0xAA ); /* 返回数据应该是测试数据取反,否则CH375出错 */
}
else {
mWriteCmdCH375( CMD_CHECK_EXIST ); /* 测试工作状态 */
CH375_DAT_PORT = 0xAA; /* 测试数据 */
mDelay2uS( );
return( CH375_DAT_PORT ^ 0x55 ); /* 返回数据应该是测试数据取反,否则CH375出错 */
}
}
/* 设置USB的设备ID */
void mSetUsbID( void )
{
mWriteCmdCH375( CMD_SET_USB_ID );
CH375_DAT_PORT = mCmdParam.SetUsbId.mVidLow;
_nop_( );
CH375_DAT_PORT = mCmdParam.SetUsbId.mVidHigh;
_nop_( );
CH375_DAT_PORT = mCmdParam.SetUsbId.mPidLow;
_nop_( );
CH375_DAT_PORT = mCmdParam.SetUsbId.mPidHigh;
}
/* 设置CH375的工作模式,返回等待操作状态的计数 */
UINT8 mSetModeCH375( void )
{
UINT8 i;
mWriteCmdCH375( CMD_SET_USB_MODE );
CH375_DAT_PORT = mCmdParam.SetUsbMode.mUsbMode; /* USB模式 */
_nop_( );
for ( i = 250; i != 0; i -- ) if ( CH375_DAT_PORT == CMD_RET_SUCCESS ) break;
return( i ); /* 返回0则设置模式失败 */
}
/* 复位CH375芯片 */
void mResetCH375( void )
{
P1 = 0xFF; /* 硬复位CH375芯片 */
mDelaymS( 1 );
P1 = 0xFC; /* 取消复位 */
mDelay2uS( );
if ( ( P1 & ~ DISABLE_RESET ) == 0 ) { /* 硬件支持硬复位 */
P1 = DISABLE_RESET; /* 禁止复位 */
mDelaymS( 50 );
}
else { /* 只能命令复位 */
P1 = DISABLE_RESET; /* 禁止复位 */
CH375Reset( ); /* 复位CH375 */
}
}
main( ) {
UINT8 RetLen, status;
UINT8 DirNameStart, c;
UINT32 UpDirCluster;
PUINT8I NameBuf, SerRetBuf;
PUINT8I ReadUsbBuf, WriteUsbBuf;
PUINT8X DirXramBuf;
PUINT8I DirInfoBufI1, DirInfoBufI2;
PUINT8X DirInfoBufX1, DirInfoBufX2;
UINT8 code *DirConstData;
IE = 0; /* 关闭中断,恢复默认值 */
P1 = 0xFF;
P0 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
IP = 0;
PSW = 0;
P1 = DISABLE_RESET; /* 禁止复位 */
mDelaymS( 50 );
IE = 0;
AUXR = 0x03; /* 禁止内部扩展RAM,禁止无效ALE */
TCON = 0x00;
TMOD = 0x01; /* 定时器0用于串口接收超时检测 */
TH0 = 0x00;
if ( xPresetSig == 0x24484D53 ) { /* 模块的预设标志$HMS有效 */
mWorkMode = xWorkMode; /* 模块的预设标志$HMS有效则获取预设的工作模式 */
RetLen = xBaudRate; /* 预设串口通讯波特率 */
}
else if ( zPresetSig == 0x24484D53 ) { /* 模块的预设标志$HMS有效 */
mWorkMode = zWorkMode; /* 模块的预设标志$HMS有效则获取预设的工作模式 */
RetLen = zBaudRate; /* 预设串口通讯波特率 */
}
else { /* 默认工作模式 */
mWorkMode = 0x00; /* 清工作模式 */
mModeBigEndian = 1; /* 数据字节顺序:大端BIG_ENDIAN */
mModeAutoNotice = 0; /* 空闲时查询U盘连接状态并自动中断通知:禁止 */
mModeUpdateSize = 0; /* 向文件写入数据后自动更新文件长度:禁止 */
mModeTimeout = 1; /* 串口超时使能:允许超时检查 */
mModeSerial = 0; /* 接口方式:并口 */
mModePortSpec = 0; /* 并口/专用接口方式选择:8位并口 */
RetLen = DEFAULT_BAUDRATE; /* 默认波特率 */
}
#ifdef WATCHDOG_TIMEOUT
if ( mModeTimeout ) { /* 允许超时检查 */
WDTC = 0; /* 关闭看门狗 */
WDTD = WATCHDOG_TIMEOUT;
WDTC = 0x0F; /* 启用看门狗 */
}
#endif
if ( PIN_SER_MODE == 0 ) { /* 低电平设置接口方式为3线制串口方式 */
mDelaymS( 1 ); /* 延时1毫秒 */
if ( PIN_SER_MODE == 0 ) { /* 强制为3线制串口方式 */
mModeSerial = 1;
mModeSerialSync = 1;
}
}
if ( RetLen == 0 || RetLen == 0xFF ) RetLen = DEFAULT_BAUDRATE; /* 未预设波特率 */
if ( mModeSerial == 0 ) { /* 并口 */
while ( 1 ) {
BUSY_OUT = 0; /* 空闲 */
mDelaymS( 250 );
mDelaymS( 250 );
BUSY_OUT = 1; /* 空闲 */
mDelaymS( 250 );
mDelaymS( 250 );
}
}
PCON = 0x80;
SCON = 0x50; /* 8位串行数据 */
TL2 = RCAP2L = 0 - RetLen;
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */
if ( mModeSerialSync ) { /* 三线制串口,由串口同步码启动操作 */
RI = 0; TI = 0; /* 清除中断标志 */
EXT_INT_ENABLE = 0; /* 禁止外部接口中断 */
ES = 1; /* 允许串口中断 */
}
else { /* 默认为4+1线串口 */
ES = 0; /* 由外部中断启动操作 */
EXT_INT_ENABLE = 1; /* 允许外部接口中断 */
}
IT1 = 1; /* 使用边沿触发方式 */
/* PX1 = 1;*/ /* 高优先级 */
EXT_INT_FLAG = 0; /* 清中断标志 */
mCmdAction = 0; /* 命令激活位无效 */
mSetBaudRate = 0; /* 不设置波特率 */
mCmdCode = 0; /* 命令码无效 */
/* mCmdLength = 0;*/ /* 命令包的参数长度 */
CH375LibConfig = LIB_CFG_VALUE; /* CH375程序库配置值 */
if ( mModeUpdateSize ) CH375LibConfig |= 0x10; /* 自动更新文件长度 */
mUsbModeDevice = 0; /* USB主机模式 */
if ( mTestCH375( ) || mTestCH375( ) ) mLastState = ERR_CH375_ERROR; /* CH375硬件错误 */
else mLastState = CH375Init( ); /* 初始化CH375 */
while ( mLastState != ERR_SUCCESS ) { /* 初始化失败 */
mResetCH375( ); /* 复位CH375芯片 */
for ( RetLen = 3; RetLen != 0; RetLen -- ) {
BUSY_OUT = 0; /* 闪烁 */
mDelaymS( 100 ); /* 延时100毫秒 */
BUSY_OUT = 1;
mDelaymS( 100 );
}
mLastState = CH375Init( ); /* 再次初始化CH375 */
}
EA = 1; /* 开全局中断 */
while ( 1 ) {
BUSY_OUT = 0; /* 空闲 */
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
while ( mCmdAction == 0 ) { /* 尚未收到命令包 */
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
if ( mModeAutoNotice ) { /* 允许空闲时查询U盘连接状态并自动中断通知 */
status = mUsbModeDevice ? mQueryCH375Device( ) : mQueryCH375( ); /* 查询CH375的中断状态 */
if ( status != ERR_SUCCESS ) { /* U盘断开或者连接 */
INT_OUT = 1; /* 撤消之前的中断 */
mDelay2uS( ); /* 至少延时2uS */
INT_OUT = 0; /* 输出中断请求 */
if ( mModeSerialSync ) EA = 0; /* 关闭中断 */
TI = 0;
SBUF = status; /* 操作状态码 */
while ( TI == 0 );
INT_OUT = 1; /* 撤消中断 */
TI = 0;
EA = 1; /* 允许中断 */
}
}
if ( PIN_AUTO_DEMO ) continue;
for ( RetLen = 0xFF; RetLen != 0; RetLen -- ) if ( PIN_AUTO_DEMO || mCmdAction ) break;
if ( mCmdAction ) break;
if ( PIN_AUTO_DEMO ) continue;
EA = 0; /* 命令执行期间禁止中断 */
BUSY_OUT = 1; /* 命令执行正忙 */
INT_OUT = 1;
AUXR = 0x01; /* 使能内部扩展RAM,禁止无效ALE */
do {
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 检查磁盘是否连接,U盘已经连接 */
mDelaymS( 2 ); /* 等待后再查询 */
} while ( PIN_AUTO_DEMO == 0 ); /* 自动演示状态 */
if ( PIN_AUTO_DEMO ) { /* 退出自动演示 */
AUXR = 0x03; /* 禁止内部扩展RAM,禁止无效ALE */
EA = 1; /* 允许中断 */
continue;
}
mDelaymS( 250 ); /* 等待U盘稳定 */
for ( RetLen = 10; RetLen != 0; RetLen -- ) { /* 模块自动演示字节模式文件功能,向U盘中文件添加信息 */
mDelaymS( 50 ); /* 等待后再查询 */
status = CH375DiskReady( ); /* 查询磁盘是否准备好 */
if ( status == ERR_SUCCESS ) break;
}
if ( CH375DiskStatus >= DISK_MOUNTED ) { /* U盘已经成功加载 */
mCopyCodeString( mCmdParam.Open.mPathName, AUTO_DEMO_FILE );
status = CH375FileOpen( ); /* 打开文件 */
if ( status == ERR_SUCCESS ) { /* 文件已经存在 */
mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;
status = CH375ByteLocate( ); /* 以字节为单位移动当前文件指针,移到文件末尾以追加数据 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -