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

📄 d12ci.c

📁 基于PDIUSBD12芯片的USB开发板固件程序
💻 C
字号:
/*本文件定义了PDIUSBD12的命令函数,根据需要进行增减。*/
#ifdef __C51__
#include <reg51.h> /* special function register declarations */
#else
#include <absacc.h>
#endif

#include "mainloop.h"
#include "d12ci.h"
#include "epphal.h"

#define D12_DATA 0xFB02
#define D12_COMMAND 0xFB03

extern EPPFLAGS bEPPflags;

/*设置/使能地址命令:D0H*/
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
    if(bEPPflags.bits.in_isr == 0)
         DISABLE;//EA=0
    outportb(D12_COMMAND, 0xD0);
	if(bEnable)
		bAddress |= 0x80;
	outportb(D12_DATA, bAddress);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;//EA=1
}

/*设置端点使能命令:D8H*/
void D12_SetEndpointEnable(unsigned char bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, 0xD8);
	if(bEnable)
		outportb(D12_DATA, 1);
	else
		outportb(D12_DATA, 0);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

/*设置模式命令:F3H*/
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, 0xF3);
	outportb(D12_DATA, bConfig);
	outportb(D12_DATA, bClkDiv);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

/*设置DMA命令:FBH*/
void D12_SetDMA(unsigned char bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, 0xFB);
	outportb(D12_DATA, bMode);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

/*读中断寄存器命令:F4H*/
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;
}

/*选择端点命令:00~05H*/
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;
}

/*读最后处理状态寄存器命令:40~45H*/
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);
	return inportb(D12_DATA);
}

/*设置端点状态命令:40~45H*/
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, 0x40 + bEndp);
	outportb(D12_DATA, bStalled);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

/*设置端点状态命令:40~45H,专用于中断函数中*/
void D12_SetEndpointStatusIsr(unsigned char bEndp, unsigned char bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, 0x40 + bEndp);
	outportb(D12_DATA, bStalled);
	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}


/*读端点缓冲区同时清缓冲区,包含读缓冲区命令:F0H*/
/*以及清缓冲区命令:F2H*/
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;
}


/*写端点缓冲区同时使缓冲区有效,包含写缓冲区命令:F0H*/
/*以及使缓冲区有效命令:FAH*/
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);
	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;
}

/*写端点缓冲区同时使缓冲区有效,专用于中断函数*/
unsigned char D12_WriteEndpointIsr(unsigned char endp, unsigned char len,unsigned char * buf)
{
	unsigned char i;
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
	outportb(D12_COMMAND, endp);
	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;
}

/*应答SETUP命令:F1H*/
void D12_AcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND, endp);
	outportb(D12_COMMAND, 0xF1);
	if(endp == 0)
		outportb(D12_COMMAND, 0xF2);
}


⌨️ 快捷键说明

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