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

📄 usbmainold.c

📁 记录仪
💻 C
📖 第 1 页 / 共 5 页
字号:
        else
		stall_ep0();
}

//-------------------------------------------------------------------------------------------set_address()设置地址
void set_address(void)
{       Clr_WDog();       //清w-dog
	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
		DEVICE_ADDRESS_MASK), 1);
	single_transmit(0, 0);
}

//------------------------------------------------------------------------------------------get_descriptor()获取描述符
void get_descriptor(void)
{
	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);                  //读取请求描述符类型;
        Clr_WDog();       //清w-dog
	if (bDescriptor == 0x01)                                        //USB_DEVICE_DESCRIPTOR_TYPE)    //0x01
        {                                                                                   //获取设备描述符;
		code_transmit((unsigned char code *)&DeviceDescr, 0x12);    // sizeof(USB_DEVICE_DESCRIPTOR));
	}
	else if (bDescriptor == 0x02)                  //USB_CONFIGURATION_DESCRIPTOR_TYPE)     //0x02;
        {
		code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);         //
	}
	else
		stall_ep0();
}

//---------------------------------------------------------------------------------------get_configuration获取配置
void get_configuration(void)
{
	unsigned char c = bEPPflags.bits.configuration;
        Clr_WDog();       //清w-dog
	single_transmit(&c, 1);                                              //返回配置值;
}

//---------------------------------------------------------------------------------------set_configuration()设置配置
void set_configuration(void)
{       Clr_WDog();       //清w-dog
	if (ControlData.DeviceRequest.wValue == 0)
        {
		//* put device in unconfigured state
		single_transmit(0, 0);                                       //发送响应;
		DISABLE;
		bEPPflags.bits.configuration = 0;                            //标记未配置;
		ENABLE;
		init_unconfig();                                             //进入地址状态,禁止0除外所有端点;
	}
        else if (ControlData.DeviceRequest.wValue == 1)
        {
		// Configure device  配置设置
		                                        //发送响应;

		init_unconfig();                                               //进入地址状态,禁止0除外所有端点;
		init_config();                                                 //配置处理,允许端点收发;

		DISABLE;
		bEPPflags.bits.configuration = 1;                              //标记已配置;
		ENABLE;
                single_transmit(0, 0);
	}
        else
		stall_ep0();
}

//---------------------------------------------------------------------------------get_interface()获取接口信息
void get_interface(void)
{
	unsigned char txdat = 0;        // Only/Current interface = 0           本设备只有一个接口;
	single_transmit(&txdat, 1);
         Clr_WDog();       //清w-dog
}

//--------------------------------------------------------------------------------set_interface()设置接口
void set_interface(void)
{      Clr_WDog();       //清w-dog
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
		single_transmit(0, 0);                                           //发送响应;
	else
		stall_ep0();
}

void init_unconfig(void)
{       Clr_WDog();       //清w-dog
	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
}

void init_config(void)
{       Clr_WDog();       //清w-dog
	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
}

//用户厂商请求
code void (*VendorDeviceRequest[])(void) =
{
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
        reserved,
//	read_write_register,
	reserved,
	reserved,
	reserved
};

//保留子程序;
void reserved(void)
{       Clr_WDog();       //清w-dog
	stall_ep0();                            //返回STALL;
}


//端点0,1有效
void stall_ep0(void)
{       Clr_WDog();       //清w-dog
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}


void single_transmit(unsigned char * buf, unsigned char len)
{       Clr_WDog();       //清w-dog
	if( len <= EP0_PACKET_SIZE)
        {
		D12_WriteEndpoint(1, len, buf);
	}
}

void code_transmit(unsigned char code * pRomData, unsigned short len)
{       Clr_WDog();       //清w-dog
	ControlData.wCount = 0;
	if(ControlData.wLength > len)
		ControlData.wLength = len;

	ControlData.pData = pRomData;
	if( ControlData.wLength >= EP0_PACKET_SIZE)         //16
        {	// 如果发送代码大于包长度
		D12_WriteEndpoint(1, 16, ControlData.pData);
		ControlData.wCount += EP0_PACKET_SIZE;

		DISABLE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
		ENABLE;
	}
	else
        {						//发送代码小于包长度
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);
		ControlData.wCount += ControlData.wLength;
		DISABLE;
		bEPPflags.bits.control_state = USB_IDLE;
		ENABLE;
	}
}




/**********************************************/
/*****************          *******************/
/***************  硬件提取层  *****************/
/******************         *******************/
/**********************************************/

void outportcmd(unsigned char value)         //输出命令
{

    *((unsigned char xdata *)D12_COMMAND)=value;
}
void outportdata(unsigned char value)       //输出数据
{
    *((unsigned char xdata *)D12_DATA)=value;
}

unsigned char inportb(unsigned int Addr)    //接受数据
{
    return *((unsigned char xdata *)Addr);
}

