📄 d12ci.c
字号:
#include "mainloop.h"
#include "epphal.h"
#include "d12ci.h"
#include <msp430x13x.h>
extern EPPFLAGS bEPPflags;
void D12_SetAddressEnable(unsigned char bAddress,
unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, 0XD0);
if(bEnable)
bAddress |= 0X80;
outportb(D12_DATA, bAddress);
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
}
void D12_SetEndpointEnable(unsigned char bEnable)
{
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, 0XD8);
if(bEnable)
{
outportb(D12_DATA, 1);
}
else
{
outportb(D12_DATA, 0);
}
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
}
void D12_SetMode(unsigned char bConfig,
unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, 0XF3);
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
}
void D12_SetDMA(unsigned char bMode)
{
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, 0XFB);
outportb(D12_DATA, bMode);
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
}
unsigned int D12_ReadInterruptRegister(void)
{
/*unsigned char tmp;
unsigned int IntReg;
outportb(D12_COMMAND, 0XF4);
tmp = inportb(D12_DATA);
IntReg = (unsigned int)inportb(D12_DATA);
IntReg <<= 8;
IntReg |= tmp;
return IntReg;
*/
unsigned char b1;
unsigned int j;
outportb(D12_COMMAND, 0xF4);
//outportcmd(0xF4);
b1 = inportb(D12_DATA);
j = inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
unsigned int D12_ReadChipID(void)
{
unsigned char tmp;
unsigned int ID;
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, 0XFD);
tmp = inportb(D12_DATA);
ID = (unsigned int)inportb(D12_DATA);
ID <<= 8;
ID += tmp;
if(bEPPflags.bits.in_isr == 0)
_EINT();
return ID;
}
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
unsigned char c;
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, bEndp);
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
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)
_DINT();
outportb(D12_COMMAND, 0X80 | bEndp);
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
_EINT();
return c;
}
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND,0X40 | bEndp);
outportb(D12_DATA, bStalled);
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
}
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0XF6);
}
unsigned short D12_ReadCurrentFrameNumber(void)
{
unsigned int r;
outportb(D12_COMMAND, 0XF5);
r = inportb(D12_DATA);
r <<= 8;
r |= inportb(D12_DATA);
return r;
}
unsigned char D12_ReadEndpoint(unsigned char endp,
unsigned char len,
unsigned char * buf)
{
unsigned char i,j;
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, endp); //Select Endpoint
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0)
{ //Get Buffer Status:empty or full
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
return 0;
}
/* outportb(D12_COMMAND, 0X80 | endp); //Get Endpoint Status
i = inportb(D12_DATA);
i &= 0X60;
if(endp == 2)
{
if(i == 0X60)
bEPPflags.bits.ep1buf_full = 1;
else
bEPPflags.bits.ep1buf_full = 0;
}
if(endp == 4)
{
if(i == 0X60)
bEPPflags.bits.ep2buf_full = 1;
else
bEPPflags.bits.ep2buf_full = 0;
}
*/
outportb(D12_COMMAND, 0XF0); //Read Endpoint
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); //Clear Buffer
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
return j;
}
unsigned char D12_WriteEndpoint(unsigned char endp,
unsigned char len,
unsigned char * buf)
{
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
{
_DINT();
}
outportb(D12_COMMAND, endp); //Select Endpoint
inportb(D12_DATA);
outportb(D12_COMMAND, 0XF0); //Write Endpoint
outportb(D12_DATA, 0);
outportb(D12_DATA, len);
for(i = 0; i < len; i++)
outportb(D12_DATA, *(buf + i));
outportb(D12_COMMAND, 0XFA); //Enable Buffer
if(bEPPflags.bits.in_isr == 0)
{
_EINT();
}
return len;
}
void D12_AcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp); //Select Endpoint
outportb(D12_COMMAND, 0XF1); //set ACK
if(endp == 0)
outportb(D12_COMMAND, 0XF2); //Clear Buffer
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -