InitPeripheralClocks 打开了时钟。
CpuSysRegs.PCLKCR19.bit.LIN_A = 1;
CpuSysRegs.PCLKCR19.bit.LIN_B = 1; //低速用了10分频,100MHZ/10=10M
端口复用 // 复用值1011b GPIO22=LINB_TX复用11,GPIO23=LINB_RX复用11,
GpioCtrlRegs.GPAGMUX2.bit.GPIO22 = 0x2;
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0x3;
GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 0x02;
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0x01; //=RX
寄存器初始化(LIN作用UART使用)
EALLOW;
LinbRegs.SCIGCR0.bit.RESET = 0; // Into reset
LinbRegs.SCIGCR0.bit.RESET = 1; // Out of reset
DELAY_US(1000);
LinbRegs.SCIGCR1.bit.SWnRST = 0; // Into software reset
DELAY_US(1000);
//SCI Configurations
LinbRegs.SCIGCR1.bit.COMMMODE = 0; // Idle-Line Mode
LinbRegs.SCIGCR1.bit.TIMINGMODE = 1; // Asynchronous Timing
LinbRegs.SCIGCR1.bit.PARITYENA = 0; // No Parity Check
LinbRegs.SCIGCR1.bit.PARITY = 0; // Odd Parity
LinbRegs.SCIGCR1.bit.STOP = 0; // One Stop Bit
LinbRegs.SCIGCR1.bit.CLK_MASTER = 1; // Enable SCI Clock
LinbRegs.SCIGCR1.bit.LINMODE = 0; // SCI Mode
LinbRegs.SCIGCR1.bit.SLEEP = 0; // Ensure Out of Sleep
LinbRegs.SCIGCR1.bit.ADAPT = 0; //auto baudrate
LinbRegs.SCIGCR1.bit.MBUFMODE = 0; // none Buffer Mode
LinbRegs.SCIGCR1.bit.LOOPBACK = 1; // External Loopback 使用1或0都是同样的错误。
LinbRegs.SCIGCR1.bit.CONT = 1; // Continue on Suspend in Emulation Mode
LinbRegs.SCIGCR1.bit.RXENA = 1; // Enable RX
LinbRegs.SCIGCR1.bit.TXENA = 1; // Enable TX
LinbRegs.SCIGCR2.bit.POWERDOWN = 0;
//Ensure IODFT is disabled
LinbRegs.IODFTCTRL.bit.IODFTENA = 0x0;
//Set transmission length )
LinbRegs.SCIFORMAT.bit.*** = 7; // Eight bits
LinbRegs.SCIFORMAT.bit.LENGTH = 0; // 1 byte
//Set baudrate
LinbRegs.BRSR.bit.SCI_LIN_PSL = 1041; //LSPCLKDIV=10, 10M/9600
LinbRegs.BRSR.bit.SCI_LIN_PSH = ;
LinbRegs.BRSR.bit.M = 0;
// Enable interrupts
LinbRegs.SCISETINT.bit.SETRXINT = 1; // Enable RX interrupt
LinbRegs.SCISETINT.bit.SETTXINT = 1; // Enable TX interrupt,要发送的时候再打开。
//Set interrupt priority
LinbRegs.SCICLEARINTLVL.all = 0xFFFFFFFF; // Set Int level of all interrupts to LVL 0
DELAY_US(1000);
LinbRegs.SCIGCR1.bit.SWnRST = 1; // bring out of software reset
DELAY_US(1000);
// Disable write to protected registers
EDIS;
其它的一些中断配置代码:
EALLOW;
PieVectTable.LINB_0_INT = &Rx2Isr;
PieVectTable.LINB_1_INT = &Tx2Isr;
EDIS;
PieCtrlRegs.PIEIER8.bit.INTx9 = 1; //LINA0
PieCtrlRegs.PIEIER8.bit.INTx10 = 1; //LINA1
PieCtrlRegs.PIEIER8.bit.INTx11 = 1; //LINB0
PieCtrlRegs.PIEIER8.bit.INTx12 = 1; //LINB1
IER |= M_INT8;//LIN
通信收发没任何反应,检查状态寄存器发现LinbRegs.SCIFLR寄存器的BRKDT和BUSY一直是1,每个DELAY_US(1000)后观察都一样,不知道这个错误是如何产生的?(开发板的杜邦线已经插开)