📄 ch375h.c
字号:
#if UseCH375LIB == 1
//=================================================================================================
// 中断状态查询处理子程序
//=================================================================================================
//
#ifdef NO_DEFAULT_CH375_INT
// 在应用程序中定义 NO_DEFAULT_CH375_INT 可以禁止默认的中断处理程序,然后用自行编写的程序代替它
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#if LIB_CFG_INT_EN == 0
// CH375的INT#引脚连接方式为"查询方式"
//-------------------------------------------------------------------------------------------------
// 查询 CH375 中断并更新中断状态
void xQueryInterrupt( void )
{
while ( CH375_INT_WIRE ); // 如果CH375的中断引脚输出高电平则等待
// if( !CH375_INT_WIRE ) // 中断请求
// {
xWriteCH375Cmd( CMD_GET_STATUS ); // 获取当前中断状态
CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作无意义,用于至少延时2uS
CH375IntStatus = xReadCH375Data( ); // 获取中断状态
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; // 检测到USB设备断开事件
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; // 检测到USB设备连接事件
// }
}
//-------------------------------------------------------------------------------------------------
#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; // 获取中断状态
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
//-------------------------------------------------------------------------------------------------
#endif
//=================================================================================================
// 用于从CH375读取文件数据到外部缓冲区子程序
// 用于从外部缓冲区读取文件数据到CH375子程序
//=================================================================================================
//
#if LIB_CFG_FILE_IO == 0
// 文件读写的数据的复制方式为"外部子程序"
//-------------------------------------------------------------------------------------------------
//
#ifndef LIB_CFG_FILE_IO_DEFAULT
// 如果应用程序中定义该值则使用默认"外部子程序",否则应该自行编写程序代替
//-------------------------------------------------------------------------------------------------
//
unsigned char xdata *current_buffer; // 保存文件数据读写时的缓冲区的当前指针,由应用程序在调用CH375FileReadX和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
else // 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序
{
current_buffer += (UINT16)mCmdParam.WriteX.mDataBuffer; // mDataBuffer中为负值
mCmdParam.WriteX.mDataBuffer = 0; // 为了支持重试,在调用CH375FileWriteX之前也应该清0
}
}
#endif
#endif
//-------------------------------------------------------------------------------------------------
#endif
//----------------------------------------------------------------------------------------------------------------
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//----------------------------------------------------------------------------------------------------------------
//****************************************************************************************************************
//----------------------------------------------------------------------------------------------------------------
// 自行编写的子程序, 以供外界调用
//----------------------------------------------------------------------------------------------------------------
//****************************************************************************************************************
//
//-------------------------------------------------------------------------------------------------
// MCU = 单片机
#if MCUMode == 0
//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度
UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度
UINT8 mCopyCodeStringToIRAM1( UINT8 idata *iDestination, UINT8 xdata *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度
UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
#endif
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#endif
//-------------------------------------------------------------------------------------------------
// 如果错误则停止运行并显示错误状态
void mStopIfError( UINT8 iErrCode )
{
if ( iErrCode == 0 ) return;
while( 1 )
{
flash_led( ); // CH375出错
}
// printf( "Error status, %02X\n", (UINT16)iErrCode );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -