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

📄 uart.c

📁 人机界面程序
💻 C
字号:
#include "define.h"
#include "uart.h"
#include  "maindef.h"

//232
#define SENDD(PB,c)	*(volatile unsigned char*)(PB+USTHR)=(char)c
#define RECVD(PB)	*(volatile unsigned char*)(PB+USRHR)&0xff
#define GET_USCSR(PB)	*(volatile unsigned char*)(PB+USCSR)

#define UART0_BASE	0xFFFD0000			//A port
#define UART1_BASE 	0XFFFCC000			//B port

#define UART422_BASE 0x700008	
#define UART485_BASE 0x700000

#define baud_2400	 0x30
#define baud_4800	 0x18
#define baud_9600	 0x0c
#define baud_192	 0x06
#define baud_384	 0x03
#define baud_1152	 0x01	 	 

//16c552
#define  aComPortBaseAddr     (*(volatile unsigned char *)0x00700008)
#define  aRecBuffer           (*(volatile unsigned char *)0x00700008)
#define  aTransBuffer         (*(volatile unsigned char *)0x00700008)
#define  aInterruptEnable     (*(volatile unsigned char *)0x00700009)
#define  aIntIdentify         (*(volatile unsigned char *)0x0070000a)
#define  aFIFO_Control        (*(volatile unsigned char *)0x0070000a)
#define  aLineControl         (*(volatile unsigned char *)0x0070000b)
#define  aModemControl        (*(volatile unsigned char *)0x0070000c)
#define  aLineStatus          (*(volatile unsigned char *)0x0070000d)
#define  aModemStatus         (*(volatile unsigned char *)0x0070000e)
#define  aLSB_DivisorLatch    (*(volatile unsigned char *)0x00700008)
#define  aMSB_DivisorLatch    (*(volatile unsigned char *)0x00700009)

//com0
#define  COM0_USBRGR          (*(volatile unsigned int  *)0xFFFD0020)
#define  COM0_USMR            (*(volatile unsigned int  *)0xFFFD0004)
#define  COM0_USCR            (*(volatile unsigned int  *)0xFFFD0000)
#define  COM0_USCSR           (*(volatile unsigned int  *)0xFFFD0014)
#define  COM0_RHR             (*(volatile unsigned char *)0xFFFD0018)
#define  COM0_THR             (*(volatile unsigned char *)0xFFFD001c)


struct  comm_buf_fm  PortA;
struct  comm_buf_fm  Comm0;

void UART_init(unsigned int port,unsigned int baud)
{
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	*(volatile unsigned *)(PIO_PDR)=0xE000;		//pio disable
	*(volatile unsigned *)(UART_BASE+USBRGR)=baud;
	*(volatile unsigned *)(UART_BASE+USCR) = 0x15c;
	*(volatile unsigned *)(UART_BASE+USMR) = 0x8c0;	//8bit,1 stop bit,no parity
//	*(volatile unsigned *)(UART_BASE+UCON) = 0x09;		//Enable Interrupt
	*(volatile unsigned *)(UART_BASE+USCR) = 0x050;
}

/*
void UART_trans(unsigned port,char d)
{
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	while((GET_USCSR(UART_BASE) & 0x2)!=0X2);
	SENDD(UART_BASE,d);	
}

char UART_recev(unsigned port)
{
	int i;
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	for(i=0;i<1000;i++)
	{
		if((GET_USCSR(UART_BASE) & 0x1)==0x1)
		{
			break;
		}
	}
	return RECVD(UART_BASE);
}

void UART_send(unsigned port,char *buf,int BufLen)
{
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	int i=0;
	while(i<BufLen)
	{
		while((GET_USCSR(UART_BASE) & 0x2)!=0X2);
			SENDD(UART_BASE,buf[i++]);
	}
}

int UART_get(unsigned port,char *buf,int BufLen)
{
	int count=0;
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	int status=1;
	
	for(count=0;count<BufLen;count++)
	{
		while(!(status=(GET_USCSR(UART_BASE) & 0x1)));
			if(status)
				buf[count]=RECVD(UART_BASE);
			else
				buf[count]=0;
	}
		
	return count;
}

void UART_pdcsend(unsigned port,char *buf,int BufLen)
{
	unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
	while((GET_USCSR(UART_BASE) & 0x12)!=0X12);
	
	*(volatile unsigned *)(UART_BASE+USTPR)=buf;
	*(volatile unsigned *)(UART_BASE+USTCR)=BufLen;
	
}*/


//422
void UART422_init(unsigned char baud)
{
   aLineControl = 0x80;            /*Enable  Set  Baudrate*/
   aLSB_DivisorLatch = baud;  /*Set Baudrate*/
   aMSB_DivisorLatch = 0;
   aLineControl = 0x03;
   aFIFO_Control = 0xc9;           /* enable  FIFO  */ 
   aInterruptEnable = 0x00;
}


void  UART422_server(void)
{
  unsigned char  temp;
  if( aLineStatus & 0x1E )
    {
      temp = aRecBuffer;
    }
  if( aLineStatus & 0x01 )
    {
      PortA.RecvBuf[PortA.RecvSet] = aRecBuffer;
      PortA.RecvSet++;
      if((PortA.RecvSet) >= RECVNUM)
       PortA.RecvSet = 0; 
       //PortA.RecvFlag = 1;
    }
  if( aLineStatus & 0x20 ) 
    {
      if( PortA.SendSet != PortA.SendGet )
        {
           aTransBuffer = PortA.SendBuf[PortA.SendGet];
           PortA.SendBuf[PortA.SendGet] = 0;
           PortA.SendGet++;
           if( (PortA.SendGet) >= SENDNUM )
             PortA.SendGet = 0;
             //PortA.SendFlag = 1;
        } 
    } 
}

void  Comm0Server(void)
{
 // unsigned char  temp;
/*  if( COM0_USCSR & 0x1E0 )
    {
      temp = COM0_RHR;
    }
    */
  if( (COM0_USCSR & 0x1) )
    {
      Comm0.RecvBuf[Comm0.RecvSet] = COM0_RHR;
      Comm0.RecvSet++;
      if((Comm0.RecvSet) >= RECVNUM)
       Comm0.RecvSet = 0; 
       //Comm0.RecvFlag = 1;
    }
  if( (COM0_USCSR & 0x2) ) 
    {
      if( Comm0.SendSet != Comm0.SendGet )
        {
           COM0_THR = Comm0.SendBuf[Comm0.SendGet];
           Comm0.SendBuf[Comm0.SendGet]=0;
           Comm0.SendGet++;
           if( (Comm0.SendGet) >= SENDNUM )
             Comm0.SendGet = 0;
             //Comm0.SendFlag = 1;
        } 
    } 

}

void  InitCommBuf(void)
{
  PortA.RecvGet = PortA.RecvSet = 0;
  Comm0.RecvGet = Comm0.RecvSet = 0;

  UART422_init(baud_9600);
  
  UART_init(0,208);
  
}	

void  CommRun(void)
{
   UART422_server();
   Comm0Server();

   if((PortA.RecvSet) >= RECVNUM)
       PortA.RecvSet = 0; 
   if((PortA.RecvGet) >= RECVNUM)
       PortA.RecvGet = 0; 
   if((Comm0.RecvSet) >= RECVNUM)
       Comm0.RecvSet = 0; 
   if((Comm0.RecvGet) >= RECVNUM)
       Comm0.RecvGet = 0; 
   
   
}











⌨️ 快捷键说明

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