MSP430 LIN总线编程

Lis, 2021-2-3

时隔接近20年,CSDN我回来了...以下为本人原创. 如转载,请注明出处!

LIN总线在汽车领域应用十分的广泛。汽车上的油泵,自动折叠反光镜,大灯,锁等等慢速通信都会有LIN总线的应用身影。但网络上你几乎找不到MSP430在这方面的应用,就算去TI的官方网站上去找,去问客服,也找不到,MSP430似乎没有车规级型号,新能源汽车上几乎清一色的使用TI的DSP车规级芯片,所以也基本没有人在MSP430上使用LIN总线。但是掌握LIN总线的应用,会给我们在一些项目里带来很大的帮助。至于什么是LIN,什么CAN这些的术语,大家自己百度应该可以找到很详细介绍,这里不做过多的说明。

以下是我做的一些笔记,为了避免重复劳动,浪费时间,就直接截图上来了。

[1] LIN总线特点

[二]物理层连接

[三]接口电路

这里我选择了最小封装的TJA1027,8脚芯片,以下为LIN master模式的配置电路。 详细关于TJA1027请自行网上找它的datasheet

[四]LIN-BUS的帧格式

Break长度一般为为13位,我们称之为:间隔场.(参考网上的一张比较不错的图)

示波下的真实waveform:

逻辑分析仪下的 读某品牌油泵的时序:

[五]MSP430F24X下的LIN BUS配置

这里我使用MSP430F249为例,UART模块,需支持SCI功能。才可以支持LIN,所以不是所有的MSP430系列都支持LIN总线,查看Datasheet是最有效的方式。

  1. 在Slave 模式下,UART需支持自动波特率检测(在一些特定标准下,波特率是特定的)
  2. UART=8 bit,LSB优先,无奇偶位,1停止位 。 这点和普通的串口单元设置基本一样
  3. 接口驱动芯片,这里我选用的是TJA1027,实现通信电平上面的转换
  1. 主模式: 自动生成间隔场(break)和同步码(synch)
  2. 选择自动波特率检测模式  UCTXBRK=1
  3. DELIMx指定 break Delimiter的长度,默认为1位周期
  4. 检测TXBUF是否准备就绪,并向TXBUF写入同步码 0x55h
  5. 传输13位间隔场后,然后就是break delimiter 和synch 同步场,UCTXBRK在同步载入TX移位寄存器后自动重设,写入TXBUF的数据正常传输

[六]代码部分

1.PID部分:ID只是高6个位,后两个位为奇偶效验码.

//---------------------------------------------------------------------------//
//                       uchar LIN_GetPID(uchar id)                          //
//Description: calculate  odd and even parity for ID Frame                   //
//   Parity:                                                                 //
//             P0= id0^id1^id2^id4      ==>Even  bit6                        //
//             p1=~(id1^id3^id4^id5)    ==>Odd   bit7                        //
//---------------------------------------------------------------------------//
uchar LIN_GetPID(uchar id)
{uchar parity=0, p0,p1;p0 =id;p0^=id>>1;p0^=id>>2;p0^=id>>4;p0&=0x01;p1 =id>>1;p1^=id>>3;p1^=id>>4;p1^=id>>5;p1=~p1;p1&=0x01;parity=id|(p0<<6)|(p1<<7);return parity;
}

2.checksum

LIN总线中的checksum算法为带进位的累加。 在LIN总线里,有两种校验方式,一种称为标准验校,和增强型校验。 代码中我做了相关的说明。

//---------------------------------------------------------------------------//
//                               calculate checksum                          //
//paremeters: uchar id:           slaver id                                  //
//            uchar *data         array of data,maximum:8 bytes              //
//            uchar len            length of the data array                  //
//---------------------------------------------------------------------------//
uchar LIN_Checksum(uchar id,uchar *data,uchar len)
{uint16 sum = 0;uchar  i;//if it's not a diagnostic package  | id==0x3c using normal checksum,otherwise using enhance checksum  if (id!=0x3c)                                                             {sum=LIN_GetPID(id);}for(i = 0; i < len; i++){sum +=data[i];if(sum&0xff00){sum&=0x00ff;sum+=1;}  }sum=~sum;return (uchar)sum;
}

3.添加发送间隔场和同步场

我在代码中加了宏代码,以方便我配置LIN端口使用UART0 或UART1


