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

📄 isr.c

📁 D12的驱动程序
💻 C
字号:
/*
   //*************************************************************************
   //
   //                  		ZLGMCU
   //				www.zlgmcu.com
   // File Name:	ISR.C
   // Revision:		V0.2(2002-04-08)
   // Use library:  	USB51S.LIB
   // Note:		USB51S.LIB不带DMA控制功能
   //*************************************************************************
   */

#include <stdio.h>
#include <string.h>
#include <reg51.h>                /* special function register declarations   */
#include "isr.h"
#include "mainloop.h"
#include "protozlg.h"
#include "absacc.h"
#include "D12ci.h"

#define UINT unsigned int
#define UCHAR unsigned char

#define DAADDR XBYTE[0x7fff]
UCHAR  xdata *ad_addr;
UCHAR  xdata *da_addr;
/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;

/* ISR static vars */
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
unsigned char idata EpBuf[EP2_PACKET_SIZE];
IO_REQUEST idata ioRequest;

//厂商请求入口地址
code void (*VendorDeviceRequest[])(void) =
{
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	read_write_register,
	reserved,
	reserved,
	reserved
};

//USB总线重新连接(先断开,再连接)子程序
void reconnect_USB(void)
{
	unsigned long clk_cnt;
	//MCU_LED0 = 0;//亮LED显示(实际应用中可去掉)
//	MCU_LED1 = 0;//(实际应用中可去掉)

	D12SUSPD = 0;
	disconnect_USB();
	
    
	for (clk_cnt=0;clk_cnt<=0x9000;clk_cnt++){}
    
	connect_USB();
    
//	MCU_LED0 = 1;//灭LED显示(实际应用中可去掉)
//	MCU_LED1 = 1;//(实际应用中可去掉)
//for (clk_cnt=0;clk_cnt<=0x9000;clk_cnt++){}
}

//断开USB总线连接
void disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}

//连接到USB总线
void connect_USB(void)
{
	DISABLE;
	bEPPflags.value = 0;
	ENABLE;
	D12_SetDMA(0x0);//设置D12工作模式
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
//	report interupt add by zjl
//	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT |0x08, D12_SETTOONE | D12_CLOCK_12M); 
//	set iso-io mode by zjl
//	D12_SetMode(0x92, D12_SETTOONE | D12_CLOCK_12M); 
}


//总线复位中断服务子程序
void bus_reset(void)
{ /*
   int a;
   for(a=0;a<=20000;a++)  ;
	MCU_LED0 = 0;//灭LED显示(实际应用中可去掉)
	MCU_LED1 = 0;
	 for(a=0;a<=20000;a++)  ;
MCU_LED0 = 1;//灭LED显示(实际应用中可去掉)
	MCU_LED1 = 1;		//dtftrtsu857d88rrydgfgggggggggggggggggggggggg
	
*/
//可添加用户代码(进行检测到总线复位的操作)
}

//DMA操作结束中断服务子程序
void dma_eot(void)
{
//可添加用户代码(进行检测DMA操作结束的操作)
}

//端点1输出中断操作
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3);//复位中断寄存器
	//可添加用户代码(进行检测端点号3IN令牌的操作)

/*	ad_addr=&IN0;
	*ad_addr=0;	//启动转换*/

}

//端点1输入中断操作
void ep1_rxdone(void)
{
	unsigned char len;
//	unsigned char temp;
	D12_ReadLastTransactionStatus(2);//复位中断寄存器
	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取端点1接收数据
	da_addr=&DAADDR;
	*da_addr=GenEpBuf[3]; //这句话进行D/A转换

//	GenEpBuf[3]&=0xbf;
//	P1=0xb0|GenEpBuf[3];
	//P1=!GenEpBuf[3];	//modified by zoujl
	if (len != 0)
		bEPPflags.bits.ep1_rxdone = 1;//标志端点1接收到数据
}
/*
//端点2输出中断操作
void ep2_txdone(void)
{
//	unsigned char Ep5_st;
//	D12_ReadLastTransactionStatus(5);//复位中断寄存器
	D12_COMMAND = 0x45;		//clear last treat status
//	D12_WriteEndpoint(5, 64, EpBuf);
	D12_COMMAND = 0x05;
	D12_COMMAND = 0xFA;		//enable buffer sothat command in will be respond
	//可添加用户代码(进行检测端点号5IN令牌的操作)
}
*/
//端点2输入中断操作
void ep2_rxdone(void)
{
	unsigned char len;
	D12_ReadLastTransactionStatus(4);//复位中断寄存器
	len = D12_ReadEndpoint(4, 64, EpBuf);//读取端点2接收数据
	//if (len != 0);
	//	bEPPflags.bits.ep2_rxdone = 1;//标志端点1接收到数据
}

⌨️ 快捷键说明

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