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

📄 d12ci.c

📁 周立功的DP-51+实验板 应用程序(原代码)
💻 C
字号:
#include <reg51.h>                /* special function register declarations   */
#include "mainloop.h"
#include "d12ci.h"
#include "absacc.h"
#include "epphal.h"

#define D12_DATA 	0xfb02		//定义数据地址(偶数地址)
#define D12_COMMAND 0xfb03		//定义数据地址(奇数地址)发命令

extern EPPFLAGS bEPPflags;		//定义当前模块符号引用,该符号是在其模块中定义的。

//设置地址使能
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);//设置地址

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

//设置端点使能
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;
}

//模式设置
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工作方式设置
void D12_SetDMA(unsigned char bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
	outportb(D12_DATA, bMode);

	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;
}

//读取最后传输状态
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
	return inportb(D12_DATA);
}

//读取端点状态
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
	c = inportb(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;

	outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
	outportb(D12_DATA, bStalled);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

//传输恢复
void D12_SendResume(void)
{
	outportb(D12_COMMAND, 0xF6);//设置发送恢复
}

//读取当前帧标志
unsigned short D12_ReadCurrentFrameNumber(void)
{
	unsigned short i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(D12_COMMAND, 0xF5);	//读取当前帧数目
	i= inportb(D12_DATA);			//低位有效字节
	j = inportb(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;

	outportb(D12_COMMAND, endp);		//读取端点缓冲区状态
	if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) //D12_FULLEMPTY=0x01
	{
		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);		//写缓冲区(多字节,最大为130)
	outportb(D12_DATA, 0);				//保留,可为任意值
	outportb(D12_DATA, len);			//数据字节的数目长度

	for(i=0; i<len; i++)
		outportb(D12_DATA, *(buf+i));	//每写一个字节,内部缓冲区指针自动加1

	outportb(D12_COMMAND, 0xFA);		//使缓冲区有效

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return len;
}

//设置端点应答
void D12_AcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND, endp);
	outportb(D12_COMMAND, 0xF1);			//应答
	if(endp == 0)
		outportb(D12_COMMAND, 0xF2);		//绶冲区清零
}

//输出数据(单字节)
void outportb(unsigned int Addr, unsigned char Data)
{
	*((unsigned char xdata *) Addr) = Data;
}

//输入数据(单字节)
unsigned char inportb(unsigned int Addr)
{
	return *((unsigned char xdata *) Addr);
}

⌨️ 快捷键说明

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