BCZT_NEW/BCZT_PANEL/UARTLIN_Drv.c
2023-11-21 08:26:01 +08:00

135 lines
3.3 KiB
C

#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);
}