CAN总线协议实现

时间:2013-03-03 18:46:57

标签: serial-communication can-bus lpc

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

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

由于

4 个答案:

答案 0 :(得分:5)

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

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

This恩智浦的应用说明对您非常有用。

我建议你实现以下功能:

  1. InitCAN - 应该设置CAN的指定波特率。
  2. SetFilters - 大多数CAN控制器都带有验收滤波器,所以很高兴
  3. SendData - 确保您接受ID_Type和RTR等参数。
  4. RecieveData - 这可以是阻止或基于中断。
  5. 在开始之前,请先阅读CAN Basics以了解。 Microchip的应用笔记AN713AN754是一个很好的来源。也是Vector的网站和维基百科文章。

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

答案 1 :(得分:1)

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

1)初始化罐子

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

3)设置波特率寄存器。

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

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

人们一开始尝试实现的一些显着点可能会错过:    ***您至少需要2个正常工作的CAN节点才能成功传输。 (当然具有匹配的波特率)。因此,如果您想通过具有1个节点的CAN发送一些数据,将不会成功。因为您的发射机节点将不会收到ACK。

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

答案 2 :(得分:0)

当我学习如何使用hcs12 dragonboard实现can协议时,我使用软件canking与mcp25050交谈。它帮助很大,因为当你上车时,canking会为你初始化一切,你所要做的就是学习如何写和接收。如果您想了解如何初始化步骤:

  1. 通过设置CAN控制寄存器1上的位

  2. 启用can总线
  3. 启用可以初始化控制寄存器0

  4. 通过检查控制寄存器1位

  5. 等待总线处于初始化模式
  6. 通过再次设置CAN控制寄存器1上的位来启用can总线并设置时钟源 - Ethier总线时钟或eclock

  7. 设置预分频器波特率和Tq与总线定时寄存器

  8. 设置采样时间和prop_seg1,prop_seg2和phase_seg

  9. 在标识符接受寄存器0-3或0-7上设置接受ID - 设置你的罐头接收所有设置为00的东西,因为在进行比较时,can总线做了一个补码比较来自的id

  10. 设置标识符掩码寄存器0-3或0-7,如果你不在乎任何位将它们全部设置为FF

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

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

  13. 通过检查控制寄存器1

  14. 等待总线进入正常模式

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

答案 3 :(得分:0)

如果您的MCU支持CAN总线,则应从相关的数据表开始。