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

📄 d12ci.c

📁 USB的具体细节和他的使用方法还有接口电路设计
💻 C
字号:
#include<reg51.h>
#include"Config.h"
#include"D12CI.h"

//51与D12的连接
#define D12Data    P0
sbit    D12RST   = P1^1;
sbit    D12ALE   = P1^2;
sbit    D12CS    = P1^3;
sbit    D12WR    = P1^4;
sbit    D12RD    = P1^5;
sbit    D12INT   = P1^6;
sbit    D12SUSPD = P1^7;

//函数名称: void Init_D12Port(void)
//功能描述: 初始化D12与8051的连接端口
void Init_D12Port(void)
{
	D12CS = 1;			//释放D12
	D12CS = 0;			//选择D12
}

//函数名称: void Rst_D12(void)
//功能描述: 复位D12
void Rst_D12(void)
{
	INT16U i;
	
	D12RST = 0;				//D12的 RESET引脚置0
	nNop(10);		
	D12RST = 1;				//D12的 RESET引脚置1
	D12SUSPD = 0;			//D12的 SUSPEND引脚置0
}


//函数名称: outportb()
//功能描述: 向D12写入数据
//参数说明: I_D:	命令(0)或数据(1)
//		      Data:    命令字节
void outportb(bit I_D, INT8U Data)
{
	if(I_D==0)
	{
		
		}
	}

//函数名称: inportd()
//功能描述: 读入数据
//参数说明: INT16U Addr:	数据地址
INT8U inportb(INT16U Addr)
{
	return *((INT8U xdata *) Addr);
}
/************************************************************
** 函数名称: D12_ReadChipID()
** 功能描述: 读取芯片ID
** 输   入: 无
** 输   出: 芯片的ID号
************************************************************/
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;
}

/************************************************************
** 函数名称: D12_SetAddressEnable()
** 功能描述: 设置地址/使能
** 输   入: INT8U bAddress:  地址
	     	 INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 使能
** 输   出: 无
************************************************************/
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();
}


/************************************************************
** 函数名称: D12_SetEndpointEnable()
** 功能描述: 设置端点使能
** 输   入: INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 允许
** 输   出: 无
************************************************************/
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:  分频系数
** 输   出: 无
************************************************************/
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()
** 功能描述: 设置DMA工作方式设置
** 输   入: INT8U bMode: 	设置值
** 输   出: 无
************************************************************/
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();			
}

/************************************************************
** 函数名称: D12_ReadInterruptRegister()
** 功能描述: 读取中断寄存器值
** 输   入: 无
** 输   出: 中断寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
	INT8U b1;
	INT16U j;

	outportb(D12_COMMAND, 0xF4);	//读取中断寄存器命令
	b1 = inportb(D12_DATA);			//读取低8位字节
	j = inportb(D12_DATA);			//读取高8位字节

	j <<= 8;
	j += b1;						//组合为16位

	return j;
}

/************************************************************
** 函数名称: D12_SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 读出的字节
************************************************************/
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;
}

/************************************************************
** 函数名称: D12_ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点状态
************************************************************/
#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

/************************************************************
** 函数名称: D12_ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
** 输   出: 端点最后处理的状态
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);	//输出读取最后处理状态寄存器命令
	return inportb(D12_DATA);				//读取状态
}

/************************************************************
** 函数名称: D12_SetEndpointStatus()
** 功能描述: 设置端点状态
** 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
	         INT8U bStalled: 状态值
** 输   出: 端点状态
************************************************************/
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();
}

/************************************************************
** 函数名称: D12_SendResume()
** 功能描述: 传输恢复
** 输   入: 无
** 输   出: 无
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
	outportb(D12_COMMAND, 0xF6);			//设置发送恢复
}
#endif


/************************************************************
** 函数名称: D12_ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输   入: 无
** 输   出: 当前帧号
************************************************************/
#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);					//读取帧数目的低8位
	j = inportb(D12_DATA);					//读取帧数目的高8位

	i += (j<<8);

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

	return i;								//返目当前帧数目
}
#endif


/************************************************************
** 函数名称: D12_ReadEndpoint()
** 功能描述: 读取端点数据
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	    	 INT8U len:	     要读取的数据长度
	     	 INT8U * buf:    接收数据指针
** 输   出: 实际读得的字节数
************************************************************/
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;											//返回读到的字节数
}

/************************************************************
** 函数名称: D12_WriteEndpoint()
** 功能描述: 把数据写入端点
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
	     	 INT8U len:	     要写入的数据长度
	     	 INT8U * buf:    发送数据指针
** 输   出: 实际写入的字节数
************************************************************/
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;								//返回写入的字节数
}

/************************************************************
** 函数名称: D12_AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
	outportb(D12_COMMAND, endp);			//选择端点
	outportb(D12_COMMAND, 0xF1);			//应答Setup指令
	if(endp == 0)		
		outportb(D12_COMMAND, 0xF2);		//清空该端点缓冲区
}

/************************************************************
** 函数名称: void D12_ClearBuff()
** 功能描述: 清指定端点的缓冲区(包括双缓冲区)
** 输   入: INT8U endp:     端点索引号,取值 0 ~ 5 
** 输   出: 无
************************************************************/
#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 + -