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

📄 rs485.c

📁 在S3C2410上实现RS485通信
💻 C
字号:
#include <string.h>
#include <stdlib.h>
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "uart0.h"

void Uart_Port_Set(void);
void Uart_Port_Return(void);

void __irq Uart0_TxInt(void);
void __irq Uart0_RxIntOrErr(void);
void __irq Uart0_TxDmaDone(void);
void __irq Uart0_RxDmaDone(void);
void __irq Uart0_RxDmaOrErr(void);
void __irq Uart0_TxFifo(void);
void __irq Uart0_RxFifoOrErr(void);
void __irq Uart0_AfcTx(void);
void __irq Uart0_AfcRxOrErr(void);

void __sub_Uart0_RxInt(void);
void __sub_Uart0_RxFifo(void);
void __sub_Uart0_RxAfc(void);
void __sub_Uart0_RxErrInt(void);


volatile U16 rx_dncs;
volatile U32 rx_point,rx_isdone,rx_filesize,rx_checksum;
volatile U32 isDone,isTxInt,isRxInt,tx_cnt,tx_end,rx_cnt,rx_end,afc_err;
volatile U8 *txdataPt;
volatile U8 *txdataFl;
volatile U8 *rxdataPt;
volatile U8 *rxdataCk;


volatile U32 save_rGPHCON,save_rGPHDAT,save_rGPHUP;
volatile U32 save_ULCON0,save_UCON0,save_UFCON0,save_UMCON0;
volatile U32 save_ULCON1,save_UCON1,save_UFCON1,save_UMCON1;
volatile U32 save_ULCON2,save_UCON2,save_UFCON2,save_UMCON2;

volatile static char *uart0TxStr;
volatile static char *uart0RxStr;

volatile static char *uart2TxStr;
volatile static char *uart2RxStr;

void Uart_Port_Set(void)
{
    //Push UART GPIO port configuration
    save_rGPHCON=rGPHCON; 
    save_rGPHDAT=rGPHDAT;
    save_rGPHUP=rGPHUP;
    //Configure UART port
    rGPHCON&=0x3c0000;
    rGPHCON|=0x2faaaa;	// nRTS1,nCTS1
    rGPHUP|=0x1ff;	//Uart port pull-up disable
    //rINTSUBMSK=0x7ff;   //SUBINT ALL MASK
    //Push Uart control registers 
    save_ULCON0=rULCON0;   		
    save_UCON0=rUCON0;	   	
    save_UFCON0=rUFCON0;   		
    save_UMCON0=rUMCON0;   		
    save_ULCON1=rULCON1;		
    save_UCON1 =rUCON1;		
    save_UFCON1=rUFCON1;		
    save_UMCON1=rUMCON1;	
    save_ULCON2=rULCON2;		
    save_UCON2 =rUCON2;		
    save_UFCON2=rUFCON2;		
    save_UMCON2=rUMCON2;		
    //Initialize UART1,2 port
}       
        
void Uart_Port_Return(void)
{       
    //Pop UART GPIO port configuration
    rGPHCON=save_rGPHCON;
    rGPHDAT=save_rGPHDAT;
    rGPHUP=save_rGPHUP;
    //Pop Uart control registers 
    rULCON0=save_ULCON0;   		
    rUCON0 =save_UCON0;   	
    rUFCON0=save_UFCON0;   		
    rUMCON0=save_UMCON0;   		
    rULCON1=save_ULCON1;		
    rUCON1 =save_UCON1;	
    rUFCON1=save_UFCON1;		
    rUMCON1=save_UMCON1;
    rULCON2=save_ULCON2;		
    rUCON2 =save_UCON2;	
    rUFCON2=save_UFCON2;		
    rUMCON2=save_UMCON2;
    		
}

void Uart_Uclk_En(int ch,int baud)
{
    /*
    int ch, baud;
    Uart_Printf("\nSelect UART channel[0:UART0/1:UART1/2:UART2]:\n");
    ch=Uart_GetIntNum();
    Uart_Printf("\nSelect baud rate :\n");
    baud=Uart_GetIntNum();
    */
    //if(ch == 0) {
   	//Uart_Select(0);
    	rUCON0|=0x400;	// Select UCLK
     	rUBRDIV0=( (int)(UCLK/16./baud) -1 );	//Baud rate divisior register
    	Uart_Printf("UCLK is enabled by UART0.\n"); 
    //	}
    //else if(ch==1){
    	Uart_Select(1);
    	rUCON1|=0x400;	// Select UCLK
        rUBRDIV1=( (int)(UCLK/16./baud) -1 );	//Baud rate divisior register
        Uart_Select(0);
        Uart_Printf("UCLK is enabled by UART1.\n");
    //	}
    //else {
    	Uart_Select(2);
    	rUCON2|=0x400;	// Select UCLK
        rUBRDIV2=( (int)(UCLK/16./baud) -1 );	//Baud rate divisior register
        Uart_Select(0);
        Uart_Printf("UCLK is enabled by UART2.\n");
    //	}
    //for(i=0;i<100;i++);	// For the satble operation
}

void Uart_Pclk_En(int ch, int baud)
{
    /*
    int ch, baud;
    Uart_Printf("\nSelect UART channel[0:UART0/1:UART1/2:UART2]:\n");
    ch=Uart_GetIntNum();
    Uart_Printf("\nSelect baud rate :\n");
    baud=Uart_GetIntNum();
    */
    
    //if(ch == 0) {
    	Uart_Select(0);
    	rUCON0&=0x3ff;	// Select PCLK
   	rUBRDIV0=( (int)(PCLK/16./baud) -1 );	//Baud rate divisior register
   	Uart_Printf("PCLK is enabled by UART0.\n"); 
   // 	}
   // else if(ch==1){
    	Uart_Select(1);
    //	rUCON1|=0x3ff;	// Select PCLK
    	rUCON1&=0x3ff;
   	rUBRDIV1=( (int)(PCLK/16./baud) -1 );	//Baud rate divisior register
   	Uart_Select(0);
   	Uart_Printf("PCLK is enabled by UART1.\n");
    //	}
    //else {
    	Uart_Select(2);
    	rUCON2&=0x3ff;
//    	rUCON2|=0x3ff;	// Select PCLK
   	rUBRDIV2=( (int)(PCLK/16./baud) -1 );	//Baud rate divisior register
   	Uart_Select(0);
   	Uart_Printf("PCLK is enabled by UART2.\n");
    //	}
    //for(i=0;i<100;i++);	// For the satble operation
}




void Test_Rs485(void)
{
    char rx,ch;
    int i=0;
    char buffer[16];
    Uart_Port_Set();//UART端口初始化 

    Uart_Select(0);    
    Uart_TxEmpty(1); //(UART1)wait until tx buffer is empty.
    Uart_TxEmpty(2); //(UART2)wait until tx buffer is empty.

    rULCON1=(0<<6)|(0<<3)|(0<<2)|(3);//(UART1)Normal,No parity,One stop bit, 8bit
    rULCON2=(0<<6)|(0<<3)|(0<<2)|(3);	//(UART2)Normal,No parity,One stop bit, 8bit
    rUCON1 &= 0x400;	//(UART1)For the PCLK <-> UCLK fuction
    rUCON2 &= 0x400;	//(UART2)For the PCLK <-> UCLK fuction
    rUCON1 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);//(UART1)
    rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);//(UART2)

    rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);	// Just for the safety
    rINTSUBMSK|=(BIT_SUB_RXD1|BIT_SUB_TXD1|BIT_SUB_ERR1);	// Just for the safety
    rINTMSK|=(BIT_UART1);		// Unmask sub int
    rINTMSK|=(BIT_UART2);		// Unmask sub int

 /**********************************************************************************/
    rGPGCON =rGPGCON&(~(0x3<<10))|(0x1<<10);  //  [11:10]=[01]:GPG5:output 4851_de_re
    rGPGCON =rGPGCON&(~(0x3<<12))|(0x1<<12);  //[13:12]=[01]:GPG6:output 4852_de_re
  ch=0x0;


  i=0x55;

		rGPGDAT = rGPGDAT|(0x1<<6);        // enable 485_2 tx
		rGPGDAT = rGPGDAT&(~(0x1<<5)); // enable 485_1 rx

	
    rGPGDAT = rGPGDAT&(~(0x1<<6));  //GPG6=0 enable 485_2 rx
    rGPGDAT = rGPGDAT|(0x1<<5); //GPG5=1 enable 485_1 tx



   for(i=0;i<10;i++)
 	{
		Uart_Printf("data=%d : tx2 ---> rx1 \n",i);
		rGPGDAT = rGPGDAT|(0x1<<6);        // enable 485_2 tx
		rGPGDAT = rGPGDAT&(~(0x1<<5)); // enable 485_1 rx

        rUTXH2 = i;
        while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
        
     while(1)
     {
 		if((rUTRSTAT1&0x1)==0x1)
 		{
 			rx=rURXH1;
 			break;
		}
	 }
 	
 	Uart_Printf("     tx1 -- > rx2 test OK\n");
	
    rGPGDAT = rGPGDAT&(~(0x1<<6));  //GPG6=0 enable 485_2 rx
    rGPGDAT = rGPGDAT|(0x1<<5); //GPG5=1 enable 485_1 tx

 	rUTXH1=50-i;
		Uart_Printf("data=%d : tx1 ---> rx2 \n",50-i);
   
     while(1)
     {
 		if((rUTRSTAT2&0x1)==0x1)
 		{
 			rx=rURXH2;
 			break;
 			
		}
	}
	 	Uart_Printf("     tx2 -- > rx1 test OK\n\n");
 	}
 	
}


⌨️ 快捷键说明

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