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

📄 d12driver.c

📁 PDIUSBD12的固件程序可能对开发USB1.1的兄弟有用
💻 C
字号:
//应用层

#include <reg52.h>
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Chap_9.h"
#include "Descriptor.h"
#include "D12Driver.h"

INT8U idata GenEpBuf[EP1_PACKET_SIZE];
INT8U idata EpBuf[EP2_PACKET_SIZE];


INT8U Init_D12(void)
{
	bEPPflags.value = 0;							//初始化USB事件标志变量

	Init_D12Port();									//初始化PDIUSBD12与51单片机连接的端口
	Rst_D12();
	reconnect_USB(); 

	/*if (D12_ReadChipID()!=0x1012)					//读取芯片ID号,如果不为1012H
		return 1;                					//则复位失败*/
 	return 0; 										//初始化成功
}

//USB事件处理函数
void usbserve(void)
{
	if (bEPPflags.bits.setup_packet)
	{
		DISABLE();
		bEPPflags.bits.setup_packet = 0;
		control_handler();							//调用请求处理子程序
		ENABLE();
	}

	if (bEPPflags.bits.bus_reset) 
	{
		DISABLE();
		bEPPflags.bits.bus_reset = 0;
		ENABLE();
		d12_busreset();
	} 

	if (bEPPflags.bits.suspend) 
	{
		DISABLE();
		bEPPflags.bits.suspend= 0;
		ENABLE();
		d12_suspend();
	}

	if  (bEPPflags.bits.timer) 
	{
         DISABLE();
         bEPPflags.bits.timer= 0;
         ENABLE();
         if(bEPPflags.bits.configuration)
             check_key_LED();  						//设备已配置,调用按键和LED处理程序
    }
}


void d12_busreset(void)
{
	//此次未用到
}


void dma_eot(void)
{
	//此次未用到
}

void d12_suspend(void)
{
    //为测试方便禁止挂起
}

void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3);				//清中断标志位
}

void ep1_rxdone(void)
{
	INT8U len;

	D12_ReadLastTransactionStatus(2);
	len = D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf);//读取缓冲区中的数据
	if(len != 0)
		bEPPflags.bits.ep1_rxdone = 1;				//标志接收到数据
}

void ep2_txdone(void)
{
	D12_ReadLastTransactionStatus(5);
}

void ep2_rxdone(void)
{
	INT8U len;
	
	D12_ReadLastTransactionStatus(4);
	len = D12_ReadEndpoint(4,EP2_PACKET_SIZE,EpBuf);
	if (len != 0)
		bEPPflags.bits.ep2_rxdone = 1;
}
//D12中断服务程序
void Usb_Exception(void)  interrupt 0
{
	INT16U i_st;
	
	DISABLE(); 									//进入D12中断服务程序时关中断

	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();			//读取PDIUSBD12中断寄存器值
	if(i_st != 0)
	{
		if(i_st & D12_INT_BUSRESET)
			bEPPflags.bits.bus_reset = 1;
		if(i_st & D12_INT_EOT)
			dma_eot();
		if(i_st & D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;
		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(i_st & D12_INT_ENDP2IN)
			ep2_txdone();
		if(i_st & D12_INT_ENDP2OUT)
			ep2_rxdone();
	}
   	bEPPflags.bits.in_isr = 0;
	
   	ENABLE();									//退出D12中断服务程序时开中断
}




void disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}	//SoftConnect 断开


void connect_USB(void)
{
	D12_SetDMA(0x00);
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}												//SoftConnect 连接上,并设置为无LazyClock,模式为非同步模式


void reconnect_USB(void)
{
	INT16U clk_cnt;
    MCU_LED0=0;
	MCU_LED1=0;
    MCU_D12SUSPD=0;
	D12_SetAddressEnable(0,1);
	D12_SetEndpointEnable(1);
	disconnect_USB();
    for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++);
    connect_USB();
    MCU_LED0=1;
	MCU_LED1=1;

}


void check_key_LED(void)
{
	static INT8 c,last_key= 0xf;
    c=MCU_SWM0& MCU_SWM1;
    c&= 0x0f;
    if(c!=last_key)
	D12_WriteEndpoint(3,1,&c);
	last_key= c;
	if(bEPPflags.bits.ep1_rxdone)
	{
		DISABLE();
		bEPPflags.bits.ep1_rxdone=0;
		ENABLE();
		MCU_LED0= !(GenEpBuf[3]&0x1);
		MCU_LED1= !(GenEpBuf[3]&0x2);
	}
}


INT16U Get_D12_FirmwareVer(void)
{
	return 0x0500;
}

⌨️ 快捷键说明

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