Lin总线应用层代码

简介: 毕业设计做的Lin总线,关键代码贴出来。 计算校验和 unsigned char LINCalcChecksum(unsigned char *data) { unsigned int sum = 0; unsigned char i; for(i = 0; i < 4; i++) { sum += data[i]; if(

毕业设计做的Lin总线,关键代码贴出来。

计算校验和

unsigned char LINCalcChecksum(unsigned char *data)         
{
  unsigned int sum = 0;
  unsigned char i;

  for(i = 0; i < 4; i++)
  {
    sum += data[i];
    if(sum&0xFF00)
      sum = (sum&0x00FF) + 1;
  }
  sum ^= 0x00FF;         
  return (unsigned char)sum;
}


计算校验位

unsigned char LINCalcParity(unsigned char id)
{
  unsigned char parity, p0,p1;
  parity=id; 
  p0=(BIT(parity,0)^BIT(parity,1)^BIT(parity,2)^BIT(parity,4))<<6;     //偶校验位
  p1=(!(BIT(parity,1)^BIT(parity,3)^BIT(parity,4)^BIT(parity,5)))<<7;  //奇校验位
  parity|=(p0|p1);
  return parity;
}

结构体

//FrameProgress代表从机接收帧的进度,
//  FrameProgress=0x00代表进度0,
//  FrameProgress=0x01代表进度1,
//  FrameProgress=0x02代表进度2,
//  FrameProgress=0x03代表进度3。
//每当有中断(sci)发生,先检测进度根据进度执行相应的代码段
//进度0:接收0x55,接收成功则设置进度为进度1
//进度1:接收ID ,接收成功则设置进度为进度2
//进度2:接收数据字节,接收成功设置为进度3
//进度3:设置执行标志位(ReceiveLinDataCompleted)为'执行'(True),主程序检测到执行标志位为'执行'则执行检查校验和解析数据字节执行相应的操作
unsigned char LinFrameByte=0x00;
unsigned char FrameProgress=0x00;


//LinDataProgress是接收Lin帧中的数据字节的进度
unsigned char LinDataProgress =0x00;
Bool ReceiveLinDataCompleted = 0;

struct LinMessageStruct
     {
  unsigned char LinData[5];
      };
struct LinMessageStruct LinMessage;


串口发送

void SCI发送(unsigned char data) 
{
  while(!SCI0SR1_TDRE);         
  SCI0DRL = data;
}

串口接收

unsigned char SCI接收(void) 
{
  while(!SCI0SR1_RDRF);        
  return(SCI0DRL);
}

初始化锁相环

void INIT_锁相环(void) 
{
    CLKSEL &= 0x7f;       
    PLLCTL &= 0x8F;      
    CRGINT &= 0xDF;
    
    #if(BUS_CLOCK == 40000000) 
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif 

    REFDV = 0x81;         
    PLLCTL =PLLCTL|0x70;  
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); 
    CLKSEL |= 0x80;        
}







Lin总线应用层代码

Lin总线应用层代码

Lin总线应用层代码



void main(void) 
{
  DisableInterrupts;
  INIT_SCI();//设置为输出
  INIT_PLL();//初始化锁相环 
  DDRB=0xff;//使能PORTB
  DDRA=0XFF;//使能PORTA
  EnableInterrupts;        
  for(;;) 
  {       
      //检查是否接收帧完成
     if(ReceiveLinDataCompleted == 1) 
     {        
        //检查校验和
        if(LinMessage.LinData[4]==LINCalcChecksum(LinMessage.LinData)) 
        {
           if(LinMessage.LinData[0]==0x11) 
           {
              PORTA_PA0=0;//灯亮
           }
        }
         ReceiveLinDataCompleted =0;
     }
  } 

}

串口中断接收函数

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void Receivedata(void) 
{   
    LinFrameByte = SCI_receive();  
     
    if(FrameProgress==0x00) 
    {       
      if(LinFrameByte !=0x55)
      {   
         return;     
      }             
      if(LinFrameByte ==0x55)
      { 
         FrameProgress=0x01; 
         return; 
      }      
    }
    
        
    if(FrameProgress==0x01) 
    {    
        //暂时不用奇偶校验
        if(ID==LinFrameByte) 
        {
          FrameProgress=0x02;
        }
        return;
    } 
    
    
    if(FrameProgress==0x02) 
    {   
      //接收数据
      if(LinDataProgress==0x00)
      {  
        LinMessage.LinData[0]=LinFrameByte;
        LinDataProgress=0x01; 
        return; 
      }
      if(LinDataProgress==0x01)
      {   
        LinMessage.LinData[1]=LinFrameByte;
        LinDataProgress=0x02; 
        return; 
      }
      if(LinDataProgress==0x02)
      {  
        LinMessage.LinData[2]=LinFrameByte;
        LinDataProgress=0x03; 
        return; 
      }
      if(LinDataProgress==0x03)
      {     
        LinMessage.LinData[3]=LinFrameByte;
        LinDataProgress=0x04; 
        return;  
      }
      if(LinDataProgress==0x04)
      { 
        LinMessage.LinData[4]=LinFrameByte;
        LinDataProgress=0x00;   
      }
      //数据接收完成      
      ReceiveLinDataCompleted = 1;
      FrameProgress=0x00;
      return;
   }    
}
#pragma CODE_SEG DEFAULT



目录
相关文章
|
数据格式 流计算
【UCIe】UCIe 协议层介绍
【UCIe】UCIe 协议层介绍
1456 0
【UCIe】UCIe 协议层介绍
|
定位技术 芯片
UART子系统(二) UART协议层 物理层
UART子系统(二) UART协议层 物理层
393 0
UART子系统(二) UART协议层 物理层
|
调度 5G 测试技术
带你读《5G NR物理层技术详解:原理、模型和组件》之二:NR物理层概述
本书详细阐述5G新的无线接入技术—5G NR物理层技术的基本设计原理、模型和组件,其中物理层模型包括针对5G NR(max到100 GHz)全频段范围的无线电波传播和硬件损伤。物理层技术包括灵活的多载波波形、先进的多天线解决方案,以及针对5G及以后技术的各种服务、部署和频率的信道编码机制。包括一个基于MATLAB的链路级仿真器以探索各种设计选项。
17349 1
|
网络协议 Linux
CCNP必备: Linux网络及0SI7层模型深入讲解
CCNP必备: Linux网络及0SI7层模型深入讲解
CCNP必备: Linux网络及0SI7层模型深入讲解
|
内存技术
【UCIe】UCIe 物理层介绍(逻辑物理篇)
【UCIe】UCIe 物理层介绍(逻辑物理篇)
1085 0
【UCIe】UCIe 物理层介绍(逻辑物理篇)
I2C总线协议的总结介绍
  在看天翔哥的视频之后,他强调要把I2C协议好好研究一下,那么就对一些基本的通信手段是十分有帮助的。。那么就来了解一下I2C总线协议的一些知识吧。 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于I2C总线的工作原理与应用,用于连接微控制器及其外围设备。
|
芯片 数据格式
I2C 总线协议
I2C 总线协议
340 0
I2C 总线协议
|
10月前
MSR04X1 串行通信模块程序调入方案
MSR04X1 串行通信模块程序调入方案
|
数据格式 流计算
【UCIe】UCIe 支持的协议及操作模式
【UCIe】UCIe 支持的协议及操作模式
2311 1
【UCIe】UCIe 支持的协议及操作模式