📄 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 + -