6

我想学习和实现CAN BUS协议。我已经在软件中使用 MSP430 Launchpad 实现了 UART、SPI、I2C 和单线总线协议。现在我想了解CAN Bus协议。我有 mBed LPC 1768 Cortex M3 开发板。mBed 有 Can Bus 库,但我想编写自己的库,以便详细了解它,即我为其他通信协议所做的方式。

我无法找到合适的资源开始,材料似乎散落在网上。任何人都可以指导我如何使用我提供的开发板编写和实现 CAN 总线协议。

谢谢

4

4 回答 4

7

与 I2C 或 SPI 相比,开发 CAN 库相对容易。这是因为您的 Cortex 的 CAN 控制器将处理大多数复杂的事情。

要传输数据,您必须将 ID 和 Data 写入指定的寄存器并设置位以传输数据。

恩智浦的这份应用笔记对您非常有用。

我建议您实现以下功能:

  1. InitCAN - 这应该设置 CAN 的指定波特率。
  2. SetFilters - 大多数 CAN 控制器都带有接收过滤器,所以拥有它是件好事
  3. SendData - 确保您接受 ID_Type 和 RTR 等参数。
  4. RecieveData - 这可以是基于阻塞或中断的。

在开始之前,请阅读 CAN 基础知识以了解。Microchip 的应用笔记AN713AN754是一个很好的来源。还有 Vector 的网站和 Wikipedia 文章。

另外,您可以随时在此处或 Electronics.StackExchange.com 上发表您的疑问 :)

于 2013-03-14T11:57:41.930 回答
1

好的,所以这篇文章已经很老了,但人们可能会再看一遍:首先,Can bus 根本不是像 USART 或 IC2 这样的用户友好协议,所以你必须非常精确地确定你的 can bit 时间,有工具可以解决这个问题,但是我建议您手动计算它们。对于微控制器,我建议使用 STM32 并远离 PIC 系列。如果它只是 CAN-BUS 而没有更高级别的协议(如 SAE J1939),则步骤非常简单直接:

1)初始化罐头

2)将CAN设置为配置模式,记住只能在配置模式下设置波特率,掩码和过滤器!

3) 设置波特率寄存器。

4) 设置掩码和过滤器。如果您需要接收所有消息,只需将掩码设置为 0x00。然后过滤器将不在乎。

5) 将 CAN 设置为正常或环回模式。(环回模式主要用于调试目的。)

人们在一开始尝试实现 can 的一些值得注意的点可能会遗漏: *** 您需要至少 2 个工作 CAN 节点才能成功传输。(当然具有匹配的波特率)。因此,如果您想通过具有 1 个节点的 CAN 发送一些数据,它将不会成功。因为您的发送器节点不会收到 ACK。

*** 您很可能需要一个 CAN 收发器。不要忘记在收发器的 Tx 和 Rx 引脚之间放置一个 100 欧姆或类似值的电阻器。

于 2019-01-24T12:42:01.227 回答
0

当我学习如何使用 hcs12 龙板实现 can 协议时,我使用软件 canking 与 mcp25050 对话。这很有帮助,因为当你上车时,canking 会为你初始化一切,你所要做的就是学习如何写作和接收。如果你想学习如何初始化,步骤是:

  1. 通过设置 CAN 控制寄存器 1 上的位启用 CAN 总线

  2. 使能can初始化控制寄存器0

  3. 通过检查控制寄存器 1 位等到 CAN 总线处于初始化模式

  4. 通过再次设置 CAN 控制寄存器 1 上的位启用 CAN 总线并设置时钟源 - Ethier 总线时钟或 eclock

  5. 使用总线时序寄存器设置预分频器波特率和 Tq

  6. 设置采样时间和 prop_seg1、prop_seg2 和 phase_seg

  7. 在标识符接受寄存器 0-3 或 0-7 上设置接受 id - 设置您的罐头接收所有内容,将它们设置为 00,因为在进行比较时,罐头总线会与进来的 id 进行一个补码比较

  8. 设置标识符掩码寄存器 0-3 或 0-7,如果您不想关心任何位,请将它们全部设置为 FF

  9. 将标识符接受控制寄存器设置为 32 位扩展或 11 位 - 我使用 32

  10. 将控制寄存器 0 设置回正常模式

  11. 通过检查控制寄存器 1 等到总线处于正常模式

在此之后您可以开始更改寄存器或读取数据为此您必须选择空罐缓冲区,写入您的id以写入或请求数据,然后在3个发送器寄存器中输入地址,掩码和值如果写入然后指定dlc(3如果写作,8-1如果阅读)。要传输 id 和数据,您必须将 can 传输标志设置为等于 can 传输缓冲区选择。** 取决于您使用的 id 移位可能会很乏味,因此如果您遇到问题,我建议您调试并查看您的发送缓冲区选择寄存器所保存的内容。我有这个错误是因为我在向 mcp25050 发送消息时没有正确移动

于 2017-12-11T15:09:01.717 回答
0

如果你的 MCU 支持 CAN Bus,你应该从相关的数据表开始。

于 2019-02-15T11:53:12.570 回答