#include "UARTLIN_Drv.h" #include "lin_user.h" #include "r_cg_serial.h" #include "PINdef.h" static uint8_t lin_state,lin_rxdata; static uint8_t rxbuf[8],rxcount,rxlen,rxid,*prxbuf,txbuf[9]; static uint16_t rxchecksum; #define FLAG_FRAME_ERROR_MASK 0x04U #define LIN_EN P1_bit.no0 void UARTLIN_Init(void) { //LIN_EN = 1; R_UART0_Start(); R_UART0_Receive(&lin_rxdata,1); lin_state = LIN_STATE_INIT; } //间隔场中断处理 void UARTLIN_Break_Handle(uint8_t flag) { if (flag == 0X04) { if (lin_rxdata == 0x00) { lin_state = LIN_STATE_BREAK; } else { //lin error lin_state = LIN_STATE_IDLE; } } } //接收中断 void UARTLIN_Rx_Handle(void) { uint8_t i; switch (lin_state) { case LIN_STATE_BREAK: if (lin_rxdata == 0x55) { lin_state++; } else { //lin error lin_state = LIN_STATE_IDLE; } break; case LIN_STATE_SYNBYTE: rxid = lin_rxdata; for (i = 0; i < MSG_NUM; i++) { if (LIN_cfg_arr[i].pid == rxid) { rxlen = LIN_cfg_arr[i].len; rxchecksum = rxid; rxcount = 0; prxbuf = LIN_cfg_arr[i].buf; if (LIN_cfg_arr[i].dir == MSG_DIR_RX)//接收 { lin_state++; } else { //发送 lin_state += 2; for (i = 0; i < rxlen; i++) { txbuf[i] = prxbuf[i]; rxchecksum += prxbuf[i];// calc checksum if (rxchecksum > 0xff) { rxchecksum -= 0xff; } } rxchecksum ^= 0xff; rxchecksum &= 0xff; txbuf[rxlen] = rxchecksum; R_UART0_Send(txbuf,rxlen+1); } break; } } //ignore if (i == MSG_NUM) { lin_state = LIN_STATE_IDLE; } break; case LIN_STATE_RECEIVE: if (rxcount < rxlen) { rxbuf[rxcount++] = lin_rxdata; rxchecksum += lin_rxdata;// calc checksum if (rxchecksum > 0xff) { rxchecksum -= 0xff; } } else { rxchecksum ^= 0xff; rxchecksum &= 0xff; if (rxchecksum == lin_rxdata)//receive success { lin_state = LIN_STATE_IDLE;//LIN_STATE_SUCCESS for (i = 0; i < rxlen; i++) { prxbuf[i] = rxbuf[i]; } } lin_state = LIN_STATE_IDLE; } break; case LIN_STATE_TRANCEIVE: //todo break; default: break; } R_UART0_Receive(&lin_rxdata,1); }