STM32 —— LIN

STM32 —— LIN

/*
  LIN 总线的主要特性有
    单主机 多从机概念
    基于普通 UART/SCI 接口的低成本硬件实现 低成本软件或作为纯状态机
    从机节点不需要石英或陶瓷谐振器可以实现自同步
    保证信号传输的延迟时间
    低成本的单线设备
    速度高达 20kbit/s

  总线的通讯由单个主机控制 每个报文帧都用一个分隔信号起始 ,一个同步场和一个标识符场 .

  这些都由主机任务发送 从机任务则是发回数据场和校验场

       报文路由 报文的内容由识别符命名 识别符不指出报文的目的地 但解释数据的含义 最大的
  标识符数量是 64 其中 4 个保留用于专用的通讯 譬如软件升级或诊断

  多播 由于引入了报文滤波的概念 任何数目的节点都可以同时接收报文 并同时对此报文做出反应

  位速率
    最大的波特率是 20kbit/s 它是由单线传输媒体的 EMI 限制决定 最小的波特率是 1kbit/s 可以避免
  和实际设备的超时周期冲突,为使用低成本的 LIN 器件 建议使用下面的位速率

    建议的位速率
    低速      中速      高速
    2400 bit/s  9600 bit/s  19200 bit/s

  单主机 无仲裁
    只有包含主机任务的控制器节点可以传输报文头,一个从机任务对这个报文头作出响应,由于没有仲
  裁过程,如果多于一个从机回应,则将产生错误.这种情况下的错误界定可由用户按照应用要求指定.

  安全性
    错误检测
      监控 发送器比较总线 应当 的值和 现在 的值
      数据场的校验和以 256 为模并取反 将 MSB 的进位加到 LSB 上
      标识符场的双重奇偶校验保护

  连接
    LIN 网络节点的最大数量不仅由标识符的数量限制 见上面的信息路由 也由总线的物理特性限制
    建议 LIN 网络的节点数量不应超过 16 否则 节点增加将减少网络阻抗 会导致环境条件变差
    禁止无错误的通讯 每一个增加的节点都可以减少约 3 的网络阻抗 30k || 1k
    网络中总的 电 线 通讯导线 长度应少于或等于 40m
    主机节点的总线端电阻典型值是 1k 从机节点是 30k

  总线值
    总线有两个互补的逻辑值 显性 或 隐性 相应的位值和电压值
      表 2.2 逻辑和物理总线值
    逻辑值    位值  总线电压
    显性      0     地
    隐性      1     电池

  应答
      正确接收报文后的应答过程在 LIN 协议中没有定义 主机控制单元检查由主机任务初始化的报文
    和由它自己的从机任务接收的报文的一致性 如果不一致 例如 丢失从机响应 校验和不正确等等 主
    机任务可以改变报文的进度表
    如果从机检测到不一致 从机控制器将保存这个信息并将它用诊断信息的形式向主机控制单元请求
    诊断信息可按普通报文帧的形式进行发送

    每个报文帧都由一个同步间隔 SYNCH BREAK 起始 接着是同步场 SYNCH FIRLD 这个同
  步场在几倍的位定时长度中包含了 5 个下降沿 即 隐性 到 显性 的转换

  一个报文帧 是由一个主机节点发送的报文头和一个主机或从机节点发送的响应组成
  报文帧的报文头包括一个同步间隔场 SYNCH BREAK FIELD,一个同步场 SYNCH FIELD,和一个标识符场

    报文帧的响应 RESPONSE 则由 3 个到 9 个字节场组成 2 或 4 或 8 字节的数据场 DATA FIELD
  和一个校验和场 CHECKSUM FIELD

    字节场的格式 通常的 SCI 或 UART 串行数据格式 8N1 编码 每个字节场
  的长度是 10 个位定时 BIT TIME 起始位 START BIT 是一个 显性 位 它标志着字节场的开始
  接着是 8 个数据位 首先发送最低位 停止位 STOP BIT 是一个 隐性 位 它标志着字节场的结束

  报文头场 HEADER fields
  同步间隔 SYNCHRONISATION BREAK
    为了能清楚识别报文帧的开始 报文帧的第一个场是一个同步间隔 SYNCH BREAK 同步间隔场
  SYNCH BREAK FIELD 是由主机任务发送.它使所有的从机任务与总线时钟信号同步

    同步间隔场有两个不同的部分,第一个部分是由一个持续 T SYNBRK 或更长时间 即最小是
  T SYNBRK 不需要很严格 的显性总线电平 接着的第二部分是最少持续 T SYNDEL 时间的隐性电平
  作为同步界定符 第二个场允许用来检测下一个同步场 SYNCH FIELD 的起始位最大的间隔和界定
  符时间没有精确的定义 但必须符合整个报文头 T HEADER_MAX 的总体时间预算

  同步场 SYNCH FIELD
  同步场 SYNCH FIELD 包含了时钟的同步信息 同步场 SYNCH FIELD 的格式是 0x55 表
  现在 8 个位定时中有 5 个下降沿 即 隐性 跳变到 显性 的边沿 见图 3.4

  标识符场 IDENTIFIER FIELD
  标识符场 ID-FIELD 定义了报文的内容和长度 其中 内容是由 6 个标识符 IDENTIFIER 位和
  两个 ID 奇偶校验位 ID PARITY bit 表示 见图 3.5 标识符位的第 4 和第 5 位 ID4 和 ID5 定义了
  报文的数据场数量 N DATA 见表 3.2 这将把 64 个标识符分成 4 个小组 每组 16 个标识符 这些标识
  符分别有 2 4 和 8 个数据场

  响应场 RESPONSE field
  数据场 DATA FIELD 和  校验和场 CHECKSUM FIELD
  数据场通过报文帧传输 由多个 8 位数据的字节场组成 传输由 LSB 开始

  校验和场 CHECKSUM FIELD
  校验和场是数据场所有字节的和的反码和按 带进位加 ADDC 方式计算 每个进位
  都被加到本次结果的最低位 LSB 这就保证了数据字节的可靠性,所有数据字节的和的补码与校验和字节之加的和必须是 0xFF
*/

