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

📄 d12ci.c

📁 采用PDIUSBD12开发的USB总线与429总线数据转换的单片机固件程序
💻 C
字号:
/**********************************************
        USB固件编程

File Name:	D12ci.C
Revision:		0.2(2004-05-28)
Author:		    LHP
Use library:
Note:			不带DMA控制功能
***********************************************/

#include <reg51.h>

#include "D12ci.h"

#define D12_COMMAND 0xff03
#define D12_DATA    0xff02

sbit A0=P3^0;

void outportb(unsigned int Addr,unsigned char Data);
unsigned char inportb(unsigned int Addr);

extern EPPFLAGS bEPPflags;

void outportb(unsigned int Addr,unsigned char Data)
{
    if(Addr%2==1)
         A0=1;
    else
         A0=0;

    *((unsigned char xdata*)Addr)=Data;
}

unsigned char inportb(unsigned int Addr)
{//从D12读取数据,addr必须是偶数,此时数据线上传输的是数据,所以直接就让A0=0
    A0=0;
    return *((unsigned char xdata*)Addr);
}

void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

 //   A0=1;
//	D12_COMMAND = 0xD0;
    outportb(D12_COMMAND,0xD0);

	if(bEnable)
		bAddress |= 0x80;

    //A0=0;
	//D12_DATA = bAddress;
    outportb(D12_DATA,bAddress);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetEndpointEnable(unsigned char bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
//    A0=1;
//	D12_COMMAND = 0xD8;
    outportb(D12_COMMAND,0xD8);

//    A0=0;
	if(bEnable)
//		D12_DATA = 1;
        outportb(D12_DATA,1);
	else
		//D12_DATA = 0;
        outportb(D12_DATA,0);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
//  A0=1;
//	D12_COMMAND = 0xF3;
    outportb(D12_COMMAND,0xF3);
//  A0=0;
//	D12_DATA = bConfig;
//	D12_DATA = bClkDiv;
    outportb(D12_DATA,bConfig);
    outportb(D12_DATA,bClkDiv);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}
/*
void D12_SetDMA(unsigned char bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	D12_COMMAND = 0xFB;
	D12_DATA = bMode;

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}
*/
unsigned short D12_ReadInterruptRegister(void)
{
	unsigned char b1;
	unsigned int j;
 //   A0=1;
//	D12_COMMAND = 0xF4;
    outportb(D12_COMMAND,0xF4);
//    A0=0;
//	b1 = D12_DATA;
//	j = D12_DATA;
    b1=inportb(D12_DATA);
    j=inportb(D12_DATA);
	j <<= 8;
	j += b1;

	return j;
}

unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
 //   A0=1;
//	D12_COMMAND = bEndp;
    outportb(D12_COMMAND,bEndp);
//    A0=0;
//	c = D12_DATA;
    c=inportb(D12_DATA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return c;
}

unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
//    A0=1;
//	D12_COMMAND = 0x40 + bEndp;
    outportb(D12_COMMAND,0x40+bEndp);
//    A0=0;
	//return D12_DATA;
    return inportb(D12_DATA);
}

/*
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	D12_COMMAND = 0x40 + bEndp;
	c = D12_DATA;

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return c;
}
*/

void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
 //   A0=1;
//	D12_COMMAND = 0x40 + bEndp;
 //   A0=0;
//	D12_DATA = bStalled;
    outportb(D12_COMMAND,0x40+bEndp);
    outportb(D12_DATA,bStalled);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;
}

/*
void D12_SendResume(void)
{
	D12_COMMAND = 0xF6;
}


unsigned short D12_ReadCurrentFrameNumber(void)
{
	unsigned short i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	D12_COMMAND = 0xF5;
	i = D12_DATA;
	j = D12_DATA;

	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return i;
}
*/
/*
unsigned short D12_ReadChipID(void)
{
	unsigned short i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;

	outportb(portbase+D12_COMMAND, 0xFD);
	i=inportb(portbase+D12_DATA);
	j=inportb(portbase+D12_DATA);
	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return i;
}
*/

unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
	unsigned char i, j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
//    A0=1;
//	D12_COMMAND = endp;
//    A0=0;
//	i=D12_DATA;
    outportb(D12_COMMAND,endp);
    i=inportb(D12_DATA);
	if((i & D12_FULLEMPTY) == 0)
    {
		if(bEPPflags.bits.in_isr == 0)
			ENABLE;
		return 0;
	}
 //   A0=1;
//	D12_COMMAND = 0xF0;
 //   A0=0;
//	j = D12_DATA;
//	j = D12_DATA;
    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);
    //A0=1;
	//D12_COMMAND = 0xF2;
    outportb(D12_COMMAND,0xF2);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return j;
}



unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len,unsigned char * buf) //reentrant
{
	unsigned char i;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
//    A0=1;
//	D12_COMMAND = endp;
    outportb(D12_COMMAND,endp);
    //A0=0;
	//D12_DATA;
    inportb(D12_DATA);
    //A0=1;
	//D12_COMMAND = 0xF0;
    outportb(D12_COMMAND,0xF0);
    //A0=0;
	//D12_DATA = 0;
	//D12_DATA = len;
    outportb(D12_DATA,0);
    outportb(D12_DATA,len);
	for(i=0; i<len; i++)
		outportb(D12_DATA, *(buf+i));
    //A0=1;
	//D12_COMMAND = 0xFA;
    outportb(D12_COMMAND,0xFA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return len;
}


unsigned char D12_WriteEndpoint_ISR(unsigned char endp, unsigned char len,unsigned char * buf) //reentrant
{
		unsigned char i;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE;
//    A0=1;
//	D12_COMMAND = endp;
    outportb(D12_COMMAND,endp);
    //A0=0;
	//D12_DATA;
    inportb(D12_DATA);
    //A0=1;
	//D12_COMMAND = 0xF0;
    outportb(D12_COMMAND,0xF0);
    //A0=0;
	//D12_DATA = 0;
	//D12_DATA = len;
    outportb(D12_DATA,0);
    outportb(D12_DATA,len);
	for(i=0; i<len; i++)
		outportb(D12_DATA, *(buf+i));
    //A0=1;
	//D12_COMMAND = 0xFA;
    outportb(D12_COMMAND,0xFA);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE;

	return len;
}



void D12_AcknowledgeEndpoint(unsigned char endp)
{
 //   A0=1;
//	D12_COMMAND = endp;
    outportb(D12_COMMAND,endp);
    outportb(D12_COMMAND,0xF1);
//	D12_COMMAND = 0xF1;
	if(endp == 0)
//		D12_COMMAND = 0xF2;
        outportb(D12_COMMAND,0xF2);
}




⌨️ 快捷键说明

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