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

📄 isr.c

📁 MCU 通过i2c 总线读写eeprom, i2c 读写程序是软件仿真方式来实现
💻 C
字号:
/*
   //*************************************************************************
   //
   //                  		ZLGMCU
   //				www.zlgmcu.com
   // File Name:	isr.C
   // Revision:		0.4(2002-07-08)
   // Author:		Liu Ying Bin
   // Use library:  USB51S.LIB
   // Note:			USB51S.LIB has not DMA function
   //*************************************************************************
   */


#include <stdio.h>
#include <string.h>
#include <reg51.h>    
#include "isr.h"

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;
unsigned int data d12_addr;
byte_count byte_cnt;
unsigned int data D12_DATA;
unsigned int data D12_COMMAND;


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

//vendor request input address
code void (*VendorDeviceRequest[])(void) =
{
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved
};

//USB bus reconnect(first disconnect then connect)
void reconnect_USB(void)
{
	unsigned long clk_cnt;

	D12SUSPD = 0;
	disconnect_USB();
	for (clk_cnt=0;clk_cnt<=0x9000;clk_cnt++) {}
	connect_USB();
}

//disconnect usb bus 
void disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}

//connect usb bus
void connect_USB(void)
{
	DISABLE;
	bEPPflags.value = 0;
	ENABLE;
	D12_SetDMA(0x0);//set D12 work mode
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}

//bus reset server sub-program
void D12_busreset(void)
{
//add program (check the bus reset operate)
}

//DMA operate end, interrupt server sub-system
void dma_eot(void)
{
//add program (check the bus reset operate)
}

//D12 to hang up server sub-program
void d12_suspend(void)
{
//add program
}

//endpoint1 output interrupt operate
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3);//reset interrupt register
	//add program 
}

//endpoint1 input interrupt operate
void ep1_rxdone(void)
{
	unsigned char len;
	D12_ReadLastTransactionStatus(2);//reset interrupt register
	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//read endpoint1 receive data
	if (len != 0)
		bEPPflags.bits.ep1_rxdone = 1;//flag endpoint1 receive data
}

//endpoint2 output interrupt operate
void ep2_txdone(void)
{
	D12_ReadLastTransactionStatus(5);//reset interrupt register
	//add program(check endpoint5 IN token-ring operate)
	if(byte_cnt.word>0)
	{
		if(byte_cnt.word<64)
		{
			D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
			byte_cnt.word=0;
		}
		else
		{
			byte_cnt.word=byte_cnt.word-64;
			D12_WriteEndpoint(5, 64, EpBuf);
		}
	}
}

//endpoint2 input interrupt operate
void ep2_rxdone(void)
{
	unsigned char len;
	D12_ReadLastTransactionStatus(4);//reset int
	len = D12_ReadEndpoint(4, 64, EpBuf);//read endpoint2 receive data
	if (bEPPflags.bits.ep2buf_full)
		len = D12_ReadEndpoint(4, 64, EpBuf);//read endpoint2 receive data
	if (len != 0)
		bEPPflags.bits.ep2_rxdone = 1;//flag endpoint2 receive data
}

⌨️ 快捷键说明

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