📄 ch375.c.bak
字号:
#ifndef __CH375_C__
#define __CH375_C__
#endif
#include "head.h"
#include "ch375inc.h"
#include "usbDef.h"
#include "descriptor.h"
#include "ch375.h"
#include "mcuFun.h"
#include "uart.h"
#define CMD_PORT XBYTE[0x7fff]
#define DAT_PORT XBYTE[0x3fff]
extern uint8 eaCount, debug;
extern uint16 tCount;
extern uint8 idata ep1Buf[8];
extern unsigned char RECV_LEN; // 刚接收到的数据的长度
extern unsigned char RECV_BUFFER[ CH375_MAX_DATA_LEN ]; /* 数据缓冲区,用于保存接收到的下传数据,长度为0到64字节 */
extern unsigned char *cmd_buf;
extern unsigned char *ret_buf;
extern unsigned char mVarSetupRequest; // USB请求码
extern unsigned char mVarSetupLength; // 后续数据长度
extern unsigned char * VarSetupDescr; // 描述符偏移地址
extern unsigned char VarUsbAddress ; //USB设备地址
extern bit CH375FLAGERR; //错误清0
extern bit CH375CONFLAG; //配置标志
extern mREQUEST_PACKET request;
sbit led = P1^0;
/* 与CH372/CH375有关的基本I/O操作 */
/* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
void CH375_WR_CMD_PORT( unsigned char cmd )
{
_nop_();
CMD_PORT=cmd;
}
//向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
void CH375_WR_DAT_PORT( unsigned char dat )
{
_nop_();
DAT_PORT=dat;
}
// 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
unsigned char CH375_RD_DAT_PORT(void)
{
_nop_();
return(DAT_PORT);
}
//----------------------------------------
//设置CH37X的工作模式
//如果设置不成功的话, 指示灯会闪烁
//----------------------------------------
void set_usb_mode( unsigned char mode )
{
unsigned char i;
unsigned char RD_Data;
CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
CH375_WR_DAT_PORT( mode );
for( i=100; i!=0; i-- ) // 等待设置模式操作完成,不超过30uS
{
RD_Data=CH375_RD_DAT_PORT();
if( RD_Data == CMD_RET_SUCCESS )
{
if(debug) uartPrint("set usb mode % ok\n\r", &mode, 1);
return; // 成功
}
}
while(1)
{
flash_led(); // CH375出错
}
}
//ch375硬复位
void disConnect()
{
CH375_WR_CMD_PORT( CMD_RESET_ALL ); //似乎是他模拟了一次插拔
delay1s();
}
//-----------------------------------
//CH375初始化子程序
//先检查CH375工作是否正常
//然后设置工作模式
//-----------------------------------
void CH375_Init( void )
{
unsigned char i, k;
unsigned char RD_Data;
// 测试CH375是否正常工作
for( k=100; k!=0; k-- )
{
CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); // 测试CH375是否正常工作
i = 0x5A;
CH375_WR_DAT_PORT( i ); // 写入测试数据
i = ~i; // 返回数据应该是测试数据取反
RD_Data = CH375_RD_DAT_PORT();
if ( RD_Data != i ) // CH375不正常
{
for ( i=5; i!=0; i-- )
{
CH375_WR_CMD_PORT( CMD_RESET_ALL ); // 多次重复发命令,执行硬件复位
}
delay50ms(); // 延时50ms
}
else
{
break;
}
}
if( k==0 )
{
while(1)
{
flash_led(); // CH375出错
}
}
/*
#ifdef MY_USB_VENDOR_ID
#ifdef MY_USB_DEVICE_ID
// 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID,
// 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改
CH375_WR_CMD_PORT( CMD_SET_USB_ID ); // 设置外部自定义的USB设备VID和PID,可选操作
CH375_WR_DAT_PORT( (unsigned char)MY_USB_VENDOR_ID ); // 写入厂商ID的低字节
CH375_WR_DAT_PORT( (unsigned char)(MY_USB_VENDOR_ID>>8) ); // 写入厂商ID的高字节
CH375_WR_DAT_PORT( (unsigned char)MY_USB_DEVICE_ID ); // 写入设备ID的低字节
CH375_WR_DAT_PORT( (unsigned char)(MY_USB_DEVICE_ID>>8) ); // 写入设备ID的高字节
#endif
#endif
*/
/* 设置USB工作模式, 必要操作 */
set_usb_mode( 1 ); //外部固件模式
//set_usb_mode( 2 ); //内部固件模式
}
//---------------------------------
//函数说明: 端点0数据上传
//上传的数据的长度放在变量
//mVarSetupLength中, 数据放在
//结构request中
//---------------------------------
void mCh375Ep0Up(void)
{
unsigned char i,len;
if( mVarSetupLength ) //长度不为0传输具体长度的数据
{
if( mVarSetupLength<=8 )
{
len=mVarSetupLength;
mVarSetupLength=0;
} //长度小于8则传输要求的长度
else
{
len=8;
mVarSetupLength-=8;
} //长度大于8则传输8个,切总长度减8
CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); //发出写端点0的命令
CH375_WR_DAT_PORT( len ); //写入长度
for( i=0; i!=len; i++ )
{
CH375_WR_DAT_PORT( request.buffer[i] ); //循环写入数据
}
if(debug) uartPrint("EP0_UP dat: %\n\r", request.buffer, len);
}
else
{
CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); //发出写端点0的命令
CH375_WR_DAT_PORT( 0 ); //上传0长度数据,这是一个状态阶段
if(debug) uartPutStr("NO data left!\n\r");
}
}
//-------------------------------------
//函数名: ep1Up
//作用: 端点1上传数据, 把数
// 据写入缓冲区一般在调用它后,
// 要把缓冲区释放
//参数: 要发送的数据长度
//-------------------------------------
void ep1Up(uint8 len)
{
uint8 i;
if(0!=len)
{
CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 );
CH375_WR_DAT_PORT( len );
for(i=0; i<len; i++)
{
CH375_WR_DAT_PORT( ep1Buf[i] );
}
}
}
//-----------------------------------------------------
//函数名: mCh375DesUp
//作用: 复制描述符放到request结构中
// 变量*VarSetupDescr指向描述中
//参数: 无
//----------------------------------------------------
void mCh375DesUp(void)
{
unsigned char k;
for (k=0; k!=8; k++ )
{
request.buffer[k]=*VarSetupDescr; //依次复制8个描述符,
VarSetupDescr++;
}
}
//-------------------------------------------------------
//函数名: rdData
//作用: 读取当前结点的数据
//参数: 无
//返回: 读取得数据的长度
//-------------------------------------------------------
uint8 rdData()
{
uint8 length, *ret_buf;
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区
length = CH375_RD_DAT_PORT(); // 首先读取后续数据长度
if ( 0 != length ) // 如果长度为0则不处理
{
RECV_LEN = length; // 命令包的数据长度
ret_buf = RECV_BUFFER; // 接收缓冲区
while ( length -- )
{
*ret_buf = CH375_RD_DAT_PORT();
ret_buf++;
}
return(RECV_LEN);
}
else
{
return(0);
}
}
//-------------------------------
//函数名: mCh375Interrupt
//作用: CH375中断处理
//参数:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -