⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.h

📁 usb接口芯片CH375设备端头文件
💻 H
字号:

///////////////////////////////////////////////////////
/////////////////for usb ch375/////////////////////////
///////////////////////////////////////////////////////

//命令定义
#define	CMD_RESET_ALL		        0x0500            //执行硬件复位
#define	CMD_CHECK_EXIST		        0x0600            //测试工作状态
#define	SET_USB_ID                  0x1200           //设置厂商识别码VID和产品的识别码PID
#define	CMD_SET_USB_MODE	        0x1500            //设置USB工作模式
#define	CMD_GET_STATUS		        0x2200            //获取中断状态并取消请求
#define	CMD_UNLOCK_USB		        0x2300            //释放当前USB缓冲区
#define	CMD_RD_USB_DATA		        0x2800            //从当前USB中断的端点缓冲区读取数据块并释放当前缓冲区
#define	CMD_WR_USB_DATA5	        0x2A00			 //向USB端点1的发送缓冲区写入数据块 
#define	CMD_WR_USB_DATA7	        0x2B00		     //向USB端点2的发送缓冲区写入数据块 

//中断状态值定义
#define	USB_INT_EP1_IN		        0x09			// USB端点1的IN……发送完毕
#define	USB_INT_EP2_OUT		        0x02			// USB端点2的OUT……接受到数据
#define	USB_INT_EP2_IN		        0x0A			// USB端点2的IN……发送完数据

//操作状态值定义
#define	CMD_RET_SUCCESS		        0x5100			// 命令操作成功 
#define	CMD_RET_ABORT		        0x5F00			// 命令操作失败 

#define DELAY_START_VALUE		3	  // 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2



// 延时1微秒,不精确,需要根据硬件实际情况调整
void    Delay1us(void)
{
#if DELAY_START_VALUE != 0
	uchar i;
	for ( i=DELAY_START_VALUE; i!=0; i-- );
#endif
}

// 延时2微秒,不精确,需要根据硬件实际情况调整 
void	Delay2us(void)
{
       uchar i;
       for ( i=DELAY_START_VALUE*2+1; i!=0; i-- );
}

// 与CH372/CH375有关的基本I/O操作 

void CH375_WR_CMD_PORT( uchar cmd ) // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 
{
        
       P_IOB_Data=P_IOB_Data|cmd;                  //写要传输的命令
       P_IOB_Data=P_IOB_Data|0x0008; 
	   P_IOB_Data=P_IOB_Data&0xFF9F;              //设置为写命令 
	   /*CH372_CS_ON;
        CH372_CMD_PORT;
        CH372_RD_OFF;
        CH372_WR_ON;*/
	   //P_IOB_Data=0X0011&P_IOB_Data;
	   

        Delay2us();
       P_IOB_Data=0x0076;//停止传输
}

void CH375_WR_DAT_PORT( uchar dat )  // 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 
{
	    uchar tmp;
		tmp=dat<<2;        /////////??????????????????//////////////////////////////////////////////////
        P_IOB_Data=P_IOB_Data|temp;                //写要传输的数据
	    P_IOB_Data=P_IOB_Data&0xFF97;             //设置为写数据
        /*CH372_SET_OUT;
        CH372_CS_ON;
        CH372_DATA_PORT;
        CH372_RD_OFF;*/
        Delay2us();
        P_IOB_Data=0x0076;                        //停止传输   	
}
uchar CH375_RD_DAT_PORT( void )      // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 
{
        uchar tmp;
        tmp=0;
	    P_IOB_Data=P_IOB_Data&0xFFA7;             //设置为读数据
        /*CH372_SET_IN;
        CH372_CS_ON;
        CH372_DATA_PORT;
        CH372_WR_OFF;
        CH372_RD_ON;*/
        Delay2us();
        tmp=P_IOB_Data>>2;           ////??????????????? ///////////////////////??????????????????????
		Delay1us();
        P_IOB_Data=0x0076;                        //停止传输      	
	return tmp;
}
//CH375初始化子程序 
/*B口初始化
dir=0xfff4
attrib=0xfff4
data=0x0076
*/
void	CH375_Init( void )
{
	typedef unsigned char uchar;
	uchar i;
    /*CH375_WR_CMD_PORT( SET_USB_ID );              // 设置厂商
    CH375_WR_DAT_PORT( 14 );                      // 设置厂商VID低字节
	CH375_WR_DAT_PORT( 23 );                      // 设置厂商VID高字节 
	CH375_WR_DAT_PORT( 0 );                       // 设置厂商PID低字节 
	CH375_WR_DAT_PORT( 1 );                       // 设置厂商PID高字节 
	Delay1us();*/

	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );        // 设置USB工作模式, 必要操作 
	CH375_WR_DAT_PORT( 2 );                       // 设置为使用内置固件的USB设备方式 

	for ( i=100; i!=0; i-- )
	{
	    if ( CH375_RD_DAT_PORT() == CMD_RET_SUCCESS )
	    break;                                     //等待操作成功,通常需要等待10uS-20uS 
	}

}
//CH375中断服务程序,假定CH375的INT#引脚连接到单片机的INT0,使用寄存器组1
#pragma vector=PORT2_VECTOR
__interrupt void CH375Interrupt( void )
{
	uchar			cnt;
	uchar			dat;
        uchar IntStatus;
    if(P2IFG&0x10)
    {
	CH375_WR_CMD_PORT(0x2200H);                       /*CMD_GET_STATUS 获取中断状态并取消中断请求 */
	IntStatus = CH375_RD_DAT_PORT( );              /* 获取中断状态 */
                                                       /* IE0 = 0;  清中断标志,与单片机硬件有关,对应于INT0中断 */
	if ( IntStatus == USB_INT_EP2_OUT )            /* 批量端点下传成功,接收到命令包 */
	{
		CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
		cnt = CH375_RD_DAT_PORT( );            /* 首先读取后续数据长度 */
		for (dat=0;dat<cnt;dat++)
		{
		    USBbuf[dat]=CH375_RD_DAT_PORT( );   /* 接收命令包的数据 */
		}
		USB_GET = 1;
	}
	else if ( IntStatus == USB_INT_EP2_IN )         /* 批量数据发送成功,状态包已发送 */
	{
	     CH375_WR_CMD_PORT( CMD_UNLOCK_USB );       /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */
	}
	else if ( IntStatus == USB_INT_EP1_IN )         /* 中断数据发送成功,本程序未用到 */
	{
	     CH375_WR_CMD_PORT( CMD_UNLOCK_USB );       /* 释放当前USB缓冲区 */
	}
    }
    else if(P2IFG&0x20)
    {
        if(Clock_Cnt>0)
        {
            Clock_Cnt--;
            if(Clock_Cnt==0)
            {
                Page = Main_Page;
                Renew_Page = 0;
                KEYCODE = 0;
            }
        }
    }
    P2IFG = 0x00;
}
//----------------------------------------------------------------------------------------------------------
void USB_Send_Data(uchar a[],uchar cnt)
{
     uchar i;
     CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  // 向USB端点2的发送缓冲区写入数据块 
     CH375_WR_DAT_PORT( cnt );               // 首先写入后续数据长度 
     for(i=0;i<cnt;i++)
     {
	  CH375_WR_DAT_PORT( a[i] );             // 写入数据到CH375 
     }
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -