STM32-03

485 CAN 单总线 SPI I2C :1、是什么 2、特点3、协议 4、使用方法 5、区别 6通信方式

一、485:

1、是什么?

485(一般称作 RS485/EIA-485)

是隶属于 OSI 模型物理层电气特性规定为 2 线半双工多点通信标准

它的电气特性和 RS-232 大不一样,用缆线两端的电压差值来表示传递信号

2、特点

1. 接口电平低,不易损坏芯片

RS485 的电气特性:逻辑“1”以两线间的电压差为+(2~ 6)V表示;逻辑“0”以两线间的电压差为-(2~6)V 表示。接口信号电平比 RS232 降低了,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。

2. 传输速率高

10 米时,RS485 的数据最高传输速率可达 35Mbps,在 1200m 时,传输速度可达 100Kbps

3. 抗干扰能力强

RS485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。

4. 传输距离远,支持节点多

RS485 总线最长可以传输 1200m 以上(速率≤100Kbps)一般最大支持 32 个节点,如果使用特制的 485 芯片,可以达到 128 个或者 256 个节点,最大的可以支持到 400 个节点。

3、协议

RS485 仅仅规定了接受端和发送端的电气特性,它没有规定或推荐任何数据协议

4、使用方法

RS485 推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。

理想情况下 RS485需要 2 个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般 120Ω)

没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差

没有终接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错

二、CAN

  1. 是什么?

CAN 是控制器局域网络 (Controller Area Network) 的简称

它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。

  1. 特性

1. 多主控制(I2C有主从机之分,CAN无所谓主机从机)

在总线空闲时,所有的单元都可开始发送消息(多主控制)

“最先”访问总线的单元可获得发送权(不管后面消息的优先级是否比自身的高)

多个单元“同时”开始发送时,发送高优先级 ID 消息的单元可获得发送权(只在同时发送时起作用)

2. 消息的发送(对比I2C是根据地址进行访问,这里ID非地址,而是一种表征优先级的标识符)

在 CAN 协议中,所有的消息都以固定的格式发送。当两个以上的单元同时开始发送消息时,根据ID (标识符) 决定优先级,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作,此处这里ID非地址,而是一种表征优先级的标识符

3. 系统的柔软性(对比I2C总线上的每个单元都有一个独立的地址)

与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的都不需要改变。

4. 通信速度(波特率)

由CAN的物理层就可以看出,CAN是一种异步通信方式,所以通信前必须统一好同一网络上每个单元的波特率,即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

5. 远程数据请求

可通过发送“遥控帧” 请求其他单元发送数据。

6. 错误检测功能·错误通知功能·错误恢复功能

所有的单元都可以检测错误(错误检测功能)

检测出错误的单元会立即同时通知其他所有单元(错误通知功能)

正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)

7. 故障封闭

CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

8. 连接

CAN 总线可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。

3、协议

1. 初始化

SocketCAN中大部分的数据结构和函数在头文件linux/can.h 中进行了定义。CAN总线套接字的创建采用标准的网络套接字操作来完成。网络套接字在头文件sys/socket.h中定义。

2. 数据发送

在数据收发的内容方面,CAN总线与标准套接字通信稍有不同,每一次通信都采用can_ frame结构体将数据封装成帧。can_id为帧的标识符,如果发出的是标准帧,就使用can_id的低11位;如果为扩展帧,就使用0~28位。can_id的第29、30、31位是帧的标志位,用来定义帧的类型

3. 数据接收

数据接收使用read函数来完成。

三、单总线

1、是什么

1-wire,即单线总线,又叫单总线。

单总线技术(1-Wire Bus)是美国的达拉斯半导体公司(DALLAS SEMICONDUCTOR)推出了一项特有的技术,它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。

2、单总线特点

1、部件独立性

采取异步工作方式各部件的运行速度可以与总线上其他部件完全无关,而不是一切以存贮器周期为转移。因此可以局部更新,增强系统适应性延长系统使用寿命。积木化也有利于各部件独立地设计、生产、调试和改进。

2、面向外围

单总线结构是一种面向外围的系统组织方法,I/O设备“直接存贮器存取"(DMA)可以绕过CPU;外围设备之间可以直接通信,例如显示器可从磁盘直接获得画面数据形成与CPU独立的I/O子系统;与另一台单总线计算机互连,也只要两者的总线互连,易于扩充为多机系统。

3、总线限制

系统中所有设备都连接在单总线上,使总线实际上比较长,电气负载很重,决定了单总线不能成为高速总线。而总线速率限制了系统性能,限制了可扩充性。总线可靠性则限制了系统可靠性。事实上,CPU和主存之间的信息交换是系统中最经常的事件,并主要由它决定了整个系统性能。可是单总线系统却忽视了主存的特殊地位,只放在外围设备同等地位。因此改进单总线系统性能的途径自然是在主存与CPU之间增加一条独立的高速总线,实际上部分地转移到以存贮器为中心组织系统。

3、协议

1-Wire协议定义了复位脉冲、应答脉冲、写0、读0和读1时序等几种信号类型。所有的单总线命令序列(初始化,ROM命令,功能命令)都是由这些基本的信号类型组成的。在这些信号中,除了应答脉冲外,其他均由主机发出同步信号,并且发送的所有命令和数据都是字节的低位在前。

  典型的单总线命令序列如下:

  第一步:初始化

  第二步:ROM 命令(跟随需要交换的数据)

  第三步:功能命令(跟随需要交换的数据)

  每次访问单总线器件,必须严格遵守这个命令序列,如果出现序列混乱,则单总线器件不会响应主机。但是,这个准则对于搜索ROM 命令和报警搜索命令例外,在执行两者中,任何一条命令之后,主机不能执行其后的功能命,令必须返回至第一步。

4、使用方法

目前常用的微机与外设之间进行数据传输的串行总线主要有I2C总线、SPI总线和SCI总线。其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),而SCI总线是以异步方式进行通信(一条数据输入线,一条数据输出线)的。这些总线至少需要两条或两条以上的信号线。近年来,美国的达拉斯半导体公司(DALLASSEMICONDUCTOR)推出了一项特有的单总线(1-Wire Bus)技术。该技术与上述总线不同,它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。

  单总线适用于单主机系统,能够控制一个或多个从机设备。主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。

5、通信方式

主机对1-Wire总线的基本操作分为复位、读和写三种,其中所有的读写操作均为低位在前高位在后。复位、读和写是1-Wire总线通信的基础。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于STM32收发数据包的问题,可以使用串口通信来实现。下面是一个简单的示例代码,演示了如何使用STM32的串口收发数据包。 首先,你需要初始化串口。在STM32的库函数中,可以使用HAL库来进行串口的初始化和配置。下面是一个初始化串口的示例代码: ```c UART_HandleTypeDef huart; void UART_Init(void) { huart.Instance = USART2; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart); } ``` 接下来,你可以使用HAL库提供的函数来实现数据包的发送和接收。例如,使用`HAL_UART_Transmit()`函数发送数据包,使用`HAL_UART_Receive()`函数接收数据包。下面是一个简单的示例代码: ```c uint8_t txData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; uint8_t rxData[10]; void sendPacket(void) { HAL_UART_Transmit(&huart, txData, 10, 100); } void receivePacket(void) { HAL_UART_Receive(&huart, rxData, 10, 100); } ``` 以上代码演示了如何发送一个长度为10字节的数据包,并接收一个长度为10字节的数据包。 需要注意的是,以上只是一个简单的示例,实际应用中可能需要根据具体的需求进行修改和优化。同时,还需要根据具体的硬件连接和配置来进行相应的调整。 希望能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值