汽车中CAN线 和LIN线具体定义是什么? 起应用有什么不同?
CAN
是Controller
Area
Network
的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986
年德国电气商博世公司开发出面向汽车的CAN
通信协议。此后,CAN
通过ISO11898
及ISO11519
进行了标准化,在欧洲已是汽车网络的标准协议。
LIN(Local
Interconnect
Network)是一种低成本的串行通讯网络,用于实现汽车中的分
布式电子系统控制。LIN
的目标是为现有汽车网络(例如CAN
总线)提供辅助功能,因此LIN
总线是一种辅助的总线网络。在不需要CAN
总线的带宽和多功能的场合,比如智能传感器和制动装置之间的通讯使用LIN
总线可大大节省成本。LIN
技术规范中除定义了基本协议和物理层外还定义了开发工具和应用软件接口。LIN
通讯是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式。仅使用一根12V
信号总线和一个无固定时间基准的节点同步时钟线。
这种低成本的串行通讯模式和相应的开发环境已经由LIN
协会制定成标准。LIN
的标准化将为汽车制造商以及供应商在研发应用操作系统降低成本。
stm32can通信和串口的区别
CAN线是汽车数据总线, 是控制器局域网线, 用于控制单元和控制饭预案之间数据传输, 双线模式, 有高位线和低位线之分.
特点: 传输速率高抗干扰能力强, 根据用途分为有舒适性CAN线, 驱动CAN线, 诊断CAN线 和仪表CAN线,LIN线是一种低成本串行通信网络线, 单线模式, 应用于不需要高速传输的汽车网络 ,比如汽车门窗, 天窗, 雨刮等, 是为了减少成本代替CAN线用的 ,属于辅助的数据传输线.
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。
LIN(Local Interconnect Network)是一种低成本的串行通讯网络,用于实现汽车中的分
布式电子系统控制。LIN 的目标是为现有汽车网络(例如CAN 总线)提供辅助功能,因此LIN
总线是一种辅助的总线网络。在不需要CAN 总线的带宽和多功能的场合,比如智能传感器和制动装置之间的通讯使用LIN 总线可大大节省成本。LIN 技术规范中除定义了基本协议和物理层外还定义了开发工具和应用软件接口。LIN 通讯是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式。仅使用一根12V 信号总线和一个无固定时间基准的节点同步时钟线。
这种低成本的串行通讯模式和相应的开发环境已经由LIN 协会制定成标准。LIN 的标准化将为汽车制造商以及供应商在研发应用操作系统降低成本。
一、简介
STM32F103ZET6有3个USART(通用同步和异步收发器) + 2个UART(通用异步收发器)
分别是USART1,USART2,USART3
和UART4,UART5
二、USART和UART有什么区别呢?
当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能,同步通信需要STM32提供时钟来同步的,
这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步通信的连接示例图:
其中RX,TX,SCLK引脚的定义,在数据手册上都可以找到:百为stm32开发板光盘\芯片数据手册\数据手册STM32F103xC STM32F103xD STM32F103xE.pdf
这个区别在初学STM32的时候我们不需要去深入研究,只要知道USART有很多功能,除了全双工异步通信之外,还包括支持同步通信和单线半双工通信,支持LIN(局部互连网),智能卡协议和IrDA红外通信,以及调制解调器(CTS/RTS)等操作。
三、数据通信格式
我们用得最多的是全双工异步通信功能,下面我们来研究下怎么通过串口1(USART1)来收发信息,和printf功能的实现。
通常串口通信的数据格式如下图:
我们需要设置的数据有通信速率,数据字长,奇偶检验位,停止位。一个典型的设置是115200波特率,8位数据,无奇偶校验,1位停止位。
这个设置在固件函数库里面,我们是通过设置USART_InitStructure结构体,然后调用USART_Init函数来实现的:
USART_InitStructure.USART_BaudRate = 115200; //设置通信波特率为115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置通信数据格式为8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位为1位
USART_InitStructure.USART_Parity = USART_Parity_No ; //设置为无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置为无硬件流控制,即无CTS/RTS控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置发送使能,接收使能
USART_Init(USART1, &USART_InitStructure); //调用USART_Init,把上面的参数分别设置进USART的控制寄存器USART1->CR1,USART1->CR2,USART1->CR3
USART_Cmd(USART1, ENABLE); //使能串口
大家发现,在2.0固件库的USART例程里并没有看到USART1,因为是它用USARTx宏代替的,
其中USARTx是platform_config.h里定义的,大概是这个样子:
#ifdef USE_USART1
#define USARTx USART1
#define GPIOx GPIOA
#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA
#define GPIO_RxPin GPIO_Pin_10
#define GPIO_TxPin GPIO_Pin_9
#endif
只有定义了USE_USART1,上面的#ifdef USE_USART1和#endif之间的内容才会被编译,所以在platform_config.h里也需要定义USE_USART1:
#define USE_USART1
这里GPIO_Pin_9是串口1的发送引脚,GPIO_Pin_10是串口1的接收引脚,也可以从百为STM32开发板的电路图上看出来:
四、串口引脚配置
上面USART_Init函数配置了USART1的数据通信格式,但串口能工作的前提是需要配置相应的TX,RX的引脚,这个是通过GPIO_Configuration函数来配置的:
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开AFIO时钟
/* 配置 USARTx_Tx 为复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOx, &GPIO_InitStructure);
/* 配置 USARTx_Rx 为输入悬空 */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}
五、收发数据
配置好USART1使用的引脚,数据通信格式,下面就可以收发数据了,
USART_GetFlagStatus函数可以读取收发状态等,读取状态标志可以是以下几个:
发送数据示例:
USART_SendData(USART1, 'a'); //发送一个字符a
接收数据示例:
u16 RxData;
RxData = USART_ReceiveData(USART1); //从USART1接收数据到RxData变量
下面是串口通信printf程序里的主要功能,上电打印一串信息,把接收到的数据回显到PC上:
/* 用printf打印一串信息到PC的超级终端或串口调试软件上 */
printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
while (1)
{
if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判断是否有数据要接收
{
i = USART_ReceiveData(USARTx); //接收数据
printf("%c\n\r",i&0xff); //回显到PC的超级终端或串口调试软件上
}
}
六、printf的实现
上面的printf是怎么实现的呢,这个是C标准库里定义的函数,我们是怎样把它的输出重定向到串口的呢?
我们知道printf是调用fputc函数来打印的,所以我们只要把fputc函数重定义就可以了:
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
PUTCHAR_PROTOTYPE
{
/* 调用USARTx发送一个字符*/
USART_SendData(USARTx, (u8) ch);
/* 等待发送完成 */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
{
}
return ch;
}
另外还要加上头文件
#include "stdio.h"
还要注意的是,在工程里要勾上USE MicroLIB
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!