查看: 27951|回复: 32

[S12] [S12G系列]LIN通讯协议及LIN发送程序实现

[复制链接]
  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
    发表于 2015-12-14 20:55:04 | 显示全部楼层 |阅读模式
    本帖最后由 花溪村长 于 2015-12-15 09:39 编辑



    很早之前就想发LIN的东西了,一直没空,今天事情忙完了,把最近学习的LIN协议整理归纳下,Make一下,公司折腾S12,没办法就先用S12实验,后面再上KEA系列的!其中可能有些地方有些问题,欢迎各位大神拍砖~
    下面开始纯手打!可能会写得比较乱!
    先来LIN的基础知识
    一、帧的结构
    帧包括帧头和应答两部分,主机发送帧头,从机接收帧头并解析内容,然后确认发送应答或者是接收应答还是不做处理。帧的传输如下图
    图片1.png
    帧头包括同步间隔断、同步段、受保护PID段;应答包括数据段和校验和段。总线实行线与关系,显性覆盖隐形.帧的结构如下:
    图片2.png
    1同步间隔段
    [size=10.5000pt]同步间隔段由同步间隔和同步间隔段间隔符组成,同步间隔至少持续13位的显性电平。从机检测到总线上出现持续11位的显性电平则认为是帧开始!
    图片3.png
    2 同步段
    图片4.png

    同步段以下降沿为判断标志,采用0x55为标志
    3 受保护ID
    受保护ID段由前6位的帧ID和后两位奇偶校验位组成
    图片5.png

    帧ID范围一般为0x00~0x3F之间,奇偶校验由异或和取非运算帧ID得到,计算公式如下,由公式可知PID不会全0或全1
    图片6.png
    不同车企对帧的的类型有不同的定义,一般的分类如下:
    图片7.png

    4 数据段
    数据段包含1-8个字节,先发送编号最低的字节,编号依次增加。
    数据段包括信号和诊断消息
    图片8.png

    5 校验和段
    检验和段是对帧中所传内容进行校验
    图片9.png
    检验和分为标准型和增强型,标准型只需要校验数据段,而增强型需要校验PID和数据段
    图片10.png
    检验方法是将检验对象的各个字节进行带进位二进制加法,当结果大于0xFF时,结果减去0xFF,并将最终结果取反。接收方对接收数据进行相同操作,结果不取反,然后和接收到的校验和相加,如果相加等于0xFF则校验无误。
    来个总线波形
    图片11.png

    二、FSL HCS12 SCI用作LIN
    下面以S12G128来进行LIN传输,由于感觉LIN的API函数太复杂了!只是简单的数据传输,不涉及到网络管理及诊断功能。

    SCI主要设置波特率和间隔符
    设置 SCISR2 BRK13 设置13位间隔符 用于LIN的帧间隔段
    图片12.png

    设置SCICR2SBK发送间隔符
    图片13.png
    硬件电路如图使用的是NXP的TJA1020

    图片14.png

    工作模式
    QQ截图20151214203654.png

    按照LIN的协议编写程序,然后下载调试,发送PID为0x30,数据8位 0~7,总线上的波形如下
    (PS :安捷伦的示波器!以前还可以解析LIN的协议,30天试用!现在不能用了!需要License!坑爹啊!!!)
    IMG_20151214_203258.jpg

    然后问同事接了个X宝淘的蓝宙的USB-LIN测试下
    IMG_20151214_203316.jpg
    运行下软件:

    图片15.png

    最后附上部分源代码:
    花样玩S12,灰常熟悉的代码有木有!直接写成自己熟悉的库来玩!
    1. /**
    2.   * @brief LIN初始化
    3.   * @param  SCIx SCI通道 baud 波特率
    4.   * @retval
    5.   */
    6. void LIN_Init(SCI_Type *SCIx ,uint32 baud)
    7. {
    8.    uint8 i ;
    9.    GPIO_InitTypeDef GPIO_InitStruct;
    10.    
    11.    SCIx->SR2 &= 0x7f ;                // 设置AMAP
    12.    SCIx->BD = SystemBusClock/16/baud;   //设置SCI波特率
    13.    SCIx->CR1 = 0x00;        //设置SCI0为正常模式,八位数据位,无奇偶校验
    14.    SCIx->CR2 = 0x2c;        //允许接收和发送数据,允许接收中断功能
    15.    SCIx->SR2 |=1<<2;        //设置BRK13 13位间隔符
    16.   
    17.   
    18.    //初始化接收结构体
    19.    Frame_Receive.PID=0;
    20.    Frame_Receive.State=IDLE;
    21.    Frame_Receive.Error=0;
    22.    Frame_Receive.Check=0;
    23.    for (i=0;i<8;i++)
    24.     Frame_Receive.Data[i]=0;
    25.    
    26.    //设置正常模式
    27.    GPIO_InitStruct.GPIO_Pin =Pin5;  //选择引脚
    28.    GPIO_InitStruct.State =SET;       //初始化状态
    29.    GPIO_InitStruct.Mode = GPIO_Mode_OUT;    //设置输出
    30.    GPIO_Init(GPIOJ,&GPIO_InitStruct);         //初始化
    31.   
    32. }
    复制代码
    1. /**
    2.   * @brief 发送同步间隔段
    3.   * @param   
    4.   * @retval
    5.   */
    6. void LIN_SendBreak(SCI_Type *SCIx)
    7. {
    8.   while(!(SCIx->SR1&0x80));         //等待发送数据寄存器(缓冲器)为空
    9.   SCIx->CR2 |= 0x01;                   //队列待发送的中止字符
    10.   SCIx->CR2 &= 0xfe;                   //返回正常发送操作
    11. }

    12. /**
    13.   * @brief LIN发送字节函数
    14.   * @param   
    15.   * @retval
    16.   */
    17. void LIN_SendChar(SCI_Type *SCIx,uint8 ch)
    18. {
    19.   while(!(SCIx->SR1&0x80));  //等待发送数据寄存器(缓冲器)为空
    20.   SCIx->DRL = ch;
    21. }

    22. /**
    23.   * @brief LIN奇偶校验计算
    24.   * @param   
    25.   * @retval
    26.   */
    27. uint8 LIN_CalcParity(uint8 id)
    28. {
    29.   uint8 parity, p0,p1;
    30.   parity=id;
    31.   p0=(BIT(parity,0)^BIT(parity,1)^BIT(parity,2)^BIT(parity,4))<<6;     //偶校验位
    32.   p1=(!(BIT(parity,1)^BIT(parity,3)^BIT(parity,4)^BIT(parity,5)))<<7;  //奇校验位
    33.   parity|=(p0|p1);
    34.   return parity;
    35. }

    36.   /**
    37.   * @brief LIN校验和计算
    38.   * @param   
    39.   * @retval
    40.   */
    41. uint8 LIN_CalcChecksum(uint8 id,uint8 *data,uint8 length)
    42. {
    43.   uint8 i;
    44.   uint16 check_sum = 0;
    45.   //0x3C 0x3D 使用标准型校验
    46.   if(id != 0x3c && id != 0x7d)  //使用增强型校验
    47.   {
    48.      check_sum  = id ;
    49.   }
    50.   else //使用标准校验
    51.   {
    52.      check_sum = 0 ;
    53.   }
    54.   for (i = 0; i < length; i++)
    55.     {   
    56.       check_sum += *(data++);
    57.       
    58.       if (check_sum > 0xFF)      //进位
    59.       {
    60.               check_sum -= 0xFF;
    61.       }
    62.     }
    63.     return (~check_sum);  //取反
    64. }

    65. /**
    66.   * @brief LIN发送函数
    67.   * @param   
    68.   * @retval
    69.   */
    70. Bool LIN_Send_Msg(SCI_Type *SCIx,LIN_Msg *SendMsg)
    71. {
    72.   uint8 pid ,i ,check_sum;
    73.   if(SendMsg->ID == 0xff||SendMsg->ID == 0x00)
    74.   return (FALSE);
    75.   //发送间隔同步段
    76.   LIN_SendBreak(SCIx);
    77.      
    78.   //发送同步场
    79.   LIN_SendChar(SCIx,0x55);

    80.   //计算PID
    81.   pid = LIN_CalcParity(SendMsg->ID);
    82.   //发送PID
    83.   LIN_SendChar(SCIx,pid);

    84.   //发送数据场
    85.   for(i=0; i <SendMsg->length ; i++)    //SendMsg->length
    86.    {
    87.      // 发送数据场
    88.      LIN_SendChar(SCIx,SendMsg->Data[i]);    //SendMsg->Data[i]

    89.    }
    90.    //计算校验和               SendMsg->ID  &SendMsg->Data SendMsg->length
    91.   check_sum = LIN_CalcChecksum(pid,SendMsg->Data,SendMsg->length);
    92.   LIN_SendChar(SCIx,check_sum);

    93.   return(TRUE);
    94. }
    复制代码
    1. /**
    2.   * @brief LIN接收中断
    3.   * @param   
    4.   * @retval
    5.   */
    6. #pragma CODE_SEG __NEAR_SEG NON_BANKED
    7. void interrupt VectorNumber_Vsci1  LINreceive(void)
    8. {
    9.   if(!LIN_GetChar(SCI1))
    10.   {
    11.    
    12.     Frame_Receive.Error = 1;
    13.     Frame_Receive.State = IDLE;
    14.   }
    15. }
    16. #pragma CODE_SEG DEFAULT
    复制代码
    1. LIN_Msg msg ;
    2.   uint8 i ;

    3.   msg.ID = 0x30;
    4.   msg.length = 8 ;
    5.   for(i = 0 ;i<msg.length;i++)
    6.   msg.Data[i] = i ;
    7.   for(;;)
    8.   {
    9.     LIN_Send_Msg(SCI1,&msg);
    10.     GPIO_ToggleBits(GPIOT,Pin6);
    11.     delay(400);
    12. }
    复制代码
    最后附上LIN文件:
    LIN.rar (2.4 KB, 下载次数: 833)
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-12-15 08:52:46 | 显示全部楼层
    今天真心会别问到 加油看懂
    logo.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
     楼主| 发表于 2015-12-15 08:54:16 | 显示全部楼层
    安臣 发表于 2015-12-15 08:52
    今天真心会别问到 加油看懂

    去哪里面试了?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-12-15 08:59:42 | 显示全部楼层
    本帖最后由 安臣 于 2015-12-15 09:10 编辑

                                              
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    555

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    1343
    最后登录
    2018-10-23
    发表于 2015-12-15 09:25:06 | 显示全部楼层
    谢谢分享              
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-3-29 09:54
  • 签到天数: 418 天

    [LV.9]以坛为家II

    21

    主题

    2928

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3307
    最后登录
    2021-4-7
    发表于 2015-12-15 10:00:16 | 显示全部楼层

    谢谢分享  
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    264

    帖子

    0

    高级会员

    Rank: 4

    积分
    692
    最后登录
    2020-11-8
    发表于 2015-12-15 11:52:40 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-30 19:52
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    19

    主题

    628

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1384
    最后登录
    2018-5-28
    发表于 2015-12-15 22:07:50 | 显示全部楼层
    多谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-3 09:41
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    3

    主题

    732

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1802
    最后登录
    1970-1-1
    发表于 2015-12-24 00:14:53 | 显示全部楼层
    分析得很不错耶
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-4-17 08:39
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    33

    主题

    788

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2796
    最后登录
    1970-1-1
    发表于 2015-12-25 09:43:58 | 显示全部楼层
    MARK  好东西
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 19:51 , Processed in 0.149678 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表