📄 d12ic.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 + -