/**********************************************/
/*****************          *******************/
/***************    命令集    *****************/
/******************         *******************/
/**********************************************/
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)       //设置地址使能;
{       Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)      //usb中断服务标志;
		DISABLE;

	outportcmd(0xD0);
	if(bEnable)
		bAddress |= 0x80;           //设置地址使能;
	outportdata(bAddress);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetEndpointEnable(unsigned char bEnable)                                //设置端点使能;
{       Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportcmd(0xD8);
	if(bEnable)
		outportdata(1);             //普通,同步端点使能;
	else
		outportdata(0);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)                    //设置模式;
{       Clr_WDog();       //清w-dog
 	outportcmd(0xF3);
 	outportdata(bConfig);
 	outportdata(bClkDiv);
}

unsigned int D12_ReadInterruptRegister(void)                                     //读取中断寄存器;
{
	unsigned char b1,b2;
	unsigned int j1=0x0000;
        Clr_WDog();       //清w-dog
	outportcmd(0xF4);
	b1 = inportb(D12_DATA);
	b2 = inportb(D12_DATA);
        j1=(b2<<8);
	j1 +=b1 ;
	return j1;
}

unsigned char D12_SelectEndpoint(unsigned char bEndp)                              //端点选择;
{
	unsigned char c;
        Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportcmd(bEndp);
	c = inportb(D12_DATA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return c;                        //1满,0空;停止位1有效;
}

unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)                   //读取端点最后处理状态;
{       Clr_WDog();       //清w-dog
        outportcmd(0x40 + bEndp);
	return inportb(D12_DATA);
}

void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)           //设置端点状态
{       Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportcmd(0x40 + bEndp);
	outportdata(bStalled);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}


unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)      //读取端点数据;
{
	unsigned char xdata i, j;
        Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportcmd(endp);
        i=inportb(D12_DATA);			//选择端点
	if( (i & D12_FULLEMPTY) == 0)
        {	//如果缓冲区为空,则返回
		if(bEPPflags.bits.in_isr == 0)
			ENABLE;
		return 0;
	}

	outportcmd(0xF0);			//读缓冲区
	j = inportb(D12_DATA);
	j = inportb(D12_DATA);

	if(j > len)
		j = len;

	for(i=0; i<j; i++)
	{	*(buf+i) = inportb(D12_DATA);
                Clr_WDog();       //清w-dog
        }

	outportcmd(0xF2);				//缓冲区清空
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return j;
}
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)         //把数据写入端点;
{
	unsigned char xdata i;
        Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportcmd(endp);	//选择端点
	inportb(D12_DATA);		//读入满/空状态    《 无处理?〉

	outportcmd(0xF0);	//写缓冲区命令
	outportdata(0);
	outportdata(len);

	for(i=0; i<len; i++)
        {       Clr_WDog();       //清w-dog
		outportdata(*(buf+i));
        }

	outportcmd(0xFA);	//使缓冲区有效,在接受到下一个IN标志后将其送入主机;


	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return len;

}


unsigned char D12_WriteEndpoint5(unsigned char len)         //把数据写入端点2的缓冲区
{
	unsigned char xdata i;
        Clr_WDog();       //清w-dog
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportcmd(5);	//选择端点
	inportb(D12_DATA);		//读入满/空状态    《 无处理?〉

	outportcmd(0xF0);	//写缓冲区命令
	outportdata(0);
	outportdata(64);

	for(i=0; i<64; i++)
        {       Clr_WDog();       //清w-dog
		outportdata(MainEpBuf2[i]);
        }

	outportcmd(0xFA);	//使缓冲区有效,在接受到下一个IN标志后将其送入主机;

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
        if(len_tmp_data==7510 )
        {
        len_tmp_data=len;
        }
	return len;

}



void D12_AcknowledgeEndpoint(unsigned char endp)                            //端点应答处理;
{       Clr_WDog();       //清w-dog
	outportcmd(endp);	//选择端点
	outportcmd(0xF1);	//应答设置
	if(endp == 0)
		outportcmd(0xF2);	//缓冲区清零
}


//*********************************************************************//
//****************************             ****************************//
//****************************      ISR    ****************************//
//****************************             ****************************//
//*********************************************************************//

usb_isr() interrupt 2
{
        Clr_WDog();       //清w-dog
        EX1=0;

	fn_usb_isr();

	EX1=1;
}

void fn_usb_isr()
{
	unsigned int i_st;
        Clr_WDog();       //清w-dog
	bEPPflags.bits.in_isr = 1;

	i_st = D12_ReadInterruptRegister();

	if(i_st != 0)
 	{

		if(i_st & 0x02)                       //  控制输入
			ep0_txdone();
		if(i_st & 0x01)                       //  控制输出;0x01
			ep0_rxdone();
		if(i_st & 0x08)                       //     端点1输出;
			ep1_txdone();
		if(i_st & 0x04)                       //   端点1输入            //0x04
			ep1_rxdone();
		if(i_st & 0x20)                       //   端点2输出;              //0x20
			main_txdone();

⌨️ 快捷键说明

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