CAN总线协议实现

问题描述 投票:5回答:4

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

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

谢谢

serial-communication can-bus lpc
4个回答
5
投票

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

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

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

我建议你实现以下功能:

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

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

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


1
投票

好的,所以这篇文章已经很老了,但人们可能会再次看一遍:首先,Can总线不是像USART或IC2这样的用户友好协议,所以你必须非常准确地说明你的可用时间有工具但是我建议你手工计算它们。对于微控制器,我建议使用STM32并且在我看来远离PIC系列。如果它只是没有更高级别协议的CAN-BUS,例如SAE J1939,那么步骤非常简单直接:

1)初始化Can

2)将CAN置于配置模式,并记住只能在配置模式下设置波特率,模板和滤波器!

3)设置波特率寄存器。

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

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

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

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


0
投票

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

  1. 通过设置CAN控制寄存器1的位使能总线
  2. 启用可以初始化控制寄存器0
  3. 通过检查控制寄存器1位,等待总线处于初始化模式
  4. 通过再次设置CAN控制寄存器1上的位来启用总线,并设置时钟源 - Ethier总线时钟或eclock
  5. 使用总线定时寄存器设置预分频器波特率和Tq
  6. 设置采样时间和prop_seg1,prop_seg2和phase_seg
  7. 在标识符接受寄存器0-3或0-7上设置接受ID - 设置你的罐头接收所有设置为00的东西,因为在进行比较时,can总线做了一个补码比较进入的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发送消息时,我没有正确转移


0
投票

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.