135 lines
3.3 KiB
C
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);
|
|
} |