微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于PIC的LIN总线设计

基于PIC的LIN总线设计

时间:11-18 来源:互联网 点击:

case FSync1:
RFdata=RFIN;
if(RFdata==0)
{
if(TMR1IF) //在很长时间内如果主机的同步间隔场没有完成产生错误
{
TMR1IF=0;
TMR1ON=0;
TMR1L=0;
TMR1H=0;
RFstate=FRest; //状态机复位
}
}
else
{
TMR1ON=0; //关闭定时器
TimeL=TMR1L; //取出计数值
TimeH=TMR1H;
TMR1L=0; //计数器清0
TMR1H=0;
if(ASD.Counter>=TSync)
{
RFstate=FTow; //间隔场接收成功,下面接收同步头
TMR1ON=1;
CCP1IE=1; //使能CCP1中断
CCP1IF=0; //清中断标志
CCP1CON=0x04; //配置捕捉方式,捕捉下降沿
}
else
{
RFstate=FRest; //否则指向复位
}
}
break;

case FTow: //同步头接收
if(Towallow)
{
unsigned char i;
// SPBRG=0x19; //波特率设置
// RFstate=FId; //指向ID场接收
// CREN=1; //使能接收
Sytime=0;
for(i=0;i<4;i++) //循环计算总数据
{
Sytime=Sytime+(TimeData[i+1]-TimeData[i]);
}
Sytime=Sytime>>3; //除8计算
Sytime=(Sytime>>2)-1;
i=(unsigned char)Sytime;//强制转换为字节型数据,设定波特率
if((i<=30)&(i>=20)) //给定计算范围
{
SPBRG=0x19; //波特率设置
RFstate=FId; //指向ID场接收
CREN=1; //使能接收
}
else
{
RFstate=FRest; //状态复位
}
}
break;

case FId:
while(1) //等待数据接收
{
if(RCIF==1) break;
}
IDmoment=RCREG; //数据读取,清中断标
Stat=IDmoment;
if((Stat&0x0f)==0x01) //判断是否是自己的ID地址,如果是自己的ID地址,校验暂时没加
{
Stat=IDmoment;
if((ID4==0)&(ID5==0))
{
DataCount=3; //两个数据接收,同时还有1个校验字节
}
if((ID4==1)&(ID5==0))
{
DataCount=3; //两个数据接收,同时还有1个校验字节
}
if((ID4==0)&(ID5==1))
{
DataCount=5; //四个数据接收,同时还有1个校验字节
}
if((ID4==1)&(ID5==1))
{
DataCount=9; //八个数据接收,同时还有1个校验字节
}
RFstate=FData; //指向数据接收
}
else
{
RFstate=FRest; //复位
}
break;

case FData: //数据接收
for(y=0;y{
while(1)
{
if(RCIF==1) break;
}
Data[y]=RCREG; //读取一个数据
}
RFstate=FRest; //复位,数据接收完毕
Operate=1; //允许操作

break;

default:
RFstate=FSync; //指向同步头接收
Towallow=0; //波特率计算禁止
FallCount=0;
CCP1CON=0x00; //CCP禁止
TXEN=0; //禁止发送
CREN=0; //异步模式禁止接收
DataCount=0; //数据长度清0
Operate=0;
}
}
//********************************************
//初始化
//********************************************
void Picint()
{
INTCON=0; //清中断源
GIE=1; //开总中断
PEIE=1; //开外部中断
RCIE=0; //禁止串口接收中断
ADCON1=0x07; //定义A口为数字ioput模
//TRISA= 0xFF; //定义端口输入输出模式
TRISC1=0; //片选输出端口
TRISC2=1; //捕捉模块1输入端

TRISB7=0; //测试使用的输出引脚
RB7=0;

SPBRG=0x19; //定义波特率
TXSTA=0x04; //使能高速波特率,异步模式
RCSTA=0x80; //使能串口,禁止连续接收
TRISC6=1; //串口使能后这两位必须设置为输入高阻抗状态
TRISC7=1;

T1CON=0x00; //定时器1初始化,用于捕捉功能
TMR1L=0x00;
TMR1H=0x00;
TMR1IE=0; //中断标志以及中断清除
TMR1IF=0;

CS=1; //片选置高

RFstate=FRest; //状态机复位
Operate;

DataClear(); //数组清0
}
//********************************************
//数组清0 函数
//********************************************
void DataClear()
{
for(y=0;y<9;y++)
{
Data[y]=0;
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top