📄 d12ci.c
字号:
#include "EPPHAL.H"
#define D12_COMMAND 1
#define D12_DATA 0
#define D12_FULLEMPTY 0x01
#include "d12.h"
#include "uart.h"
sbit USB_A0 = 0xB5;
sbit USB_WR = 0xB6;
sbit USB_RD = 0xB7;
extern EPPFLAGS bEPPflags;
//使地址使能
void D12_SetAddress_Enable(uint8 bAddress,uint8 bEnable)
{
outportb(D12_COMMAND,0XD0);
if(bEnable)
bAddress|=0x80;
outportb(D12_DATA,bAddress);
}
//设置端点使能 何处使用?
void D12_SetEndpointEnable(uint8 bEnable)
{
outportb(D12_COMMAND,0xd8);
if(bEnable)
outportb(D12_DATA,1);
else
outportb(D12_DATA,0);
}
//设置模式命令
void D12_SetMode(uint8 bConfig,uint8 bClkDiv)
{
outportb(D12_COMMAND,0xf3);
outportb(D12_DATA,bConfig);
outportb(D12_DATA,bClkDiv);
}
//设置DMA
void D12_SetDMA(uint8 bMode)
{
outportb(D12_COMMAND,0xfb);
outportb(D12_DATA,bMode);
}
//读取中断寄存器
uint16 D12_ReadInterruptRegister(void)
{
uint8 b1;
uint16 j;
outportb(D12_COMMAND,0xf4);
b1=inportb(D12_DATA);
j=inportb(D12_DATA);
j<<=8;
j+=b1;
return j;
}
//端点选择命令
uint8 D12_SelectEndpoint(uint8 bEndp)
{
uint8 c;
outportb(D12_COMMAND,bEndp);
c=inportb(D12_DATA);
return c;
}
//读取最后处理状态
uint8 D12_ReadLastTransactionStatus(uint8 bEndp)
{
outportb(D12_COMMAND,0x40+bEndp);
return inportb(D12_DATA);
}
//设置端点状态
void D12_SetEndpointStatus(uint8 bEndp,uint8 bStalled)
{
outportb(D12_COMMAND,0x40+bEndp);
outportb(D12_DATA,bStalled);
}
//发送恢复命令
void D12_SendResume(void)
{
outportb(D12_COMMAND,0xf6);
}
//读取当前帧状态
uint16 D12_ReadCurrentFrameNumber(void)
{
uint16 i,j;
outportb(D12_COMMAND,0xf5);
i=inportb(D12_DATA);
j=inportb(D12_DATA);
i+=(j<<8);
return i;
}
//读取端点数据
uint8 D12_ReadEndpoint(uint8 endp,uint8 len,uint8 *buf)
{
uint8 i,j;
Prints("\r\nReadEndpoint\r\n");
outportb(D12_COMMAND,endp);
if((inportb(D12_DATA)&D12_FULLEMPTY)==0) //当前端点缓存为空,返回
return 0;
outportb(D12_COMMAND,0x80+endp);
i=inportb(D12_DATA);
i=i&0x60;
Prints("buff=="); //缓存满否
PrintShortIntHex(i);
if(endp==2)
{
if(i==0x60)
bEPPflags.bits.ep1buf_full=1; //端点1缓存满
else
bEPPflags.bits.ep1buf_full=0;
}
if(endp==4)
{
if(i==0x60)
bEPPflags.bits.ep2buf_full=1;
else
bEPPflags.bits.ep2buf_full=0;
}
outportb(D12_COMMAND,0xf0); //读缓存区
j=inportb(D12_DATA);
j=inportb(D12_DATA);
if(j>len)
j=len;
Prints("\r\nlen=");
PrintShortIntHex(len);
for(i=0;i<j;i++)
PrintShortIntHex(*(buf+i)=inportb(D12_DATA));
outportb(D12_COMMAND,0xf2); //清缓存
return j;
}
//把数据写入端点
uint8 D12_WriteEndpoint(uint8 endp,uint8 len,uint8 * buf)
{
uint8 i;
outportb(D12_COMMAND,endp);
inportb(D12_DATA);
outportb(D12_COMMAND,0xf0); //写缓存
outportb(D12_DATA,0);
outportb(D12_DATA,len);
Prints("\r\n写入的数据是");
for(i=0;i<len;i++)
{
outportb(D12_DATA,*(buf+i));
PrintHex(*(buf+i));
}
outportb(D12_COMMAND,0xfa);
outportb(D12_COMMAND,0x80+endp);
i=inportb(D12_DATA);
Prints("\r\n端点满否i=");
PrintHex(i);
return len;
}
/*void write_a_usb_data(uint8 usb_data)
{
USB_A0=0;
P0=usb_data;
USB_WR=0;
USB_WR=1;
P0=0XFF;
}
//写端点2
/*uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
uint8 i;
D12_ReadLastTransactionStatus(endp);
outportb(D12_COMMAND,endp);
outportb(D12_COMMAND,0xf0);
write_a_usb_data(0);
write_a_usb_data(len);
Prints("\r\n写入数据");
for(i=0;i<len;i++)
{
P0=*(buff+i);
PrintHex(*(buff+i));
USB_WR=0;
USB_WR=1;
//PrintHex(*(buff+i));
}
P0=0xFF;
outportb(D12_COMMAND,0xfa);
outportb(D12_COMMAND,0x80+endp);
i=inportb(D12_DATA);
Prints("\r\n端点满否i=");
PrintHex(i);
return len;
} */
//端点应答处理
void D12_AcknowledgeEndpoint(uint8 endp)
{
outportb(D12_COMMAND,endp);
outportb(D12_COMMAND,0xf1);
if(endp==0)
outportb(D12_COMMAND,0xf2); //清缓存
}
//读取端点状态
unsigned char D12_ReadEndpointStatus(uint8 bEndp)
{
unsigned char c;
if(bEPPflags.bits.in_isr == 0)
EA=0;
outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
EA=1;
return c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -