STM32F4的USART6的LIN2.0和汽车Window Lifter driver通信

发布者:创意火花最新更新时间:2018-10-15 来源: eefocus关键字:STM32F4  USART6  通信 手机看文章 扫描二维码
随时随地手机看文章

最近要做一款汽车零部件Window Lifter driver的测试控制器,用到LIN通信,在此只讨论STM32做为LIN主机节点的情况。

一些基本常识:

◆LIN由于采用单线媒质传输,最大的传输波特率被限定在20kbit/s以内。该值为从满足信号同步而不产生冲突的最高值,到为满足电磁兼容性要求而要达到的传输最低值之间的实验中间值。最小的传输波特率为1kbit/s--这有助于避免在实际中产生超时冲突。

◆如果LIN总线处于未激活状态已经超过4秒了,从机节点也会自动进入休眠模式。

◆LIN2.0中文版本:https://pan.baidu.com/share/link?shareid=2071584885&uk=1645989455&errno=0&errmsg=Auth Login Sucess&&bduss=&ssnerror=0



1.首先需要了解一些基本知识:

<1>主/从机节点

LIN 的拓扑结构为单线总线,应用了单一主机多从机的概念。总线电平为 12V,传输位速率(Bitrate)最高为20kbps。由于物理层限制,一个LIN网络最多可以连接16个节点,典型应用一般都在12个节点以下,主机节点有且只有一个,从机节点有1到15个。主机节点(Master Node)包含主机任务(Master Task)和从机任务(Slave Task),从机节点(Slave Node)只包含从机任务,如下图所示:[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信

主机任务负责:

(1) 调度总线上帧的传输次序(读数据、写命令);

(2) 监测数据,处理错误;

(3) 作为标准时钟参考;

(4) 接收从机节点发出的总线唤醒命令。

从机任务不能够主动发送数据,需要接收主机发送的帧头,根据帧头所包含的信息(这里指帧ID)判断:

(1) 发送应答(帧中除帧头外剩下的部分,参照3.1节的图3.1);

(2) 接收应答;

(3) 既不接收也不发送应答。

<2>帧的结构

帧(Frame)包含帧头(Header)和应答(Response)两部分。如下图所示:[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信


<3>主机节点发送一帧在总线上的传输(写从节点)

通过LIN总线传输的实体为帧。一个报文帧由帧头以及回应(数据)部分组成。在一个激活的LIN 网络中,通讯通常由主节点启动,主节点任务发送包含有同步间隙的报文头,同步字节以及报文标志符(ID)。一个从节点的任务通过接收并过滤标志符被激活,并启动回应报文的传送。回应中包含了1到8个字节的数据以及一个字节的校验码。       

传输一帧所花费的总的时间是发送每个字节所用的时间,加上从节点的回应间隙,再加上传输每个字节的间隙时间(inter-byte space)。字节间隙是指发送完前一个字节的停止位后到发送下一个字节的启动位之间的时间。帧在总线上的传输如下图所示:

[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信

<4>主机节点接收一帧在总线上的传输(读从节点)

主机任务负责发送帧头;从机任务接收帧头并对帧头

所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。帧在总线上的传输如下图所示:[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信



了解了这些之后,就可以开始编写主机节点的单片机程序了,在此采用STM32F407VGT6,LIN收发器采用ATMEL的ATA6625,原理图如下:(做为LIN主节点,应该对LINBUS加上拉电阻到VBAT)[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信


采用STM32F4的USART6,LIN电路设计为全隔离模式。


USART6初始化程序如下:

void LIN_Configuration(unsigned long LIN_baudrate)

{

USART_InitTypeDef  USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOD时钟


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

GPIO_Init(GPIOC, &GPIO_InitStructure);


GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);


//LIN收发器ATA6625的引脚LIN_EN  LON_RESET

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 |GPIO_Pin_9;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_SetBits(GPIOD, GPIO_Pin_8 |GPIO_Pin_9);


//初始化UART6

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);

USART_InitStructure.USART_BaudRate = LIN_baudrate;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART6, &USART_InitStructure);

//配置LIN断开符检测长度 LBDL 11位

USART_LINBreakDetectLengthConfig(USART6,USART_LINBreakDetectLength_11b);

//打开LIN break detect 中断使能位

USART_ITConfig(USART6,USART_IT_LBD,ENABLE);

//置位LINEN位,打开LIN模式

USART_LINCmd(USART6,ENABLE);

USART_Cmd(USART6, ENABLE);

USART_ITConfig(USART6, USART_IT_RXNE,ENABLE);

USART_ITConfig(USART6, USART_IT_TXE, DISABLE);

USART_ITConfig(USART6, USART_IT_LBD, ENABLE);

}


linWriteMessage程序如下:

linStatus linWriteMessage(uint8_t id, uint8_t *msg, uint8_t dlc)

{

uint8_t i;

uint16_t csum=0;

id &= 0x3f;

if(id!=0x3c)

csum = lin_check_number(id);//LIN2.0

// csum=0;//LIN2.1

for (i = 0; i < dlc; i++) 

{

linWriteChar(msg[i]);    

//delay_n(100);

csum += msg[i];       //校验和

if (csum >= 256)

csum = (csum+1)&0xff;

}

linWriteChar(~(uint8_t)csum);

USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);

return linOK;

}


linReadMessage程序如下,并通过printf在串口1中打印接收到的数据:

linStatus linReadMessage(uint8_t id, uint8_t *msg)

{

int8_t i=0;

uint16_t csum;

id &= 0x3f;

memset(LinBuff,0,LIN_BUFF_SIZE);   //填充LinBuff为0

ucpLinBuff=0;

delay_n(10);//10ms

if(LinBuff[1]==0x55)//      

{

for (i = 0; i < ucpLinBuff; i++)

{     

msg[i] = LinBuff[i];

printf("linReadMessage: %d \r\n",msg[i]);

}

csum =0;

for (i = 2; i < ucpLinBuff-1; i++) 

{

csum +=  msg[i];

if (csum >= 256)

csum = csum&0x00ff + 1;

}

if ((LinBuff[ucpLinBuff-1]) != (uint8_t)(~(unsigned char)csum))

return linERR_CSUM;

}

else return linERR_HARDWARE;

return linOK;

}


按照Window Lifter driver Specification,[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信

通过LIN发送ID为0x21,数据为0x20 0xFF,则背光点亮,效果如下图(上图未点亮,下图点亮):[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信


读取LIN数据,返回数据,串口打印如下,和Window Lifter driver Specification一致:[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信

对应示波器波形如下:

[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信

[原创]STM32F4的USART6的LIN2.0和汽车Window <wbr>Lifter <wbr>driver通信


关键字:STM32F4  USART6  通信 引用地址:STM32F4的USART6的LIN2.0和汽车Window Lifter driver通信

上一篇:STM32F4的外部SRAM_原理部分
下一篇:STM32中USART接收中断问题使单片机死机

推荐阅读最新更新时间:2024-03-16 16:16

用PIC18F458的CAN模块实现CAN总线通信
  CAN(Controller Area Network)即控制器区域网,是一种主要用于各种设备监测及控制的网络。CAN 具有独特的设计思想, 良好的功能特征和极高的可靠性,现场抗干扰能力强。其在国内外工业控制领域已经被广泛应用, 成为最有发展前途的现场总线之一。   美国微芯公司的PIC18F458 单片机集成了CAN 通信接口,执行Bosch 公司的CAN2.0A/B 协议。它能支持CAN1.2、CAN2.0A、CAN2.0B 协议的旧版本和CAN2.0B现行版本。使用PIC18F458 单片机的嵌入式系统, 可以很方便的利用CAN 总线与外界进行数据交换。它的优点是电路接口比较简单,只需很少的外围电路就可实现CAN 通信,
[嵌入式]
通信厂商应积极向数据通信领域转型
    2013年对许多 光通信 企业来说是艰难的一年,随着中国电信、中国移动等运营商加强对4G/LTE的投资力度,无线宽带基础设施的大规模建设剥夺了有线投资,在中国电信已经在上半年已经用完在FTTH的全年额度,许多国内企业嗷嗷待哺的大背景下,转型?升级?放弃还是坚持?这都是非常现实的问题。   数据通信一枝独秀   从2013年全球整体光通信市场来看,电信市场比较平淡,甚至可以说在冬眠;但是数据通信市场表现则超出我们的预期。来自Lightcounting 的报告显示,在数据通信领域,不仅仅是40Gig和100Gig,连10Gig的增长都快于预期。2013年10GbE模块的出货量会超过1GbE。这当中主要原因是数据中心日益增长
[手机便携]
STC89C52RC单片机的NRF24L01无线通信程序,收发一体
本设计由两块STC89C52RC单片机组成,通过NRF24L01实现最廉价的无线通信。 每块单片机都是集收发于一体,先初始化会在OLED上显示是否初始化成功, 然后通过按键可选择收发模式,并在OLED屏幕上显示出来 最后选择串口调试助手,打开串口给单片机发送信息,单片机接收到后再通过NRF24L01向另一块单片机发送 接收成功后会将接收到的信息显示在OLED上。 OLED显示屏较1602液晶显示屏清楚,可现实的内容丰富,可以建立自己的字库 并且占用的引脚较少 单片机源程序如下: #include reg52.h #include oled.h #include bmp.h #include nrf24l01.h #incl
[单片机]
成功移植icore的shell串口到STM32F4
icore开发板上的例子光盘下的 \iCore_扩展相关\code\7_uart1_shell工程文件,删除FSMC.c 和RCC.c 两个C文件和H文件 移植步骤: 第一、替换到之前的启动代码,添加startup_stm32f4xx.s 和system_stm32f4xx.c 两个文件。system_stm32f4xx.h可以替代到rcc.h 第二、改写NVIC.c 里的初始化代码。 static int initialize(void) { SCB- VTOR = ((unsigned long)0x08000000); //Set the Vector Table base location at 0
[单片机]
成功移植icore的shell串口到<font color='red'>STM32F4</font>
STM32串口通信:修改标准库的printf通过USART打印
USART1需要事先进行较为麻烦配置,配置之后发现即使用HAL函数发送语句还要事先以字符串方式定义,实在是麻烦,虽然后面另外自己写了一个简单的库来操作串口,但看到了更简单的方法,修改标准库中printf相关的两个函数,达到通过printf来串口输出的效果。 (在配置完要使用的串口后) 先在main.c中加上 #include stdio.h 然后重定向两个函数,这里指定的是USART1接口,PA9和PA10,其他USART或者UART自行修改即可 int fputc(int ch, FILE *f) { USART1- DR=(uint8_t)ch; while((USART1- SR&0X40)==0); return ch
[单片机]
NRF24L01实现msp430单片机通信(SPI)
24l01.h #ifndef _24L01_H_ #define _24L01_H_ /***************************************************/ typedef unsigned char BYTE; #define uchar unsigned char //24L01发送接收数据宽度定义 #define TX_ADR_WIDTH 5 //5字节的地址宽度 #define RX_ADR_WIDTH 5 //5字节的地址宽度 #define TX_PLOAD_WIDTH 7 //20字节的用户数据宽度 #define RX_PLOAD_WIDTH 7 //20字
[单片机]
量子通信市场前景可达千亿? 行业龙头接受IPO辅导
   在2017云栖大会前一天,马云依然非常忙碌,但笑称不懂技术的他,却抽空向13位全球顶级科学家进行“讨教”,其中,就包括中国量子力学第一人潘建伟。   10月11日,身为中科院院士、中国科学技术大学常务副校长的潘建伟,也在云栖大会上为大家带来一场“思想饕餮”。他说,量子计算正带来一场新的科技革命,能够将人类社会计算能力提升几十万甚至上百万倍。   相比于待落地的量子计算,量子物理学与密码学相结合的量子通信,随着国内首个商用量子保密通信专网在济南建成并通过验收,成为量子技术产业化的重要节点。   招商证券相研报预计两到三年,量子通信总体市场规模达百亿量级。更有乐观者认为,中国量子通信市场规模在未来有望达到千亿元级别。   10月
[手机便携]
TMS320VC5402与PC机进行串行通信的两种方案
1 引 言   通用数字信号处理器(DSP)以其很强的数据处理能力在高速数字信号处理方面得到了广泛的应用。TMS320VC5402(以下简称C5402)是为实现低功耗、高性能而专门设计的定点DSP芯片,其主要应用领域是无线通信系统。在实际应用的过程中,我们发现C5402的通信接口控制能力很弱。当C5402独立作为一个系统的处理单元时,与外设进行数据交换是必不可少的,其通信能力弱的特点就会影响应用的效果。   对TI的TMS320系列的DSP来说,设计串口的方法一般有两种:(1)利用通用I/O口线XF和BIO来构成串口,由软件设计波特率,在CPU不繁忙的情况下往往采用这种方法;(2)利用UART(通用异步收发器)来进行串行通信,CPU
[单片机]
TMS320VC5402与PC机进行串行<font color='red'>通信</font>的两种方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved