554 lines
16 KiB
C
554 lines
16 KiB
C
|
/****************************************************************/
|
|||
|
/* TMS320C32 */
|
|||
|
/* ====== BIOS, <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> ====== */
|
|||
|
/* <09><><EFBFBD><EFBFBD> <20><><EFBFBD> (<28>) 1998-2000 <20>. */
|
|||
|
/****************************************************************
|
|||
|
RS485.<EFBFBD>
|
|||
|
****************************************************************
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> UART *
|
|||
|
****************************************************************/
|
|||
|
|
|||
|
//#include "big_dsp_module.h"
|
|||
|
|
|||
|
|
|||
|
#include "DSP2833x_Device.h"
|
|||
|
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
|||
|
|
|||
|
#include "RS485.h"
|
|||
|
#include "bios_dsp.h"
|
|||
|
#include "cntrl_adr.h"
|
|||
|
|
|||
|
#include "tools.h"
|
|||
|
|
|||
|
//#include "flash_tools.h"
|
|||
|
|
|||
|
|
|||
|
RS_DATA rs_a,rs_b;
|
|||
|
|
|||
|
unsigned int RS_Len[70]={0};
|
|||
|
|
|||
|
static char size_cmd15=1;
|
|||
|
|
|||
|
void RS_RX_Handler(RS_DATA *rs_arr);
|
|||
|
void RS_TX_Handler(RS_DATA *rs_arr);
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
interrupt void RSA_RX_Handler(void)
|
|||
|
{
|
|||
|
// Set interrupt priority:
|
|||
|
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
|
|||
|
IER |= M_INT9;
|
|||
|
IER &= MINT9; // Set "global" priority
|
|||
|
PieCtrlRegs.PIEIER9.all &= MG91; // Set "group" priority
|
|||
|
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
|||
|
EINT;
|
|||
|
|
|||
|
clear_timer_rs_live(&rs_a);
|
|||
|
RS_RX_Handler(&rs_a);
|
|||
|
|
|||
|
// Restore registers saved:
|
|||
|
DINT;
|
|||
|
PieCtrlRegs.PIEIER9.all = TempPIEIER;
|
|||
|
}
|
|||
|
|
|||
|
interrupt void RSB_RX_Handler(void)
|
|||
|
{
|
|||
|
// Set interrupt priority:
|
|||
|
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
|
|||
|
IER |= M_INT9;
|
|||
|
IER &= MINT9; // Set "global" priority
|
|||
|
PieCtrlRegs.PIEIER9.all &= MG93; // Set "group" priority
|
|||
|
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
|||
|
EINT;
|
|||
|
|
|||
|
clear_timer_rs_live(&rs_b);
|
|||
|
RS_RX_Handler(&rs_b);
|
|||
|
|
|||
|
// Restore registers saved:
|
|||
|
DINT;
|
|||
|
PieCtrlRegs.PIEIER9.all = TempPIEIER;
|
|||
|
}
|
|||
|
|
|||
|
interrupt void RSA_TX_Handler(void)
|
|||
|
{
|
|||
|
// Set interrupt priority:
|
|||
|
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
|
|||
|
IER |= M_INT9;
|
|||
|
IER &= MINT9; // Set "global" priority
|
|||
|
PieCtrlRegs.PIEIER9.all &= MG92; // Set "group" priority
|
|||
|
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
|||
|
EINT;
|
|||
|
|
|||
|
clear_timer_rs_live(&rs_a);
|
|||
|
RS_TX_Handler(&rs_a);
|
|||
|
|
|||
|
// Restore registers saved:
|
|||
|
DINT;
|
|||
|
PieCtrlRegs.PIEIER9.all = TempPIEIER;
|
|||
|
}
|
|||
|
|
|||
|
interrupt void RSB_TX_Handler(void)
|
|||
|
{
|
|||
|
// Set interrupt priority:
|
|||
|
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
|
|||
|
IER |= M_INT9;
|
|||
|
IER &= MINT9; // Set "global" priority
|
|||
|
PieCtrlRegs.PIEIER9.all &= MG94; // Set "group" priority
|
|||
|
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
|||
|
EINT;
|
|||
|
|
|||
|
clear_timer_rs_live(&rs_b);
|
|||
|
RS_TX_Handler(&rs_b);
|
|||
|
|
|||
|
// Restore registers saved:
|
|||
|
DINT;
|
|||
|
PieCtrlRegs.PIEIER9.all = TempPIEIER;
|
|||
|
}
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void RS_RX_Handler(RS_DATA *rs_arr)
|
|||
|
{
|
|||
|
char Rc;
|
|||
|
char RS_BytePtr;
|
|||
|
|
|||
|
// led1_on();
|
|||
|
|
|||
|
for(;;) // 'goto' <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>
|
|||
|
{
|
|||
|
if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag
|
|||
|
{
|
|||
|
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
|
|||
|
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
|
|||
|
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if(rs_arr->SciRegs->SCIRXST.bit.RXERROR) // Receiver error flag
|
|||
|
{
|
|||
|
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0; // Reset SCI
|
|||
|
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if(rs_arr->RS_DataReady) continue; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if (rs_arr->RS_Flag9bit==1) // <20><><EFBFBD> RS485????????
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_FlagBegin = true; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_RecvLen = 0;
|
|||
|
rs_arr->RS_FlagSkiping = false;
|
|||
|
rs_arr->RS_HeaderCnt = 0;
|
|||
|
rs_arr->RS_Cmd = 0;
|
|||
|
}
|
|||
|
|
|||
|
if(rs_arr->RS_FlagSkiping) continue; // <20><> <20><><EFBFBD>
|
|||
|
|
|||
|
if (rs_arr->RS_FlagBegin) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if (rs_arr->RS_HeaderCnt==0) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
|
|||
|
|| ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING))
|
|||
|
|
|||
|
{
|
|||
|
rs_arr->addr_recive=Rc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
RS_SetBitMode(rs_arr,8); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 8-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rs_arr->RS_FlagSkiping = true; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_FlagBegin = false; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// led1_off();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20>.<2E>.
|
|||
|
|
|||
|
if (rs_arr->RS_HeaderCnt == 7 && rs_arr->RS_Cmd==CMD_MODBUS_16 && !rs_arr->flag_LEADING)
|
|||
|
{
|
|||
|
RS_Len[CMD_MODBUS_16] = (10+Rc);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (rs_arr->RS_HeaderCnt == 2)
|
|||
|
{
|
|||
|
rs_arr->RS_Cmd = Rc;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// CMD_LOAD - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// CMD_STD_ANS - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ((rs_arr->RS_Cmd < CMD_MODBUS_3) || (rs_arr->RS_Cmd > CMD_STD_ANS) || (RS_Len[rs_arr->RS_Cmd]<3)
|
|||
|
|| ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD))
|
|||
|
)
|
|||
|
{
|
|||
|
RS_SetBitMode(rs_arr,9); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD> RS485?
|
|||
|
rs_arr->RS_HeaderCnt = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>
|
|||
|
rs_arr->RS_FlagBegin = true;
|
|||
|
rs_arr->RS_FlagSkiping = false;
|
|||
|
rs_arr->RS_Cmd=0;
|
|||
|
// led1_off();
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (rs_arr->RS_Cmd == CMD_LOAD) // <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_FlagBegin = false;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) ||
|
|||
|
(rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header)))
|
|||
|
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
RS_SetBitMode(rs_arr,9); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD> RS485?
|
|||
|
rs_arr->RS_FlagBegin = false;
|
|||
|
rs_arr->RS_FlagSkiping = true;
|
|||
|
rs_arr->RS_DataReady = true;
|
|||
|
rs_arr->RS_Cmd=0;
|
|||
|
// led1_off();
|
|||
|
} } }
|
|||
|
else // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin || rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End)
|
|||
|
{
|
|||
|
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if(rs_arr->RS_DataReady) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
|||
|
{ // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_FlagSkiping = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// led1_off();
|
|||
|
continue;
|
|||
|
}
|
|||
|
RS_BytePtr = rs_arr->RS_RecvLen++ % 2;
|
|||
|
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
else *rs_arr->pRS_RecvPtr = Rc<<8;
|
|||
|
|
|||
|
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
rs_arr->RS_PrevCmd = rs_arr->RS_Header[1] = CMD_LOAD;
|
|||
|
RS_SetBitMode(rs_arr,9); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD> RS485?
|
|||
|
rs_arr->RS_FlagSkiping = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->RS_DataReady = true; // <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// led1_off();
|
|||
|
} } } }
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void RS_TX_Handler(RS_DATA *rs_arr)
|
|||
|
{
|
|||
|
char RS_BytePtr;
|
|||
|
// unsigned int i;
|
|||
|
|
|||
|
if(rs_arr->RS_SendBlockMode == BM_CHAR32)
|
|||
|
{
|
|||
|
if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
|||
|
{
|
|||
|
enableUARTInt(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
SCI_send(rs_arr,*(rs_arr->pRS_SendPtr++));
|
|||
|
|
|||
|
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
|||
|
{
|
|||
|
RS_Wait4OK(rs_arr);
|
|||
|
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> PC */
|
|||
|
|
|||
|
RS_SetBitMode(rs_arr,9); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD> RS485?*/
|
|||
|
RS_Line_to_receive(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485 */
|
|||
|
|
|||
|
rs_arr->flag_TIMEOUT_to_Send=false; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
}
|
|||
|
else /* BM_PACKED */
|
|||
|
{
|
|||
|
|
|||
|
RS_BytePtr = (rs_arr->RS_SendLen++) % 2;
|
|||
|
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
|||
|
{
|
|||
|
enableUARTInt(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) ));
|
|||
|
else SCI_send(rs_arr, HIBYTE( *rs_arr->pRS_SendPtr ));
|
|||
|
|
|||
|
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
|||
|
{
|
|||
|
RS_Wait4OK(rs_arr);
|
|||
|
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> PC */
|
|||
|
// RS_SetBitMode(rs_arr,9); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD> RS485?*/
|
|||
|
// RS_Line_to_receive(); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485 */
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
|
|||
|
// rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag
|
|||
|
}
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void setup_arr_cmd_length()
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for (i=0;i<70;i++) RS_Len[i]=i;
|
|||
|
|
|||
|
RS_Len[CMD_LOAD] = 12;
|
|||
|
RS_Len[CMD_UPLOAD] = 12;
|
|||
|
RS_Len[CMD_RUN] = 8;
|
|||
|
RS_Len[CMD_XFLASH] = 9;
|
|||
|
RS_Len[CMD_TFLASH] = 16;
|
|||
|
RS_Len[CMD_PEEK] = 8;
|
|||
|
RS_Len[CMD_POKE] = 12;
|
|||
|
RS_Len[CMD_INITLOAD] = 12;
|
|||
|
RS_Len[CMD_INIT] = 5;
|
|||
|
RS_Len[CMD_VECTOR] = size_cmd15-2; //sizeof(CMD_TO_TMS)-2;
|
|||
|
RS_Len[CMD_STD] = size_cmd15-1; //sizeof(CMD_TO_TMS)-1;
|
|||
|
RS_Len[CMD_IMPULSE] = 8;
|
|||
|
RS_Len[CMD_MODBUS_3] = 8;
|
|||
|
RS_Len[CMD_MODBUS_6] = 8;
|
|||
|
RS_Len[CMD_MODBUS_16] = 13;
|
|||
|
RS_Len[CMD_MODBUS_15] = 27;
|
|||
|
RS_Len[CMD_EXTEND] = 18;
|
|||
|
}
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void RS_SetBitMode(RS_DATA *rs_arr,int n)
|
|||
|
{
|
|||
|
if(n == 8)
|
|||
|
{
|
|||
|
RS_SetLineMode(rs_arr,8,'N',1); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
rs_arr->RS_Flag9bit=0;
|
|||
|
}
|
|||
|
if(n == 9)
|
|||
|
{
|
|||
|
RS_SetLineMode(rs_arr,8,'N',1); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
rs_arr->RS_Flag9bit=1;
|
|||
|
} }
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 32-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.
|
|||
|
@precondition <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>-<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS_TRANSMIT_INTR
|
|||
|
@param buf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
@param len <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
@see RS_BSend, RS_TRANSMIT_INTR */
|
|||
|
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
|
|||
|
{
|
|||
|
unsigned int i;
|
|||
|
for (i=0; i <= 30000; i++){} /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> PC */
|
|||
|
|
|||
|
RS_Line_to_send(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485 */
|
|||
|
|
|||
|
for (i=0; i <= 10000; i++){} /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> PC */
|
|||
|
|
|||
|
rs_arr->RS_SLength = len; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
rs_arr->pRS_SendPtr = pBuf + 1;
|
|||
|
|
|||
|
rs_arr->RS_SendBlockMode = BM_CHAR32;
|
|||
|
|
|||
|
RS_Wait4OK(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
RS_SetBitMode(rs_arr,8); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 8-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
rs_arr->RS_SendLen = 1; /* <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if(len > 1)
|
|||
|
{
|
|||
|
enableUARTIntW(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
SCI_send(rs_arr, *pBuf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SCI_send(rs_arr, *pBuf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
RS_Wait4OK(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> PC */
|
|||
|
RS_SetBitMode(rs_arr,9); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 9-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
RS_Line_to_receive(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485 */
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
|
|||
|
{
|
|||
|
|
|||
|
RS_Line_to_send(rs_arr); // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485
|
|||
|
|
|||
|
rs_arr->RS_SLength = len; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->pRS_SendPtr = pBuf;
|
|||
|
rs_arr->RS_SendBlockMode = BM_PACKED;
|
|||
|
|
|||
|
RS_Wait4OK(rs_arr); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
RS_SetBitMode(rs_arr,8); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 8-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
rs_arr->RS_SendLen = 1; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
enableUARTIntW(rs_arr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
SCI_send(rs_arr,HIBYTE(*pBuf));// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
@param speed <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
@param speed <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
|
|||
|
{
|
|||
|
long SciBaud;
|
|||
|
|
|||
|
SciBaud = LSPCLK/(speed*8.0);
|
|||
|
|
|||
|
// if((SciBaud-(unsigned int)SciBaud)>0.5) SciBaud++;
|
|||
|
|
|||
|
rs_arr->SciRegs->SCIHBAUD = HIBYTE((int)SciBaud);
|
|||
|
rs_arr->SciRegs->SCILBAUD = LOBYTE((int)SciBaud);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void create_uart_vars(char size_cmd15_set)
|
|||
|
{
|
|||
|
size_cmd15=size_cmd15_set;
|
|||
|
rs_a.commnumber=COM_1;
|
|||
|
rs_b.commnumber=COM_2;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
void setup_uart(char commnumber, unsigned long speed_baud)
|
|||
|
{
|
|||
|
volatile struct SCI_REGS *SciRegs;
|
|||
|
RS_DATA *rs_arr;
|
|||
|
|
|||
|
if(commnumber==COM_1)
|
|||
|
{
|
|||
|
rs_a.SciRegs = &SciaRegs;
|
|||
|
rs_arr = &rs_a;
|
|||
|
|
|||
|
EALLOW;
|
|||
|
|
|||
|
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // SCITXDA - SCI-A transmit(O)
|
|||
|
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // SCIRXDA - SCI-A receive (I)
|
|||
|
|
|||
|
PieVectTable.SCIRXINTA = &RSA_RX_Handler;
|
|||
|
PieVectTable.SCITXINTA = &RSA_TX_Handler;
|
|||
|
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
|
|||
|
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
|
|||
|
IER |= M_INT9; // Enable CPU INT
|
|||
|
EDIS;
|
|||
|
}
|
|||
|
|
|||
|
if(commnumber==COM_2)
|
|||
|
{
|
|||
|
rs_b.SciRegs = &ScibRegs;
|
|||
|
rs_arr = &rs_b;
|
|||
|
|
|||
|
EALLOW;
|
|||
|
|
|||
|
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 2; // SCITXDB - SCI-B transmit(O)
|
|||
|
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; // SCIRXDB - SCI-B receive (I)
|
|||
|
|
|||
|
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO 34 - general purpose I/O 34 (default)
|
|||
|
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // Configures the GPIO pin as an output
|
|||
|
|
|||
|
PieVectTable.SCIRXINTB = &RSB_RX_Handler;
|
|||
|
PieVectTable.SCITXINTB = &RSB_TX_Handler;
|
|||
|
|
|||
|
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
|
|||
|
PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE Group 9, INT4
|
|||
|
IER |= M_INT9; // Enable CPU INT
|
|||
|
EDIS;
|
|||
|
}
|
|||
|
|
|||
|
rs_arr->commnumber = commnumber;
|
|||
|
SciRegs = rs_arr->SciRegs;
|
|||
|
RS_SetLineMode(rs_arr,8,'N',1);
|
|||
|
|
|||
|
// enable TX, RX, internal SCICLK,
|
|||
|
// Disable RX ERR, SLEEP, TXWAKE
|
|||
|
|
|||
|
SciRegs->SCIFFCT.bit.ABDCLR=1;
|
|||
|
SciRegs->SCIFFCT.bit.CDC=0;
|
|||
|
|
|||
|
SciRegs->SCICTL1.bit.RXERRINTENA=0;
|
|||
|
SciRegs->SCICTL1.bit.SWRESET=0;
|
|||
|
SciRegs->SCICTL1.bit.TXWAKE=0;
|
|||
|
SciRegs->SCICTL1.bit.SLEEP=0;
|
|||
|
SciRegs->SCICTL1.bit.TXENA=1;
|
|||
|
SciRegs->SCICTL1.bit.RXENA=1;
|
|||
|
|
|||
|
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
|
|||
|
SciRegs->SCIFFRX.bit.RXFFIL=1; // <09><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
setup_arr_cmd_length();
|
|||
|
RS_SetLineSpeed(rs_arr,speed_baud); // <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
RS_Line_to_receive(rs_arr); // <09><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485
|
|||
|
enableUARTInt(rs_arr); // <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART
|
|||
|
RS_SetBitMode(rs_arr,9);
|
|||
|
rs_arr->RS_PrevCmd = 0; // <09><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
rs_arr->flag_TIMEOUT_to_Send = 0;
|
|||
|
rs_arr->flag_LEADING = 0;
|
|||
|
|
|||
|
SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
|
|||
|
SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
|
|||
|
}
|
|||
|
|
|||
|
/** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
@param bit <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
@param parity <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (N,O,E,M,S)
|
|||
|
@param stop <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop)
|
|||
|
{
|
|||
|
volatile struct SCI_REGS *SciRegs;
|
|||
|
/*
|
|||
|
SCICCR - SCI Communication Control Register
|
|||
|
Bit Bit Name Designation Functions
|
|||
|
2-0 SCI CHAR2-0 SCICHAR Select the character (data) length (one to eight bits).
|
|||
|
3 ADDR/IDLE MODE ADDRIDLE_MODE The idle-line mode (0) is usually used for normal communications because the address-bit mode adds an extra bit to the frame. The idle-line mode does not add this extra bit and is compatible with RS-232 type communications.
|
|||
|
4 LOOP BACK ENABLE LOOPBKENA This bit enables (1) the Loop Back test mode where the Tx pin is internally connected to the Rx pin.
|
|||
|
5 PARITY ENABLE PARITYENA Enables the parity function if set to 1, or disables the parity function if cleared to 0.
|
|||
|
6 EVEN/ODD PARITY PARITY If parity is enabled, selects odd parity if cleared to 0 or even parity if set to 1.
|
|||
|
7 STOP BITS STOPBITS Determines the number of stop bits transmitted-one stop bit if cleared to 0 or two stop bits if set to 1.
|
|||
|
*/
|
|||
|
|
|||
|
SciRegs = rs_arr->SciRegs;
|
|||
|
|
|||
|
if(bit>0 && bit<9) SciRegs->SCICCR.bit.SCICHAR = bit-1;
|
|||
|
|
|||
|
switch(parity)
|
|||
|
{
|
|||
|
case 'N': SciRegs->SCICCR.bit.PARITYENA = 0;
|
|||
|
break;
|
|||
|
case 'O': SciRegs->SCICCR.bit.PARITYENA = 1;
|
|||
|
SciRegs->SCICCR.bit.PARITY = 0;
|
|||
|
break;
|
|||
|
case 'E': SciRegs->SCICCR.bit.PARITYENA = 1;
|
|||
|
SciRegs->SCICCR.bit.PARITY = 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (stop==1) SciRegs->SCICCR.bit.STOPBITS = 0;
|
|||
|
if (stop==2) SciRegs->SCICCR.bit.STOPBITS = 1;
|
|||
|
|
|||
|
SciRegs->SCICCR.bit.LOOPBKENA = 0; //0
|
|||
|
SciRegs->SCICCR.bit.ADDRIDLE_MODE = 0;
|
|||
|
}
|
|||
|
|
|||
|
void clear_timer_rs_live(RS_DATA *rs_arr)
|
|||
|
{
|
|||
|
rs_arr->time_wait_rs_out=0;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS */
|
|||
|
void test_rs_live(RS_DATA *rs_arr)
|
|||
|
{
|
|||
|
/* if (rs_arr->time_wait_rs_out < RS_TIME_OUT)
|
|||
|
rs_arr->time_wait_rs_out++;
|
|||
|
else
|
|||
|
{
|
|||
|
rs_arr->time_wait_rs_out=0;
|
|||
|
RS_Line_to_receive(rs_arr); // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RS485
|
|||
|
RS_SetBitMode(rs_arr,9);
|
|||
|
}*/ }
|