#include "lin.h"
#include "lin_queue.h"
#include "lin_handle.h"
#include "target.h"#define LIN_CHANNEL         UART4
#define RCC_LIN_APB         RCC_APB1PeriphClockCmd
#define RCC_LIN_CLK         RCC_APB1Periph_UART4
#define LIN_BOAURATE        19200
#define LIN_IRQ             UART4_IRQn
#define LIN_INT_FUNC        UART4_IRQHandler#define LIN_PORT            GPIOC
#define LIN_TX_PIN          GPIO_Pin_10
#define LIN_RX_PIN          GPIO_Pin_11
#define LIN_TX_CONFIG()     GPIOConfig(LIN_PORT, LIN_TX_PIN, GPIO_Mode_AF_PP)
#define LIN_RX_CONFIG()     GPIOConfig(LIN_PORT, LIN_RX_PIN, GPIO_Mode_IN_FLOATING)#define LIN_CS_PORT         GPIOC
#define LIN_CS_PIN          GPIO_Pin_12
#define LIN_CS_CONFIG()     GPIOConfig(LIN_CS_PORT, LIN_CS_PIN, GPIO_Mode_Out_PP)
#define LIN_CS_ENABLE()     GPIO_SetBits(LIN_CS_PORT, LIN_CS_PIN)static void lin_gpio_init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);LIN_TX_CONFIG();LIN_RX_CONFIG();LIN_CS_CONFIG();LIN_CS_ENABLE();
}static void lin_nvic_init(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = LIN_IRQ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}static void lin_uart_init(void)
{USART_InitTypeDef USART_InitStructure;RCC_LIN_APB(RCC_LIN_CLK, ENABLE);USART_InitStructure.USART_BaudRate = LIN_BOAURATE;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(LIN_CHANNEL, &USART_InitStructure);USART_LINBreakDetectLengthConfig(LIN_CHANNEL, USART_LINBreakDetectLength_11b);USART_LINCmd(LIN_CHANNEL, ENABLE);USART_Cmd(LIN_CHANNEL, ENABLE);USART_ITConfig(LIN_CHANNEL, USART_IT_RXNE, ENABLE);USART_ITConfig(LIN_CHANNEL, USART_IT_TXE, DISABLE);USART_ITConfig(LIN_CHANNEL, USART_IT_LBD, ENABLE);
}void LINInit(void)
{lin_gpio_init();lin_nvic_init();lin_uart_init();
}void LINSendChar(uint8_t ch)
{USART_SendData(LIN_CHANNEL, ch);while(!USART_GetFlagStatus(LIN_CHANNEL, USART_FLAG_TXE));
}void LINSendBreak(void)
{USART_SendBreak(LIN_CHANNEL);
}#define BIT(A,B)       ((A >> B) & 0x01)uint8_t LINCalID(uint8_t id)
{uint8_t parity, p0, p1;parity = id;p0 = (BIT(parity, 0) ^ BIT(parity, 1) ^ BIT(parity, 2) ^ BIT(parity, 4)) << 6;p1 = (!(BIT(parity, 1) ^ BIT(parity, 3) ^ BIT(parity, 4) ^ BIT(parity, 5))) << 7;parity |= (p0 | p1);return parity;
}uint8_t LINCalChecksum(uint8_t id, uint8_t *data)
{uint32_t sum = id;uint8_t i;for(i = 0; i < 8; i++){sum += data[i];if(sum & 0xFF00){sum = (sum & 0x00FF) + 1;}}sum ^= 0x00FF;return (uint8_t)sum;
}//========================================================================================================
void LIN_INT_FUNC(void)
{uint8_t ret;if(USART_GetITStatus(LIN_CHANNEL, USART_IT_RXNE)){USART_ClearITPendingBit(LIN_CHANNEL, USART_IT_RXNE);ret = USART_ReceiveData(LIN_CHANNEL);//LINQueuePush(&lin_recv, ret);}if(USART_GetITStatus(LIN_CHANNEL, USART_IT_LBD)){USART_ClearITPendingBit(LIN_CHANNEL, USART_IT_LBD); // 检测到同步间隔场//LinStatusSet(SYNCH);}if(USART_GetFlagStatus(LIN_CHANNEL, USART_FLAG_ORE) == SET) // 溢出{USART_ClearFlag(LIN_CHANNEL, USART_FLAG_ORE);USART_ReceiveData(LIN_CHANNEL);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老外码农酒后吐槽,该说的不该说的全说了!!

上个月&#xff0c;一个有着10年码龄的程序猿喝高了&#xff0c;在社交网站Reddit上吐槽。然后被疯狂转发&#xff0c;点赞。可说是讲出了咱们很多码农的心声。咱们国内这边也有不少版本了。我们也凑凑热闹翻译一版。跟大家一块儿欣赏一下&#xff1a;今天是有点儿高了&#xf…

朋友与“蓝颜知己”

??闲着无事&#xff0c;便往了图书馆&#xff0c;寻到自己一直想要找的书&#xff1a;《大明王朝1566》。是想写点什么了&#xff0c;一直想写的东西&#xff0c;是心中酝酿许久的本子&#xff0c;却总感到驾御不了&#xff0c;不敢下笔。盼望能从书中得到些启示&#xff0c;…

Kettle 学习导航帖整理

最近在学习Kettle&#xff0c;期间收集了很多帖子&#xff0c;在此整理汇总以备后续查询或分享&#xff0c;如果有更好的学习资源也欢迎在评论区留言&#xff0c;谢谢。 Kettle入门&#xff1a; Kettle简介&#xff1a;百度百科https://baike.baidu.com/item/Kettle/5920713?f…

STM32 —— 中景园0.96寸OLED

STM32 —— 中景园0.96寸OLED OLED&#xff0c;即有机发光二极管&#xff08; Organic Light Emitting Diode &#xff09;。 OLED 由于同时具备自发光&#xff0c;不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优…

Intel官宣开发RISC-V处理器:明年首发7nm工艺

近日业界盛传&#xff0c;Intel计划以20亿美元收购RISC-V IP供应商SiFive——后者的产品已被80多家公司采纳&#xff0c;设计了200多种产品&#xff0c;出货量极大&#xff0c;广泛用于各种加速器。虽然双方对于收购都拒绝置评&#xff0c;但深入合作已经展开。Intel官方宣布&a…

SCCM2007 R2的部署前准备,SCCM系列之一

SCCM 2007 R2的部属前准备<?xml:namespace prefix o />System Center 是微软著名的管理平台软件&#xff0c;在实现Microsoft的MOF&ITIL的IT管理理念的过程中发挥了很重要的作用&#xff0c;System Center可以在MOF的每一个运维象限中都有对应的System Center产品协…

硬件基础 —— 电阻

硬件基础 —— 电阻1、电阻基本知识电阻&#xff1a;在电路中对电流有阻碍作用并且造成能量消耗的部分。主要物理特性是变电能为热能&#xff08;耗能元件&#xff09;&#xff0c;符号R&#xff08;单位&#xff1a;Ω&#xff09;。2、电阻的作用&#xff1a;分流、限流、分压…

史上最全的LED点灯程序,你都掌握了吗?

摘要&#xff1a;你点亮过多少板子的LED灯呢&#xff1f;有很多小伙伴留言说讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多&#xff0c;口说无凭&#xff0c;今天就来点亮一下STM32、FPGA和Liunx板子的LED灯&#xff0c;大家大致看一下点灯流程和点灯环境以及点灯流…

修复远程过程调用 (RPC) 时发生的各种问题KB908521

当系统出现RPC通讯问题时可以尝安装KB908521进行修复。安装本更新程序可以解决当您在 Microsoft Windows Server 2003 和 Microsoft Windows XP 中的客户端/服务器通信中使用远程过程调用 (RPC) 时发生的各种问题。http://www.microsoft.com/downloads/details.aspx?FamilyID7…

B站硬核up主稚晖君:对于3年以上软件开发工程师,我有这些建议!

稚晖君&#xff0c;何许人也&#xff1f;本硕就读于电子科技大学华为AI架构师热爱硬件开发B站硬核UP主“栈溢出”工程师加入“华为天才少年计划”或许当你看到这一堆Title的时候并不觉得有什么特别&#xff0c;那么接下来看看他的一些作品。作品1&#xff1a;B站最强小电视这条…

Python 实现微信小程序的用户登录

小程序可以通过官方提供的登录能力来获取用户身份的标示&#xff0c;具体文档可以参考 这里&#xff0c;通过流程时序可以看到&#xff0c;对于需要和前端配合的服务端开发&#xff0c;主要实现的就是通过小程序提供的 code 换取用户的 openid 和 session_key&#xff0c;并用换…

硬件基础 —— 电容

硬件基础 —— 电容1、电容基本知识&#xff08;记忆元件&#xff09;电容器是一种能储存电荷的容器。电容器对直流电阻力无穷大&#xff0c;即电容器具有通交隔直的作用。电容器对交流电的阻力受交流电频率影响&#xff0c;即相同容量的电容器对不同频率的交流电呈现不同的容抗…

python 学习笔记一

有关 dictionary、tuple、和 list Tuple 是不可变的 list。一旦创建了一个 tuple&#xff0c;就不能以任何方式改变它。如t ("a", "b", "mpilgrim", "z", "example") List 是 Python 中使用最频繁的数据类型。如&#xff1…

同事说rar压缩有风险,让我用zip压缩文件

在现在最常见的压缩文件有zip、rar、7z三种&#xff0c;它们都有各自的优点和缺点。我们用一句话来概括一下&#xff1a;7z压缩率最高&#xff0c;RAR安全性高&#xff0c;ZIP使用范围广。文件压缩打包是最为常见的一种分享方式了&#xff0c;而众多的压缩格式中zip仍然是主流。…

JAVA实现概率计算(数字不同范围按照不同几率产生随机数)

程序中经常遇到随机送红包之类的情景&#xff0c;这个随机还得指定概率&#xff0c;比如10%的机率可以得到红包。那么java怎么实现一个简单的概率计算了&#xff0c;见如下例子&#xff1a; int randomInt RandomUtils.nextInt(1,101); if(randomInt < 10){ //100里面1个数…

硬件基础 —— 二极管

硬件基础 —— 二极管1、二极管基础知识PN结&#xff1a;P区空穴&#xff0c;N区电子。由于浓度差原理&#xff0c;会产生扩散运动&#xff08;N到P运动&#xff09;。在电场作用下&#xff0c;载流电子作漂移运动&#xff0c;方向与扩散运动方向相反直到PN结电流为零&#xff…

AKI-H8串口通信

串口通信是一种通信接口简写SCI&#xff0c;它可是实现异步和同步两种传输模式。可以思考一下同步和异步的区别。 所谓同步就是接收方和发送方使用的是同一个时钟&#xff0c;步调一致的处理数据。典型的就是CPU和内存&#xff0c;通过总线存取数据。特点就是快&#xff0c;发送…

字节取消大小周,部分员工:心疼,每个月少拿 1W 块

如图&#xff0c;是脉脉最近的一个热帖&#xff0c;头条昨天全员发邮件取消了大小周&#xff0c;原本是一件好事&#xff0c;减轻大家的工作压力&#xff0c;努力向 workbalance 靠拢&#xff0c;可是看着风向好像不太对&#xff0c;我们继续看下 TOP 的几个回复。下面是反对头…

高通LCD的pwm背光驱动

发生异常的现象&#xff1a; msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭&#xff1b;测量高通pwm&#xff0c;发现正常的时候pwm的管脚LCM_BL_PWM为低电平&#xff0c;失败的时候为高电平&#xff1b; 根据原理图&#xff1a; mpp是什么&#xff1f; mpp是基于电源pmic的…

为什么一个字节定义成8位?

今天给大家分享一个小小知识点&#xff0c;为什么一个字节定义成8位呢&#xff1f;一些人没有回答到点子上。这件事得追溯计算机历史&#xff0c;源于IBM360操作系统和图灵奖得主&#xff08;Fred&#xff09;Brooks Jr。布鲁克斯被问到“您认为自己最大的技术成就是什么&#…