📄 d12impl.c
字号:
#include <typedef.h>
#include <c8051f120.h>
#include <usb.h>
#include <d12interface.h>
u8 Ep1Buf[EP1_PACKET_SIZE]; //ep1 buff
u8 xdata Ep2Buf[EP2_PACKET_SIZE*2];
//u8 xdata Ep2Buf2[EP2_PACKET_SIZE];
extern bool Ep2SendBufferFul; //ep2 send buffer has data to send
//send command & data
#define D12_COMMAND 1 //write command to d12
#define D12_DATA 0 //write data to d12
//command & data port
#define D12_COMMAND_PORT P6 //d12 command port link to p6
#define D12_DATA_PORT P6 //d12 data port link to p6
/* write cmd or data to d12 */
void D12_WritePort(u8 bMode, u8 bCmd)
{
// u8 delay= 0;
u8 page = SFRPAGE;
SFRPAGE = 0XF;
D12_CS = D12_CS_ENABLE;
//WRITE command mode
D12_A0 = bMode;
//SET D12 TO WRITE MODE
D12_WR = D12_WR_ENABLE;
//PORT SET TO WRITE MODE, AND WRITE CMD
P6MDOUT = 0xff;
D12_COMMAND_PORT = bCmd;
D12_WR = D12_WR_DISABLE;
D12_CS = D12_CS_DISABLE;
SFRPAGE = page;
}
/* get data from d12 */
u8 D12_ReadPort()
{
u8 ret;
u8 page = SFRPAGE;
SFRPAGE = 0XF;
D12_CS = D12_CS_ENABLE;
//SET D12 TO WRITE MODE
D12_RD = D12_RD_ENABLE;
D12_A0 = D12_DATA;
//PORT SET TO READ MODE, AND READ DATA
P6MDOUT = 0x0;
D12_DATA_PORT = 0xff;
ret = D12_DATA_PORT;
D12_RD = D12_RD_DISABLE;
D12_CS = D12_CS_DISABLE;
SFRPAGE = page;
return ret;
}
/* init d12 work mode */
void Init_D12()
{
u8 page = SFRPAGE;
SFRPAGE = 0XF;
//set d12_a0(p5.4), d12_wr(p5.5), d12_rd(p5.6), d12_cs(p5.7)
//to out mode
P5MDOUT |= 0xf0;
//ENABLE cs signal
D12_CS = D12_CS_ENABLE;
D12_WR = D12_WR_DISABLE;
D12_RD = D12_RD_DISABLE;
//DISABLE WR & RD SIGNAL
//SET D12_SUSP(P3.3) TO OUT MODE
P3MDOUT |= 0X08;
//WAKEUP D12
D12_SUSP = D12_SUSP_WAKEUP;
D12_CS = D12_CS_DISABLE;
SFRPAGE = page;
}
/*
void D12_SoftConnect(u8 bConfigure)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, 0xF3);
D12_WritePort(D12_DATA, bConfigure); //配置字节信息
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
void USBCHIP_SetDMA(u8 bMode) //设置DMA
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, 0xFB);
D12_WritePort(D12_DATA, bMode);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
*/
void D12_Disconnect(void)
{
D12_SetMode(D12_NOLAZYCLOCK | D12_CLOCKRUNNING,
D12_SETTOONE | D12_CLOCK_24M);
}
void D12_Connect(void)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_SetMode(D12_NOLAZYCLOCK | D12_CLOCKRUNNING|D12_SOFTCONNECT,
D12_SETTOONE | D12_CLOCK_24M);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
/*
void D12_Reconnect(void)
{
u8 clk_cnt;
D12_SUSP = 0; //唤醒D12
bEppflags.flags.in_isr = 1;
// USB_ClearAllInts();
D12_Disconnect();
for(clk_cnt=0;clk_cnt<2000;clk_cnt++);
D12_Connect();
bEppflags.flags.in_isr = 0;
}
*/
void D12_SetAddressEnable(u8 bAddress, bool bEnable)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_EN_ADDRESS);
if(bEnable)
bAddress |= 0x80;
D12_WritePort(D12_DATA, bAddress);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
void D12_SetEndpointEnable(bool bEnable)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_EN_EP);
if(bEnable)
D12_WritePort(D12_DATA, 1);
else
D12_WritePort(D12_DATA, 0);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
void D12_SetMode(u8 bConfig, u8 bClkDiv)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_SET_MODE);
D12_WritePort(D12_DATA, bConfig);
D12_WritePort(D12_DATA, bClkDiv);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
u16 D12_ReadInterruptRegister(void)
{
u8 b1;
u16 j;
D12_WritePort(D12_COMMAND, D12CMD_READ_INTREG);
b1 = D12_ReadPort();
j = D12_ReadPort();
j <<= 8;
j += b1;
return j;
}
u8 D12_SelectEndpoint(u8 bEndp)
{
u8 c;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_SEL_EPCTLOUT+bEndp);
c = D12_ReadPort();
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return c;
}
u8 D12_ReadLastTransactionStatus(u8 bEndp)
{
u8 ret;
D12_WritePort(D12_COMMAND,
D12CMD_GETLASTSTATUS_EPCTLOUT + bEndp);
ret = D12_ReadPort();
return ret;
}
u8 D12_ReadEndpointStatus(u8 bEndp)
{
u8 c;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_GETEPSTATUS_EPCTLOUT + bEndp);
c = D12_ReadPort();
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return c;
}
void D12_SetEndpointStatus(u8 bEndp, u8 bStalled)
{
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_SETSTATUS_EPCTLOUT + bEndp);
D12_WritePort(D12_DATA, bStalled);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
}
/*
void D12_SendResume(void)
{
D12_WritePort(D12_COMMAND, D12CMD_SEND_RESUME);
}
*/
/*
u16 D12_ReadCurrentFrameNumber(void)
{
u16 i,j;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, D12CMD_READ_FRAME);
i= D12_ReadPort();
j = D12_ReadPort();
i += (j<<8);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return i;
}
u16 D12_ReadChipID(void)
{
u16 i=0,j=0;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, 0xFD);
i=D12_ReadPort();
j=D12_ReadPort();
i += (j<<8);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return i;
}
*/
#define D12_FULLEMPTY 1 //ep buffer is empty
// D12_ReadMainEndpoint() added by V2.2 to support double-buffering.
// Caller should assume maxium 128 bytes of returned data.
/*
u8 D12_ReadMainEndpoint(u8 * buf)
{
u8 i, j, k = 0, bDblBuf = 1;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, 0x84);
if( (D12_ReadPort() & 0x60) == 0x60)
bDblBuf = 2;
while(bDblBuf)
{
D12_WritePort(D12_COMMAND, 4);
if((D12_ReadPort() & D12_FULLEMPTY) == 0)
break;
D12_WritePort(D12_COMMAND, 0xF0);
j = D12_ReadPort();
j = D12_ReadPort();
for(i=0; i<j; i++)
*(buf+i+k) = D12_ReadPort();
k += j;
D12_WritePort(D12_COMMAND, 0xF2);
bDblBuf --;
}
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return k;
}
*/
u8 D12_ReadEndpointBuffer(u8 endp, u8 * buf, u8 len)
{
u8 i, j;
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, endp);
if((D12_ReadPort() & D12_FULLEMPTY) == 0)
{
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return 0;
}
D12_WritePort(D12_COMMAND, D12CMD_READ_BUFFER);//0xF0);
j = D12_ReadPort();
j = D12_ReadPort();
if(j > len)
j = len;
for(i=0; i<j; i++)
*(buf+i) = D12_ReadPort();
D12_WritePort(D12_COMMAND, 0xF2);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return j;
}
u8 D12_WriteEndpointBuffer(u8 endp, u8 * buf, u8 len) reentrant
{
u8 i;
if (endp == D12_EP2IN)
{
while (Ep2SendBufferFul == true); //wait previous data to be processed
Ep2SendBufferFul = true;
}
if(bEppflags.flags.in_isr == 0)
DISABLE_INTERRUPT;
D12_WritePort(D12_COMMAND, endp);
D12_ReadPort();
D12_WritePort(D12_COMMAND, D12CMD_WRITE_BUFFER);//0xF0);
D12_WritePort(D12_DATA, 0);
D12_WritePort(D12_DATA, len);
for(i=0; i<len; i++)
D12_WritePort(D12_DATA, *(buf+i));
D12_WritePort(D12_COMMAND, 0xFA);
if(bEppflags.flags.in_isr == 0)
ENABLE_INTERRUPT;
return len;
}
void D12_AcknowledgeEndpoint(u8 endp)
{
D12_WritePort(D12_COMMAND, endp);
D12_WritePort(D12_COMMAND, 0xF1);
if(endp == 0)
D12_WritePort(D12_COMMAND, 0xF2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -