?? d12ci1.c
字號:
#include <reg51.h> /* special function register declarations */
#include "mainloop.h"
#include "d12ci.h"
#include "absacc.h"
#include "epphal.h"
#define D12_DATA 0xff02
#define D12_COMMAND 0xff03
extern EPPFLAGS bEPPflags;
//設(shè)置地址使能
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xD0);//輸出指令
if(bEnable)
bAddress |= 0x80;
outportb(D12_DATA, bAddress);//設(shè)置地址
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
//設(shè)置端點使能
void D12_SetEndpointEnable(unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xD8);//輸出指令
if(bEnable)
outportb(D12_DATA, 1);//設(shè)置端點允許
else
outportb(D12_DATA, 0);//設(shè)置端點禁止
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
//模式設(shè)置
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xF3);//設(shè)置模式
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
//讀取中斷寄存器
unsigned short D12_ReadInterruptRegister(void)
{
unsigned char b1;
unsigned int j;
outportb(D12_COMMAND, 0xF4);//讀取中斷寄存器
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;
outportb(D12_COMMAND, bEndp);//端點選擇
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return c;
}
//讀取最后傳輸狀態(tài)
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp);//返回最后傳輸狀態(tài)
return inportb(D12_DATA);
}
//讀取端點狀態(tài)
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
unsigned char c;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0x80 + bEndp);//讀取端點狀態(tài)
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return c;
}
//設(shè)置端點狀態(tài)
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0x40 + bEndp);//設(shè)置端點狀態(tài)
outportb(D12_DATA, bStalled);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
//傳輸恢復
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0xF6);//設(shè)置發(fā)送恢復
}
//讀取當前幀號
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned short i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xF5);//讀取當前幀數(shù)目
i= inportb(D12_DATA);
j = inportb(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(D12_COMMAND, 0xFD);
i=inportb(D12_DATA);
j=inportb(D12_DATA);
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return i;
}
//讀取端點數(shù)據(jù)
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i, j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, endp);
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return 0;
}
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);
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)
{
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, endp);
i = inportb(D12_DATA);
outportb(D12_COMMAND, 0xF0);
outportb(D12_DATA, 0);
outportb(D12_DATA, len);
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i));
outportb(D12_COMMAND, 0xFA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return len;
}
//設(shè)置端點應答
void D12_AcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp);
outportb(D12_COMMAND, 0xF1);
if(endp == 0)
outportb(D12_COMMAND, 0xF2);
}
//輸出數(shù)據(jù)
void outportb(unsigned int Addr, unsigned char Data)
{
*((unsigned char xdata *) Addr) = Data;
}
//輸入數(shù)據(jù)
unsigned char inportb(unsigned int Addr)
{
return *((unsigned char xdata *) Addr);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -