/*
 * Lin_bus.c
 *
 *  Created on: 2019-6-28
 *      Author: charles_cai
 */
#include "main.h"

unsigned char bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7;
unsigned char PID;
unsigned char PID_buf[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
volatile unsigned char Rev_buf[3] ={0};
volatile unsigned char Rev_buf_cnt=0;
/*****************************************************
 *函数名：send_head
 *输入参数：temp。它是保护的ID号，只有0-5位是有效的。
 *返回：无。
 *函数功能：计算temp的奇偶校验位，具体的计算方法是：其中ID6 是ID0、ID1、ID2、ID4 的奇校验，ID7 是ID1、ID3、ID4、ID5 的偶校验。
 *		将计算的结果作为PID。然后驱动uart外设发送Lin通信的头部信号。包括：13位间隔字符、同步字符、PID。
 *****************************************************/
void send_head(unsigned char temp )
{
	PID =temp;
	bit0=PID;
	bit1=PID>>1;
	bit2=PID>>2;
	bit3=PID>>3;
	bit4=PID>>4;
	bit5=PID>>5;

	bit6=bit0^bit1;
	bit6^=bit2;
	bit6^=bit4;
	bit6&=0x01;
	bit6<<=6;

	bit7=bit1^bit3;
	bit7^=bit4;
	bit7^=bit5;
	bit7&=0x01;
	if(bit7)
		bit7=0;
	else
		bit7=0x80;

	PID|=bit6;
	PID|=bit7;

	SENDB1 =1;//使能间隔符发送
	TXSDR1=0;//启动发送
	while(TXSRS1==0);//等待发送完成
	TXSDR1=0x55;//同步字符写入
	while(TXSRS1==0);//等待发送完成
	TXSDR1=PID;//写入保护ID
	while(TXSRS1==0);//等待发送完成
}
/*****************************************************
 *函数名：send_one_byte
 *输入参数：temp。需要发送的数据内容。
 *返回：无。
 *函数功能：先将temp作为数据发送出去。再计算temp的反码，再将反码作为校验字符发送出去。
 *
 *****************************************************/
void send_one_byte(unsigned char temp)
{
	unsigned char temp_1;

	TXSDR1=temp;
	while(TXSRS1==0);

	temp_1 =0xFF-temp;
	TXSDR1=temp_1;
	while(TXSRS1==0);
}
/*****************************************************
 *函数名：test_new_pag
 *输入参数：无。
 *返回：0——校验失败，数据内容有错误。非0——返回的是接收的单字节指令。
 *函数功能：校验全局数组Rev_buf中的数据内容。首先对第一个字节进行奇偶校验，再对第二个数据和第三个数据进行反码校验。
 * 		 如果校验通过则返回指令内容，校验失败，返回0；
 *****************************************************/
unsigned char test_new_pag()
{
	unsigned char temp, sum=1;

	temp= Rev_buf[0]&0x3F;//取值，准备校验PID

	PID =temp;
	bit0=PID;
	bit1=PID>>1;
	bit2=PID>>2;
	bit3=PID>>3;
	bit4=PID>>4;
	bit5=PID>>5;

	bit6=bit0^bit1;
	bit6^=bit2;
	bit6^=bit4;
	bit6&=0x01;
	bit6<<=6;

	bit7=bit1^bit3;
	bit7^=bit4;
	bit7^=bit5;
	bit7&=0x01;
	if(bit7)
		bit7=0;
	else
		bit7=0x80;

	PID|=bit6;
	PID|=bit7;

	if(PID!=Rev_buf[0])
		return 0;

	temp= Rev_buf[1] +Rev_buf[2];
	if(temp!=0xFF)
		return 0;

	return sum;
}

