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

📄 d12ic.c

📁 AVR单片机控制的PDIUSBD12原程序
💻 C
字号:
//*************************************
//PDIUSB12命令接口 d12ci.c
//编译环境WINAVRGCC
//2007-01-9
//Hjxiang
//*************************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "d12ic.h"

//宏定义
#define D12_DATA		0x02		//选择数据指令(A0=0)
#define D12_COMMAND		0x03		//选择命令指令(A0=1)
#define D12_FULLEMPTY	0x01		//端点缓冲区满



//设置地址使能命令
void D12_SetAddressEnable(unsigned char bAddress,unsigned char bEnable)
{
	outportb(D12_COMMAND,0xD0);
	if(bEnable)
		bAddress|=0x80;
	outportb(D12_DATA,bAddress);
}
//设置端点使能命令
void D12_SetEndpointEnable(unsigned char bEnable)
{
	outportb(D12_COMMAND,0xD8);
	if(bEnable)
		outportb(D12_DATA,1);
	else
		outportb(D12_DATA,1);
}
//设置模式命令
void D12_SetMode(unsigned char bConfig,unsigned char bClkDiv)
{
	outportb(D12_COMMAND,0xF3);
	outportb(D12_DATA,bConfig);
	outportb(D12_DATA,bClkDiv);

}
//设置DMA
void D12_SetDMA(unsigned char bMode)
{
	outportb(D12_COMMAND,0xFB);
	outportb(D12_DATA,bMode);

}
//读取中断寄存器
unsigned short D12_ReadInterruptRegister(void)
{
	unsigned char b1;
	unsigned int j;
	outportb(D12_COMMAND,0xF4);
	b1=inportb(D12_DATA)&0xff;
	j=inportb(D12_DATA)&0x01;
//	put_c(b1);
//	put_c(j);
	j<<=8;
	j+=b1;
	return j;
}
//端点选择命令
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
	unsigned char c;
	outportb(D12_COMMAND,bEndp);
	c=inportb(D12_DATA);
	return c;
}
//读取端点最后处理状态
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
	unsigned char c;
	outportb(D12_COMMAND,0x40+bEndp);
	c=inportb(D12_DATA);
	return c;
}
//设置端点状态
void D12_SetEndpointStatus(unsigned char bEndp,unsigned char bStalled)
{
	outportb(D12_COMMAND,0x40+bEndp);
	outportb(D12_DATA,bStalled);
}
//读取端点状态
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char temp;
	outportb(D12_COMMAND,0x80+bEndp);
	temp=inportb(D12_DATA);
	return temp;
}
//发送恢复命令
void D12_SendResume(void)
{
	outportb(D12_COMMAND,0xF6);
}
//读取当前帧标志
unsigned short D12_ReadCurrentFrameNumber(void)
{
	unsigned short i,j;
	outportb(D12_COMMAND,0xF5);
	i=inportb(D12_DATA);
	j=inportb(D12_DATA);
	i+=(j<<8);
	return i;
}
//读取端点数据
unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,unsigned char *buf)
{
	unsigned char i,j;
	outportb(D12_COMMAND,endp);		//读取端点缓冲区状态
	if((inportb(D12_DATA) & D12_FULLEMPTY)==0)
		return 0;							//当前缓冲区为空,返回
	outportb(D12_COMMAND,0x80+endp);		//读取端点状态
	i=inportb(D12_DATA);
	i=i & 0x60;
	if(endp==4)
	{
		if(i==0x60)
			bEPPflags.bits.ep2buf_full=1;	//标志端点2缓冲区全满
		else
			bEPPflags.bits.ep2buf_full=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);
	D12_ReadLastTransactionStatus(endp);
	return j;
}
//把数据写入端点
unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,unsigned char *buf)
{
	unsigned char i,j;
	outportb(D12_COMMAND,endp);	
	i=inportb(D12_DATA);
	outportb(D12_COMMAND,0xF0);
	outportb(D12_DATA,0);
	outportb(D12_DATA,len);
	for(j=0;j<len;j++)
		outportb(D12_DATA,*(buf+j));
	outportb(D12_COMMAND,0xFA);
	D12_ReadLastTransactionStatus(endp);
	return len;
}
//端点应答处理
void D12_AcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND,endp);	
	outportb(D12_COMMAND,0xF1);	
	if(endp==0)
		outportb(D12_COMMAND,0xF2);	


}
//
void stall_ep0(void)
{
//	outportb(D12_COMMAND,0);	
//	outportb(D12_COMMAND,0xF1);	
	D12_SetEndpointStatus(0,1);
	D12_SetEndpointStatus(1,1);
}

⌨️ 快捷键说明

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