/****************************************************************************************
 * 项目用途：演示如何用uart外设生成Lin通信收发的时序。
 * 文件名: main.c
 * 项目名: KF8A100FTN_Lin
 * 版 本: v1.0
 * 日 期: 2019年09月02日 09时20分51秒
 * 作 者: charles_cai
 * 功能：驱动Uart模块发送Lin时序进行通信，接收到正确的数据则闪烁LED3。错误则LED3不闪烁。
 * 说明：KF单片机的Uart外设兼容Lin通信模式，它可以发送Lin通信的13位间隔符、同步字符、标识符、数据内容和校验字符。
		Lin通信是一种汽车单总线的网络，一般它使用12V的电压驱动。Lin网络中的每个节点都需要一个Lin驱动芯片进行电压转换。
		本例程程序有基本的Lin收发时序，但是其他内容需要用户根据自己的需求去做拓展开发。例如：Lin驱动的使能时序、休眠、唤醒机制、任务调度表、以及其具体的网络协议等。
	接线：TX——P01——RX
		RX——P00——TX
		VDD——VDD
		GND——GND
		可以自发自收，也可以两块开发板之间通信。
 ****************************************************************************************/
#include"main.h"

volatile unsigned char Mode=0,flag=0,Lin_buf;
unsigned char BUF1[10]; //发送缓存
//主函数
void main()
{
	Init_osc();
	Init_GPIO();
	Init_intrup();
	Init_uart(0);

	while(1)
	{
		Mode =0x22;
		send_head(PID_buf[9]);//PID使用PID_buf[9]
		send_one_byte(Mode);//通过Lin发送同样的指令到从机

		Delay_ms_loop(100);

		if(flag==2)//Lin总线收到新的数据包
		{
			if(test_new_pag())//数据包检查正确
			{
				Mode=Rev_buf[1];//指令更新

				if(Mode ==0x22)
					LED3 =!P30;
			}
			flag=0;
		}
	}

}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
	if(RC1IF)//从机的Lin接收
	{
		if(OVFER1==1)//清除溢出错误
		{
			CRXEN1=0;       // 清溢出错误
			_NOP();
			_NOP();
			CRXEN1=1;       // 重新使能接收
		}

		Lin_buf =RXSDR1;  // 清零 RXIF
//验证Lin协议帧头，并逐步接收数据到缓存中
		if((FRER1)&&(Lin_buf==0))//检测到帧错误-没有在规定的时间内检测到停止位,且接收到的数据全是0。
		{
			flag=0;//就判断为13位低电平，为Lin间隔符
		}
		else if((flag==0)&&(Lin_buf==0x55))//紧接着的字符是时钟同步字节，0x55
		{
			flag=1;
			Rev_buf_cnt=0;//清零缓存指针，准备开始接收数据
		}
		else if(flag==1)//帧头解析正确，开始接收数据内容
		{
			Rev_buf[Rev_buf_cnt++] =Lin_buf;
			if(Rev_buf_cnt>2)//接收的数据完成，从帧头开始往后数3个数据。
			{
				Rev_buf_cnt=0;
				flag=2;//接收完成标志，准备开始解析数据。
			}
		}
	}
}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}