//----------------------------------------------------------------------------//
//                    void USART_UCA0_Send_Byte(uchar data)
//----------------------------------------------------------------------------//
void USART_UCA0_Send_Byte(uchar data)
{UCA0TXBUF = data;while(!Get_Bit(UC0IFG,UCA0TXIFG));
}//---------------------------------------------------------------------------//
//                          LIN_Send_Break_Sync(void)                        //
//---------------------------------------------------------------------------//
void LIN_Send_Break_Sync(void)
{UCA0CTL0_bit.UCMODE0=1;UCA0CTL0_bit.UCMODE1=1;//4bit stopUCA0ABCTL_bit.UCDELIM0=1;UCA0ABCTL_bit.UCDELIM1=1;UCA0CTL1_bit.UCTXBRK=1;USART_UCA0_Send_Byte(0x55);UCA0CTL1_bit.UCTXBRK=0;
}
4.一个完整帧的发送:
//---------------------------------------------------------------------------//
//                               LIN_Sendbuf                                 //
//                                                                           //
//paremeters: uchar id:           slaver id                                  //
//            uchar *data         array of data,maximum:8 bytes              //
//            uchar len            length of the data array                  //
//---------------------------------------------------------------------------//
void LIN_Sendbuf(uchar id,uchar *data,uchar len)
{uchar check_sum, parity_id;uint16 i;LIN_Send_Break_Sync();parity_id=LIN_GetPID(id);USART_UCA0_Send_Byte(parity_id);for(i=0;i<len;i++){  USART_UCA0_Send_Byte(data[i]);}  check_sum=LIN_Checksum(id,data,len);USART_UCA0_Send_Byte(check_sum);
}

5.发送读操作帧

//---------------------------------------------------------------------------//
//                 void LIN_RX_Ask(uchar id)                                 //
//                                                                           //
//definition: Send Syn frame to slaver, Slaver will send back the data       //
//parameter: uchar id                                                        //
//---------------------------------------------------------------------------//
void LIN_RX_Ask(uchar id)
{uchar parity_id;LIN_RX_Idx=0;LIN_Send_Break_Sync();parity_id=LIN_GetPID(id);USART_UCA0_Send_Byte(parity_id);
}

如这里的时序,master端发送Ask(break+sync+PID),然后slave同步并返回数据帧。 这个比较容易理解,类似于I2C,SPI,1 wire 总线。

6.接收处理:
将接收处理部分写成单独的函数,然后放到串口接收中断中
//----------------------------------------------------------------------------//
//                    void USART_UCA0_Send_Byte(uchar data)
//----------------------------------------------------------------------------//
void USART_UCA0_Send_Byte(uchar data)
{UCA0TXBUF = data;while(!Get_Bit(UC0IFG,UCA0TXIFG));
}//---------------------------------------------------------------------------//
//                 void LIN_Readbuf_Pro(uchar data)                          //
//  put this function into RX intterruption                                  //
//---------------------------------------------------------------------------//
void LIN_Readbuf_Pro(uchar data)
{switch(LIN_RX_Idx){case 0:if(data==0x55){LIN_RX_Idx=1;}  break;case 1:LIN_RX_Frame.id=data&0x3F;LIN_RX_Idx=2;break;case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:LIN_RX_Frame.d[LIN_RX_Idx-2]= data;LIN_RX_Idx++;break;case 10: LIN_RX_Frame.chksum=data;LIN_RX_Idx=0;break;}
}

串口接收中断:

//----------------------------------------------------------------------------//
//                  USCI0RX_ISR     UCA0 Interruption
//----------------------------------------------------------------------------//
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{uchar data=0;data = UCA0RXBUF;// if (UC0IFG&UCA0RXIFG) //  {LIN_Readbuf_Pro(data);    // }
}

7.串口设置

#define BAUD_UCA0     10417//----------------------------------------------------------------------------//
uchar Get_UCBRS(float baud)
{return ((uchar)((baud-(uint16)baud)*8+0.5))<<1;
}//----------------------------------------------------------------------------//
//                      void Init_Serial_Ports(void)
//----------------------------------------------------------------------------//
void Init_Serial_Ports(void)
{float tmp_baud;SetPinMode(UCA0_TXD_PIN);SetPinMode(UCA0_RXD_PIN);    tmp_baud=CPU_F/2/BAUD_UCA0;UCA0CTL1 |= UCSSEL_2 + UCSWRST;                                         //Set the clock of UCA0 =SMCL,UCSWRST Enable,initial all USCI registors UCA0BR0 =(uchar)(tmp_baud);                                            //Low 8 bitsUCA0BR1 =(uchar)((uint16)tmp_baud>>8);                                 // //High 8bits, NO parity check UCA0MCTL = Get_UCBRS(tmp_baud);UCA0CTL1 &= ~UCSWRST;                                                   //clear UCSWRST bitUC0IE |= UCA0RXIE;                                                      //Enable RX Interruptor }

[7]测试板电路设计

[1]电源部分

先设计打算使用于24V电路,所以输入端,和LIN总线电压为24V,但是实际应用调试的油泵为12V,所以主供电也为12V。 这里做个说明.

[2]MSP430部分相对简单,最小系统,然后把端口都引出去

[3]LIN接口电路

[4]调试用TTL串行口电路

增加缓冲电路,能有效加强TTL串口的可靠,稳定性。

[5]电路指示

[6]预留的一个大功率IO驱动口,用于驱动外部电磁阀等器件

[7]Layout

根据schematic,布好PWB后,生成工艺文件以及BOM发给PCB工厂进行打样生产。

[8]实际调试,正常驱动某品牌汽车油泵

MSP430 LIN总线编程相关推荐

  1. lin通讯从节点同步间隔场_Freescale MM908E625的LIN总线

    0  引言 LIN(Local Interconnect Network,本地互连网)由汽车厂商专为汽车工业开发(飞思卡尔半导体是在LIN原始协会成员中唯一的半导体器件供应商),是"一主(节 ...

  2. lin通讯从节点同步间隔场_低成本总线技术——LIN总线协议规范介绍

    专注原创汽车技术干货分享,小编求关注哦! 在前面一篇文章中"野百合也有春天"--低成本总线LIN介绍介绍了LIN总线的发展历程及其基本概念.现在这篇文章主要介绍LIN总线协议规范. ...

  3. LIN总线接口静电保护专用器件:DW24DLC-B-S和DW24D-B-S

    Local Interconnect Network,简称LIN,是针对汽车分布式电子系统而定义的一种串行通讯网络,成本比较低,用于实现汽车中的分布式电子系统控制.LIN总线的目的是现有汽车网络(比如 ...

  4. lin总线可以控制几个节点_汽车上除了CAN通讯还有另外一种总线你需要知道

    本文首发自微信公众号"汽车技术馆"! 在前几天的一篇关于UDS诊断的文章中给大家提到了LIN的UDS实现标准,原文链接如下: 李大人:UDS(ISO14229)诊断协议-LIN​z ...

  5. Lin总线应用层代码

    毕业设计做的Lin总线,关键代码贴出来. 计算校验和 unsigned char LINCalcChecksum(unsigned char *data) {unsigned int sum = 0; ...

  6. AUTOSAR从入门到精通100讲(五)-汽车LIN总线详解

    01 LIN总线介绍 LIN总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,是对控制器区域网络(CAN)等其它汽车多路网络的一种补充,适用于对网络的带宽.性能或容错功能没有过高要求的应用 ...

  7. hp203b例程_飞思卡尔公司LIN总线的例程代码

    [实例简介] 飞思卡尔公司LIN总线的例程代码,里面有PDF介绍和飞思卡尔众多DEMO板的LIN代码例程,非常适合对LIN总线的通讯进行学习 [实例截图] [核心代码] 飞思卡尔公司_FSLLINDr ...

  8. LIN总线开发:智能雨量传感器

    大众速腾 自动雨刮 雨水感应模块 长城系列 自动雨刮 雨水感应模块 ------------------------------------------------------------------ ...

  9. 从应用角度了解下LIN总线

    导读 本文将介绍LIN(Local Interconnect Network,本地连接网络)协议的基本知识,包括LIN总线和CAN总线的对比.LIN总线的应用案例.LIN是如何运行的以及LIN中的6种 ...

最新文章

  1. 关于学习Python的一点学习总结(35->关联超类)
  2. IoT勒索软件会演化为劫持软件
  3. gta5线上小助手_gta5线上助手(xiu改器)使用
  4. Spring-Boot:写出来的网站访问不到静态资源?怎样通过url访问SpringBoot项目中的静态资源?localhost:8989/favicon.ico访问不了工程中的图标资源?
  5. 【Vegas原创】获取远程数据库到本地
  6. oracle12版本无scott解决,Oracle12C中scott账户与表问题
  7. 天马微电子的mes工程师_上海天马微电子MES工程师职位(部门:制造中心/自动化部)怎么样?...
  8. DevOps到底是什么鬼?DevOps介绍及工具推荐
  9. Google IO 2017为我们带来了什么
  10. Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function[二分]
  11. List集合排序及去重
  12. 百晓生兵器谱之公有云排名
  13. Centos如何设置ip黑名单,防止被攻击
  14. 免冠证件照如何制作?制作证件照的简单方法
  15. (转)MAPISendMail调用系统默认的邮件客户端发邮件
  16. 【linux】血泪经验,在安装Linux上一定要创建/data 分区,将数据盘和系统盘分开,方便重新安装系统,随时恢复Linux系统,其实特别简单,还有7个常用技巧
  17. 最新语音识别词错误率WER汇总
  18. HIVE学习系列——windows Hadoop安装(上)
  19. 华为设备配置WLAN
  20. DELMIA软件:机器人仿真运行延时功能介绍与使用方法

热门文章

  1. Mac 运行sh文件,也就是传说中的shell脚本
  2. 百度 oppo 滴滴出行 面试问题总结 阿里
  3. linux火狐弹出框乱码,Linux系统下火狐浏览器页面出现乱码怎么办?
  4. 【SQL】LeetCode-Trips and Users
  5. 高职计算机应用专业的课程有哪些,高职计算机应用专业课程优化与整合
  6. win10无线显示未连接到服务器,Win10系统无线网络适配器显示未连接的解决方法...
  7. [leetcode]488. Zuma Game
  8. STM32 HAL库之IIC
  9. 多线程的几种实现方式
  10. 算法 - 鸡尾酒排序(CocktailShaker_sort)