📄 isr.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不带DMA控制功能
//*************************************************************************
*/
#include <stdio.h>
#include <string.h>
#include <reg51.h> /* special function register declarations */
#include "isr.h"
#include "mainloop.h"
#include "protozlg.h"
#define uchar unsigned char
#define uint unsigned int
sbit POWER=P1^0;
sbit RAMCS=P1^4;
sbit A15=P2^7;
sbit PCS=P3^4;
sbit JCS=P3^5;
sbit A0=P3^0;
sbit A1=P3^1;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit WRITE=P3^6;
sbit READ=P3^7;
#define MAX_ORDER 5
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;
unsigned int data d12_addr;
extern 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;
rem_cs();
rev_cs();
//厂商请求入口地址
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;
// D12SUSPD = 0;
disconnect_USB();
for (clk_cnt=0;clk_cnt<=0x9000;clk_cnt++) {}
connect_USB();
}
//断开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);
}
//总线复位服务子程序
void D12_busreset(void)
{
//可添加用户代码(进行检测到总线复位的操作)
}
//DMA操作结束中断服务子程序
void dma_eot(void)
{
//可添加用户代码(进行检测DMA操作结束的操作)
}
//D12挂起服务子程序
void d12_suspend(void)
{
//可添加用户代码
}
//端点1输出中断操作
void ep1_txdone(void)
{
unsigned char c0,c1;
if (RAMCS == 0)
c0 = 0;
else
c0 = 1;
if (MCU_D12CS == 0)
c1 = 0;
else
c1 = 1;
RAMCS = 1;
MCU_D12CS = 0;
D12_ReadLastTransactionStatus(3);//复位中断寄存器
if (c0 == 1)
RAMCS = 1;
if (c1 == 1)
MCU_D12CS = 1;
if (c0 == 0)
RAMCS = 0;
if (c1 == 0)
MCU_D12CS = 0;
}
//端点1输入中断操作
void ep1_rxdone(void)
{
unsigned char len;
unsigned char c0,c1;
if (RAMCS == 0)
c0 = 0;
else
c0 = 1;
if (MCU_D12CS == 0)
c1 = 0;
else
c1 = 1;
RAMCS = 1;
MCU_D12CS = 0;
D12_ReadLastTransactionStatus(2);//复位中断寄存器
len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取端点1接收数据
if (len != 0)
bEPPflags.bits.ep1_rxdone = 1;//标志端点1接收到数据
if (c0 == 1)
RAMCS = 1;
if (c1 == 1)
MCU_D12CS = 1;
if (c0 == 0)
RAMCS = 0;
if (c1 == 0)
MCU_D12CS = 0;
}
//端点2输出中断操作
void ep2_txdone(void)
{
unsigned char c0,c1;
if (RAMCS == 0)
c0 = 0;
else
c0 = 1;
if (MCU_D12CS == 0)
c1 = 0;
else
c1 = 1;
RAMCS = 1;
MCU_D12CS = 0;
D12_ReadLastTransactionStatus(5);//复位中断寄存器
//可添加用户代码(进行检测端点号5IN令牌的操作)
if(byte_cnt.word>0)
{
if(byte_cnt.word<32)
{
D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
byte_cnt.word=0;
}
else
{
byte_cnt.word=byte_cnt.word-32;
D12_WriteEndpoint(5, 32, EpBuf);
}
}
if (c0 == 1)
RAMCS = 1;
if (c1 == 1)
MCU_D12CS = 1;
if (c0 == 0)
RAMCS = 0;
if (c1 == 0)
MCU_D12CS = 0;
}
//端点2输入中断操作
void ep2_rxdone(void)
{
unsigned char len;
unsigned char c0,c1;
if (RAMCS == 0)
c0 = 0;
else
c0 = 1;
if (MCU_D12CS == 0)
c1 = 0;
else
c1 = 1;
RAMCS = 1;
MCU_D12CS = 0;
D12_ReadLastTransactionStatus(4);//复位中断寄存器
len = D12_ReadEndpoint(4, 32, EpBuf);//读取端点2接收数据
if (bEPPflags.bits.ep2buf_full)
len = D12_ReadEndpoint(4, 32, EpBuf);//读取端点2接收数据
if (len != 0)
bEPPflags.bits.ep2_rxdone = 1;//标志端点2接收到数据
if (c0 == 1)
RAMCS = 1;
if (c1 == 1)
MCU_D12CS = 1;
if (c0 == 0)
RAMCS = 0;
if (c1 == 0)
MCU_D12CS = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -