Other Parts Discussed in Thread: C2000WARE
各位先進好,目前使用LIN-SCI MODE 無法進入接收中斷(已先使用LOOPBACK 測試接收時可進入中斷),目前BAUDRATE設定為19200,是否為設定上有誤,煩請協助,謝謝。
程式碼如下:
void InitLinAGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pullup on GPIO46
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 0x3; // GPIO28 = LIN-SCI TX
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0x3; // GPIO28 = LIN-SCI TX
GpioCtrlRegs.GPADIR.bit.GPIO28 = 1; // 1 is an output
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pullup on GPIO47
GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3;
GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0x3; // GPIO29 = LIN-SCI RX
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x3; // GPIO29 = LIN-SCI RX
GpioCtrlRegs.GPADIR.bit.GPIO29 = 0; // 0 is an input
EDIS;
}
//========================================================================
// SCIA Init
//========================================================================
void InitLinA(void)
{
InitLinAGpio();
EALLOW;
LinaRegs.SCIGCR0.bit.RESET = 1;
LinaRegs.SCIPIO0.bit.TXFUNC = 1;
LinaRegs.SCIPIO0.bit.RXFUNC = 1;
LinaRegs.SCIGCR1.bit.SWnRST = 0; // Enter LIN reset state to perform configurations
LinaRegs.SCIGCR1.bit.LINMODE = 0; // SCI mode
LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; // asyn mode , Should be set to 1 for SCI mode.
LinaRegs.SCIGCR1.bit.CLK_Master = 1; // Enable clock to the SCI module.
LinaRegs.SCIGCR1.bit.COMMMODE = 0; // Idle line mode
LinaRegs.SCIGCR1.bit.STOP = 0; // 1 stop bit
LinaRegs.SCIGCR1.bit.PARITYENA = 0; // Disable parity check
LinaRegs.SCIGCR1.bit.MBUFMODE = 0; // Disable multi-buffer mode
LinaRegs.SCIGCR1.bit.CONT = 1; // Continue on suspend
LinaRegs.SCIFORMAT.bit.CHAR = 0x7; // Set character length as 8-bits
LinaRegs.SCIFORMAT.bit.LENGTH = 0x0; // Set to 1 character in response field
LinaRegs.SCIGCR1.bit.LOOPBACK =0; // Enable Internal Loopback mode
LinaRegs.BRSR.bit.SCI_LIN_PSL = 389;
LinaRegs.BRSR.bit.M = 10; // BAUDRATE = 19200
LinaRegs.SCIGCR1.bit.TXENA = 1; // Enable Transmitter
LinaRegs.SCIGCR1.bit.RXENA = 1; // Enable Receiver
LinaRegs.SCICLEARINT.all = LIN_INT_ALL; // Clear all interrupts
LinaRegs.SCISETINT.bit.SETRXINT = 1; // Enable RX Interrupt
LinaRegs.SCICLEARINTLVL.bit.CLRRXINTLVL = 1; // Set the interrupt priority to line 0 (high)
LinaRegs.LIN_GLB_INT_EN.bit.GLBINT0_EN= 1; // Enable LIN0 RX Interrupt
LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1; // Clear LIN0 RX Interrupt Flag
LinaRegs.SCIGCR1.bit.SWnRST = 1; // Exit LIN reset state
EDIS;
}
void main(void)
{
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
InitPieVectTable();
InitCpu1Gpio();
InitLinA();
IER |= M_INT6;
PieCtrlRegs.PIEIER6.bit.INTx5 = 1; // Enable 6.5 - LINA_0 Interrupt
EINT;
ERTM;
for(;;)
{
SCIA_Tx_Data_routine();
SCIA_Process();
}
}
interrupt void LINA_0_ISR(void)
{
DINT;
INT_SCIARx();
LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1; // Clear LIN0 RX Interrupt
PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
EINT;
}