📄 usbp.c
字号:
#define DataCount status // 节约一个变量单元
unsigned char data *buf;
CH375HM_INDEX_WR( 0 ); // 索引地址置0
CH375HM_DATA_WR( cmd ); // 向索引地址00H写入命令码
CH375HM_DATA_WR( len ); // 向索引地址01H写入后续参数的长度
if ( len ) // 有参数
{
i = len;
buf = (unsigned char *)&mCmdParam; // 指向输入参数的起始地址
do // 使用do+while结构是因为其效率高于for
{
CH375HM_DATA_WR( *buf++ ); // 从索引地址02H开始,写入参数
} while ( -- i );
}
CH375HM_STA = 0; // 产生下降沿通知模块,说明命令包已经写入,请求开始执行命令
while ( 1 ) // 处理数据传输,直到操作完成才退出
{
// 等待模块完成操作产生低电平中断,最佳检测方式是对模块的INT#信号进行下降沿边沿检测
while ( CH375HM_INT_WIRE ) ; //喂狗
CH375HM_INDEX_WR( 63 ); // 写入索引地址63
status = CH375HM_DATA_RD( ); // 从索引地址63读取中断状态
CH375HM_STA = 1; // 中断应答,取消来自模块的中断请求
// 因为模块在收到中断应答后3uS之内才撤消中断请求,所以,如果是查询INT#信号的低电平,那么在发出中断应答后
// 3uS之内不应该再查询INT#信号的状态,//但是由于51单片机较慢,下面的处理时间已经超过3uS,
// 所以另加延时等待模块撤消中断请求
mDelayuS( 3 ); // 3 uS
if ( status == ERR_SUCCESS ) // 操作成功
{
CH375HM_INDEX_WR( 1 );
DataCount = CH375HM_DATA_RD( ); // 从索引地址01H读取返回结果数据的长度,计数
if ( DataCount ) // 有结果数据
{
buf = (unsigned char *)&mCmdParam; // 指向输出参数的起始地址
i = 2;
do
{
CH375HM_INDEX_WR( i++ );
*buf++ = CH375HM_DATA_RD( ); // 从索引地址2开始,读取结果
} while ( -- DataCount );
}
break; // 操作成功返回
}
// 正在从U盘读数据块,请求数据读出
else if ( status == USB_INT_DISK_READ )
{
DataCount = 64; // 计数
i = 0;
do // 要提高文件数据读写速度,这段程序用汇编程序效率更高,在C51中,do+while比for或者while结构效率高
{
CH375HM_INDEX_WR( i++ );
*buffer++ = CH375HM_DATA_RD( ); // 从索引地址0到63依次读出64字节的数据,保存到外部缓冲区
} while ( -- DataCount ); // 上面这一小段C程序用汇编程序效率要高近一倍
CH375HM_STA = 0; // 产生下降沿通知模块继续,说明64字节数据已经读取完成
}
// 正在向U盘写数据块,请求数据写入
else if ( status == USB_INT_DISK_WRITE )
{
CH375HM_INDEX_WR( 0 );
i = 64;
do // 要提高文件数据读写速度,这段程序用汇编程序效率更高,在C51中,do+while比for或者while结构效率高
{
CH375HM_DATA_WR( *buffer++ ); // 向索引地址0到63依次写入64字节的数据,写入的数据来自外部缓冲区
} while ( -- i );
CH375HM_STA = 0; // 产生下降沿通知模块继续,说明64字节数据已经写入完成
}
// 读写数据块失败重试,应该向回修改缓冲区指针
else if ( status == USB_INT_DISK_RETRY )
{
CH375HM_INDEX_WR( 0 );
i = CH375HM_DATA_RD( ); // 大端模式下为回改指针字节数的高8位,如果是小端模式那么接收到的是回改指针字节数的低8位
CH375HM_INDEX_WR( 1 );
DataCount = CH375HM_DATA_RD( ); // 大端模式下为回改指针字节数的低8位,如果是小端模式那么接收到的是回改指针字节数的高8位
buffer -= ( (unsigned short)i << 8 ) + DataCount; // 这是大端模式下的回改指针,对于小端模式,应该是( (unsigned short)status << 8 ) + i
CH375HM_STA = 0; // 产生下降沿通知模块继续,说明重试状态码已经处理完成
}
// 操作失败
else
{
if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 10 ); // U盘刚刚连接或者断开,应该延时几十毫秒再操作
break; // 操作失败返回
}
}
while( CH375HM_INT_WIRE == 0 ) ; // 如果单片机速度很快,有可能该程序返回前模块尚未撤消中断请求,那么应该等待中断请求引脚无效
return( status );
}
#endif
//-----------------------------------------------
// 串口连接方式
#else
//=================================================================================================
// ExecCommand( )
//=================================================================================================
//
//-------------------------------------------------------------------------------------------------
// 执行命令
// 输入命令码和输入参数长度,返回操作状态码,输入参数和返回参数都在CMD_PARAM结构中
unsigned char ExecCommand( unsigned char cmd, unsigned char len )
{
unsigned char i, j, status;
mSendByte ( SER_SYNC_CODE1 ); // 发送串口同步码通知模块,说明命令码开始发送,请求开始执行命令
mSendByte ( SER_SYNC_CODE2 ); // 用两个串口同步码代替STA#的下降沿
// 上面两个串口同步码应该连续发送,如果不连续,那么间隔时间不能超过20mS,否则命令无效
RI0 = 0;
mSendByte ( cmd ); // 写入命令码
mSendByte ( len ); // 写入后续参数的长度
if ( len ) // 有参数
{
for ( i = 0; i != len; i ++ )
mSendByte ( mCmdParam.Other.mBuffer[ i ] ); // 依次写入参数
}
while ( 1 ) // 处理数据传输,直到操作完成才退出
{
status = mRecvByte ( ); // 等待模块完成操作并返回操作状态
// 操作成功
if ( status == ERR_SUCCESS )
{
i = mRecvByte ( ); // 返回结果数据的长度
if ( i ) // 有结果数据
{
j = 0;
do // 使用do+while结构是因为其效率高于for
{
mCmdParam.Other.mBuffer[ j++ ] = mRecvByte ( ); // 接收结果数据并保存到参数结构中
} while ( -- i );
}
break; // 操作成功返回
}
// 正在从U盘读数据块,请求数据读出
else if ( status == USB_INT_DISK_READ )
{
i = 64;
do
{
*buffer++ = mRecvByte ( ); // 依次接收64字节的数据
} while ( --i );
}
// 正在向U盘写数据块,请求数据写入
else if ( status == USB_INT_DISK_WRITE )
{
i = 64;
do
{
mSendByte ( *buffer++ ); // 依次发送64字节的数据
} while ( --i );
}
// 操作失败
else
{
if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 10 ); // U盘刚刚连接或者断开,应该延时几十毫秒再操作
break; // 操作失败返回
}
}
return( status );
}
#endif
//*********************************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -