最近要做一款汽车零部件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)只包含从机任务,如下图所示:
主机任务负责:
(1) 调度总线上帧的传输次序(读数据、写命令);
(2) 监测数据,处理错误;
(3) 作为标准时钟参考;
(4) 接收从机节点发出的总线唤醒命令。
从机任务不能够主动发送数据,需要接收主机发送的帧头,根据帧头所包含的信息(这里指帧ID)判断:
(1) 发送应答(帧中除帧头外剩下的部分,参照3.1节的图3.1);
(2) 接收应答;
(3) 既不接收也不发送应答。
<2>帧的结构
帧(Frame)包含帧头(Header)和应答(Response)两部分。如下图所示:
<3>主机节点发送一帧在总线上的传输(写从节点)
通过LIN总线传输的实体为帧。一个报文帧由帧头以及回应(数据)部分组成。在一个激活的LIN 网络中,通讯通常由主节点启动,主节点任务发送包含有同步间隙的报文头,同步字节以及报文标志符(ID)。一个从节点的任务通过接收并过滤标志符被激活,并启动回应报文的传送。回应中包含了1到8个字节的数据以及一个字节的校验码。
传输一帧所花费的总的时间是发送每个字节所用的时间,加上从节点的回应间隙,再加上传输每个字节的间隙时间(inter-byte space)。字节间隙是指发送完前一个字节的停止位后到发送下一个字节的启动位之间的时间。帧在总线上的传输如下图所示:
<4>主机节点接收一帧在总线上的传输(读从节点)
主机任务负责发送帧头;从机任务接收帧头并对帧头
所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。帧在总线上的传输如下图所示:
了解了这些之后,就可以开始编写主机节点的单片机程序了,在此采用STM32F407VGT6,LIN收发器采用ATMEL的ATA6625,原理图如下:(做为LIN主节点,应该对LINBUS加上拉电阻到VBAT)
采用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,
通过LIN发送ID为0x21,数据为0x20 0xFF,则背光点亮,效果如下图(上图未点亮,下图点亮):
读取LIN数据,返回数据,串口打印如下,和Window Lifter driver Specification一致:
对应示波器波形如下:
上一篇:STM32F4的外部SRAM_原理部分
下一篇:STM32中USART接收中断问题使单片机死机
推荐阅读
史海拾趣
公司成立与早期发展:AMD(Advanced Micro Devices)公司成立于1969年,由Jerry Sanders在美国加利福尼亚州圣克拉拉创立。最初,AMD致力于生产挑战Intel在x86处理器市场的产品,但起初面临着市场份额不足和技术挑战等问题。然而,随着时间的推移,AMD逐渐在市场上获得了一席之地,并推出了一系列创新产品。
x86处理器市场竞争:AMD在x86处理器市场与Intel展开了激烈的竞争。1991年,AMD推出了第一款x86兼容处理器386DX-40,开始了与Intel的竞争。此后,AMD不断推出更快、更强大的处理器,如K6系列、Athlon系列等,一度取得了一定的市场份额。
ATI收购与图形处理器发展:为了拓展业务,AMD于2006年收购了图形处理器制造商ATI Technologies。这一收购使AMD进入了图形处理器市场,并推出了一系列创新的图形处理器产品,如Radeon系列。AMD通过不断推出高性能、高度集成的图形处理器,赢得了广大用户的青睐。
全球Foundry战略:为了降低制造成本并提高生产效率,AMD实施了全球Foundry战略。2008年,AMD成立了GlobalFoundries,将自己的制造业务转移给这家独立的半导体制造公司。这一举措使AMD得以专注于设计和研发,提升了公司的竞争力。
技术创新与新市场拓展:除了在x86处理器和图形处理器市场取得成功外,AMD还不断进行技术创新,拓展新的市场。例如,AMD在数据中心领域推出了EPYC系列服务器处理器,致力于满足云计算和大数据处理的需求。此外,AMD还在游戏主机市场与Sony和Microsoft等公司合作,提供高性能的处理器和图形处理器。
这些故事展示了AMD在其创立以来的发展历程,包括在x86处理器市场的竞争、图形处理器领域的扩展、全球Foundry战略的实施以及在新兴市场的技术创新和市场拓展等方面取得的成就。
在快速发展的同时,Baneasa SA始终注重技术创新和可持续发展。公司不断投入研发资金,开发新的电子元器件产品和技术,以满足市场的不断变化和客户的需求。同时,公司也注重环保和节能减排,采用环保材料和节能技术,致力于实现可持续发展。
这些故事虽然基于假设和虚构,但尽量遵循了电子行业企业发展的一般规律和趋势。它们旨在展示Baneasa SA在电子行业中的可能发展历程和成就,而不涉及任何主观评价或褒贬。请注意,这些故事并非真实事件,仅用于说明公司在电子行业发展的可能性和方向。
随着技术的不断进步和市场需求的日益增长,智浦欣公司意识到,只有不断创新和突破,才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发团队的投入,引进了一批国内外顶尖的模拟器件和混合信号设计人才。经过数月的努力,团队成功研发出了一款具有高性价比的WLED驱动器产品,该产品以其卓越的性能和稳定的质量赢得了客户的广泛好评。随后,公司又相继推出了多款具有竞争力的新产品,进一步巩固了其在消费类电子市场的地位。
随着电子行业的快速发展,BOPLA意识到传统的电子元件已经无法满足市场的需求。于是,公司投入大量资源进行技术研发,成功推出了一系列具有创新性的电子元件产品。这些产品不仅性能优异,而且具有更高的可靠性和稳定性,赢得了市场的广泛好评。
在快速发展的过程中,安森德公司始终注重品牌建设和文化塑造。公司坚持以客户为中心的服务理念,不断提升产品质量和服务水平。同时,安森德还积极参与各类行业活动和公益事业,提升公司的社会形象和品牌价值。在内部管理方面,公司倡导创新、协作、担当的企业文化,为员工提供了一个良好的工作环境和发展平台。这些举措不仅增强了员工的归属感和凝聚力,也为公司的长远发展奠定了坚实的基础。
随着中国经济的快速崛起,电子市场需求不断增长。为了抓住这一机遇,DIOTEC于2005年在中国上海设立了分公司,即德欧泰克半导体(上海)有限公司。这家分公司凭借DIOTEC在全球的技术和品质优势,迅速在中国市场打开了局面。如今,德欧泰克半导体(上海)有限公司已经成为中国电子行业的重要供应商之一。
1.一定要有独立的人格、独立的思想。一个经过独立思考而坚持错误观点的人比一个不假思索而接受正确观点的人更值得肯定。不要成为灌输教育的牺牲品。 2.在进行职业生涯规划的时候,不妨以此作为思考的出发点。根据不同的职业生涯规划来塑造各自 ...… 查看全部问答∨ |
全球80%手机或遭窃听?看到这,一下子懵了~~这还有啥隐私啊? 据报道,德国加密专家、曾获美国弗吉尼亚大学计算器工程学博士学位的诺尔宣布,自己有意破解已有21年历史的GSM算法,目的是为了帮助发现GSM的安全漏洞。 今年初,他发现固定无线电话 ...… 查看全部问答∨ |
1、放弃 把握的反面就是放弃,选择了一个机会,就等于放弃了其它所有的可能。当新的机会摆在面前的时候,敢于放弃已经获得的一切,这不是功亏一篑,这不是半途而 废,这是为了谋求更大的发展空间;或者什么都不为,只因为喜欢这样做,因为,年轻就 ...… 查看全部问答∨ |
在WM5 SDK中写的普通的对话框程序 放到多普达的WM6机器上 只能显示大半个对话框 以前有台华硕p565的也是WM6,也出现了这个问题,后来校正了一下屏幕就ok了 多普达这个用这个方法还是不行 不知大家谁遇到过这个问题  ...… 查看全部问答∨ |
例如使用TC发送后中断,和RXNE接收中断。 如果正在发送数据,处于串口中断中,这时接收也来了一串数据,这种情况怎么处理?是不是就不能及时响应接收了呢?… 查看全部问答∨ |
无线手表开发工具 eZ430-Chronos™ 开发工具用户指南 (Rev. D) eZ430-Chronos 是运动手表中基于 CC430 的高度集成的无线开发系统。它可用作手表系统的参考平台、个人局域网的个人显示器或远程数据收集的无线传感器节点。 无线手表开发 ...… 查看全部问答∨ |
在低电压(100V以下)驱动应用中,多使用MOSFET作为功率转换器件。随着电压的提高,MOSFET的优势也随着不明显,所以在高压的应用场合,多使用IGBT作为功能器件,该类器件的耐压可以做得较高,结合了FET和三极管的优点,它的导通电阻和开关速度不比M ...… 查看全部问答∨ |