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

📄 d12impl.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 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 + -