📄 d12ci.c
字号:
/**********************************************
USB固件编程
File Name: D12ci.C
Revision: 0.2(2004-05-28)
Author: LHP
Use library:
Note: 不带DMA控制功能
***********************************************/
#include <reg51.h>
#include "D12ci.h"
#define D12_COMMAND 0xff03
#define D12_DATA 0xff02
sbit A0=P3^0;
void outportb(unsigned int Addr,unsigned char Data);
unsigned char inportb(unsigned int Addr);
extern EPPFLAGS bEPPflags;
void outportb(unsigned int Addr,unsigned char Data)
{
if(Addr%2==1)
A0=1;
else
A0=0;
*((unsigned char xdata*)Addr)=Data;
}
unsigned char inportb(unsigned int Addr)
{//从D12读取数据,addr必须是偶数,此时数据线上传输的是数据,所以直接就让A0=0
A0=0;
return *((unsigned char xdata*)Addr);
}
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = 0xD0;
outportb(D12_COMMAND,0xD0);
if(bEnable)
bAddress |= 0x80;
//A0=0;
//D12_DATA = bAddress;
outportb(D12_DATA,bAddress);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
void D12_SetEndpointEnable(unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = 0xD8;
outportb(D12_COMMAND,0xD8);
// A0=0;
if(bEnable)
// D12_DATA = 1;
outportb(D12_DATA,1);
else
//D12_DATA = 0;
outportb(D12_DATA,0);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = 0xF3;
outportb(D12_COMMAND,0xF3);
// A0=0;
// D12_DATA = bConfig;
// D12_DATA = bClkDiv;
outportb(D12_DATA,bConfig);
outportb(D12_DATA,bClkDiv);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
/*
void D12_SetDMA(unsigned char bMode)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
D12_COMMAND = 0xFB;
D12_DATA = bMode;
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
*/
unsigned short D12_ReadInterruptRegister(void)
{
unsigned char b1;
unsigned int j;
// A0=1;
// D12_COMMAND = 0xF4;
outportb(D12_COMMAND,0xF4);
// A0=0;
// b1 = D12_DATA;
// j = D12_DATA;
b1=inportb(D12_DATA);
j=inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
unsigned char c;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = bEndp;
outportb(D12_COMMAND,bEndp);
// A0=0;
// c = D12_DATA;
c=inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return c;
}
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
// A0=1;
// D12_COMMAND = 0x40 + bEndp;
outportb(D12_COMMAND,0x40+bEndp);
// A0=0;
//return D12_DATA;
return inportb(D12_DATA);
}
/*
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
unsigned char c;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
D12_COMMAND = 0x40 + bEndp;
c = D12_DATA;
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return c;
}
*/
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = 0x40 + bEndp;
// A0=0;
// D12_DATA = bStalled;
outportb(D12_COMMAND,0x40+bEndp);
outportb(D12_DATA,bStalled);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
/*
void D12_SendResume(void)
{
D12_COMMAND = 0xF6;
}
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned short i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
D12_COMMAND = 0xF5;
i = D12_DATA;
j = D12_DATA;
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return i;
}
*/
/*
unsigned short D12_ReadChipID(void)
{
unsigned short i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(portbase+D12_COMMAND, 0xFD);
i=inportb(portbase+D12_DATA);
j=inportb(portbase+D12_DATA);
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return i;
}
*/
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i, j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = endp;
// A0=0;
// i=D12_DATA;
outportb(D12_COMMAND,endp);
i=inportb(D12_DATA);
if((i & D12_FULLEMPTY) == 0)
{
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return 0;
}
// A0=1;
// D12_COMMAND = 0xF0;
// A0=0;
// j = D12_DATA;
// j = D12_DATA;
outportb(D12_COMMAND,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);
//A0=1;
//D12_COMMAND = 0xF2;
outportb(D12_COMMAND,0xF2);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return j;
}
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len,unsigned char * buf) //reentrant
{
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = endp;
outportb(D12_COMMAND,endp);
//A0=0;
//D12_DATA;
inportb(D12_DATA);
//A0=1;
//D12_COMMAND = 0xF0;
outportb(D12_COMMAND,0xF0);
//A0=0;
//D12_DATA = 0;
//D12_DATA = len;
outportb(D12_DATA,0);
outportb(D12_DATA,len);
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i));
//A0=1;
//D12_COMMAND = 0xFA;
outportb(D12_COMMAND,0xFA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return len;
}
unsigned char D12_WriteEndpoint_ISR(unsigned char endp, unsigned char len,unsigned char * buf) //reentrant
{
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
// A0=1;
// D12_COMMAND = endp;
outportb(D12_COMMAND,endp);
//A0=0;
//D12_DATA;
inportb(D12_DATA);
//A0=1;
//D12_COMMAND = 0xF0;
outportb(D12_COMMAND,0xF0);
//A0=0;
//D12_DATA = 0;
//D12_DATA = len;
outportb(D12_DATA,0);
outportb(D12_DATA,len);
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i));
//A0=1;
//D12_COMMAND = 0xFA;
outportb(D12_COMMAND,0xFA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return len;
}
void D12_AcknowledgeEndpoint(unsigned char endp)
{
// A0=1;
// D12_COMMAND = endp;
outportb(D12_COMMAND,endp);
outportb(D12_COMMAND,0xF1);
// D12_COMMAND = 0xF1;
if(endp == 0)
// D12_COMMAND = 0xF2;
outportb(D12_COMMAND,0xF2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -