📄 ch375h.lst
字号:
// 如果串口波特率较低,不能满足在2mS传输64字节的要求,那么对于有些U盘将无法工作或者导致数据丢失
void CH375_PORT_INIT( void )
{
SCON = 0xD0; // 设置串口为9位数据
}
//-------------------------------------------------------------------------------------------------
// 外部定义的被CH375程序库调用的子程序,向CH375写命令
void xWriteCH375Cmd( UINT8 mCmd )
{
TI = 0;
TB8 = 1;
SBUF = mCmd;
while ( TI == 0 );
}
//-------------------------------------------------------------------------------------------------
// 外部定义的被CH375程序库调用的子程序,向CH375写数据
void xWriteCH375Data( UINT8 mData )
{
TI = 0;
TB8 = 0;
SBUF = mData;
while ( TI == 0 );
}
//-------------------------------------------------------------------------------------------------
// 外部定义的被CH375程序库调用的子程序,从CH375读数据
UINT8 xReadCH375Data( void )
C51 COMPILER V7.20 CH375H 03/07/2006 16:55:21 PAGE 4
{
while ( RI == 0 );
RI = 0;
return( SBUF );
}
#endif
183
184 //********************************************************************************************************
-********
185 //--------------------------------------------------------------------------------------------------------
---------
186 // 自行编写的子程序,用以取代 CH375HF?.H 中的提供的默认子程序
187 //--------------------------------------------------------------------------------------------------------
---------
188 //********************************************************************************************************
-********
189 //
190 //-------------------------------------------------------------------------------------------------
191 #if UseCH375LIB == 1
192 //=================================================================================================
193 // 中断状态查询处理子程序
194 //=================================================================================================
195 //
196 #ifdef NO_DEFAULT_CH375_INT
197 // 在应用程序中定义 NO_DEFAULT_CH375_INT 可以禁止默认的中断处理程序,然后用自行编写的程序代替它
198 //-------------------------------------------------------------------------------------------------
199 //-------------------------------------------------------------------------------------------------
200 #if LIB_CFG_INT_EN == 0
201 // CH375的INT#引脚连接方式为"查询方式"
202 //-------------------------------------------------------------------------------------------------
203 // 查询 CH375 中断并更新中断状态
204 void xQueryInterrupt( void )
205 {
206 1 while ( CH375_INT_WIRE ); // 如果CH375的中断引脚输出高电平则等待
207 1 // if( !CH375_INT_WIRE ) // 中断请求
208 1 // {
209 1 xWriteCH375Cmd( CMD_GET_STATUS ); // 获取当前中断状态
210 1 CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作无意义,用于至少延时2uS
211 1 CH375IntStatus = xReadCH375Data( ); // 获取中断状态
212 1 if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; // 检测到USB设备断开事件
213 1 else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; // 检测到USB设备连接事件
214 1 // }
215 1 }
216
217 //-------------------------------------------------------------------------------------------------
218 #else
// LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式"
//-------------------------------------------------------------------------------------------------
// 查询中断状态,等待硬件中断
void xQueryInterrupt( void )
{
while ( CH375IntStatus == 0 ); // 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为
-非0的实际中断状态后返回
}
// CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断
void CH375Interrupt( void ) interrupt CH375_INT_NO
{
CH375_CMD_PORT = CMD_GET_STATUS; // 获取中断状态并取消中断请求
CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作无意义,用于至少延时2uS
CH375IntStatus = CH375_DAT_PORT; // 获取中断状态
C51 COMPILER V7.20 CH375H 03/07/2006 16:55:21 PAGE 5
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; // 检测到USB设备断开事件
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; // 检测到USB设备连接事件
#ifdef CLEAR_INT_MARK
CLEAR_INT_MARK( ); // 某些单片机需要由软件清除中断标志
#endif
}
#endif
240
241 //-------------------------------------------------------------------------------------------------
242 #endif
243
244 //=================================================================================================
245 // 用于从CH375读取文件数据到外部缓冲区子程序
246 // 用于从外部缓冲区读取文件数据到CH375子程序
247 //=================================================================================================
248 //
249 #if LIB_CFG_FILE_IO == 0
// 文件读写的数据的复制方式为"外部子程序"
//-------------------------------------------------------------------------------------------------
//
#ifndef LIB_CFG_FILE_IO_DEFAULT
// 如果应用程序中定义该值则使用默认"外部子程序",否则应该自行编写程序代替
//-------------------------------------------------------------------------------------------------
//
unsigned char xdata *current_buffer; // 保存文件数据读写时的缓冲区的当前指针,由应用程序在调用CH375FileRead
-X和CH375FileWriteX子程序前设置初值
// 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileReadX调用
void xWriteToExtBuf( UINT8 mLength )
{
// if ( (UINT16)current_buffer + mLength >= (UINT16)&FILE_DATA_BUF + sizeof( FILE_DATA_BUF ) ) return; //
- 防止缓冲区溢出
if ( mLength )
{
do // 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64
{
*current_buffer = CH375_DAT_PORT; // 读出数据并保存,可以用这种方式将文件数据保存到单片机的各种串行存储
-器中
current_buffer ++;
} while ( -- mLength );
} // 复制上述数据的总时间不得超过2mS
else // 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自
-动恢复,无需下面的两行程序
{
current_buffer += (UINT16)mCmdParam.ReadX.mDataBuffer; // mDataBuffer中为负值
mCmdParam.ReadX.mDataBuffer = 0; // 为了支持重试,在调用CH375FileReadX之前也应该清0
}
}
#ifdef EN_DISK_WRITE
//-------------------------------------------------------------------------------------------------
// 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用
void xReadFromExtBuf( UINT8 mLength )
{
if ( mLength )
{
do // 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64
{
CH375_DAT_PORT = *current_buffer; // 将数据写入,可以用这种方式从单片机的各种串行存储器中取出文件数据
current_buffer ++;
} while ( -- mLength );
} // 复制上述数据的总时间不得超过2mS
C51 COMPILER V7.20 CH375H 03/07/2006 16:55:21 PAGE 6
else // 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -