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

📄 d12ci.c

📁 PDIUSBD12的固件程序可能对开发USB1.1的兄弟有用
💻 C
字号:
//接口控制驱动层

#include <reg52.h>
#include "D12Config.h"
#include "D12HAL.h"
#include "D12CI.h"
#include "Chap_9.h"

INT16U D12_ReadChipID(void)
{
	INT16U i,j;

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

	outportb(D12_COMMAND, 0xFD);						//发送读PDIUSBD12芯片ID号命令	
	i=inportb(D12_DATA);								//读取ID号低字节
	j=inportb(D12_DATA);								//读取ID号高位字节
	i += (j<<8);										//组成16位的PDIUSBD12芯片ID号

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

	return i;
}


void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xD0);						//输出设置地址/使能指令
	if(bEnable)
		bAddress |= 0x80;								//bit7置1,使能
	outportb(D12_DATA, bAddress);						//输出设置值

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


void D12_SetEndpointEnable(INT8U 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(INT8U bConfig,INT8U 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();	
}


void D12_SetDMA(INT8U bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xFB);						//设置DMA工作方命令
	outportb(D12_DATA, bMode);							//输出设置值

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


INT16U D12_ReadInterruptRegister(void)
{
	INT8U b1;
	INT16U j;

	outportb(D12_COMMAND, 0xF4);
	b1 = inportb(D12_DATA);
	j = inportb(D12_DATA);
	j <<= 8;
	j += b1;

	return j;
}


INT8U D12_SelectEndpoint(INT8U bEndp)
{
	INT8U 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;
}


#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
	INT8U 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;
}
#endif


INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);				//输出读取最后处理状态寄存器命令
	return inportb(D12_DATA);
}


void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

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

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


#if D12_SendResume_EN
void D12_SendResume(void)
{
	outportb(D12_COMMAND,0xF6);							//设置发送恢复
}
#endif



#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
	INT16U 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;											//返目当前帧数目
}
#endif



INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
	INT8U 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;										//则返回读到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;											//返回读到的字节数
}


INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
	INT8U 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;											//返回写入的字节数
}


void D12_AcknowledgeEndpoint(INT8U endp)
{
	outportb(D12_COMMAND, endp);						//选择端点
	outportb(D12_COMMAND, 0xF1);						//应答Setup指令
	if(endp == 0)		
		outportb(D12_COMMAND, 0xF2);					//清空该端点缓冲区
}


#if D12_ClearBuff_EN
void D12_ClearBuff(INT8U endp)
{	
   	outportb(D12_COMMAND, endp);						//选择端点
	outportb(D12_COMMAND, 0xF2);						//清空第1个缓冲区	
	
	if (endp >= 4)
	{
   		outportb(D12_COMMAND, endp);					//选择端点
		outportb(D12_COMMAND, 0xF2);					//清空第2个缓冲区	
	}
}
#endif

⌨️ 快捷键说明

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