This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Tiva-C CAN 通信无法正常工作

Guru**** 2609955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/763497/tiva-c-can-communication-not-working

您好,

我尝试在 CAN 上发送一些内容、但它不起作用。 我已经放置了用于监控 TX 引脚 PB5的示波器、信号固定为3.3V、不发送串行信号。

我的代码如下:

//
//
// simple_tx.c -演示简单 CAN 消息传输的示例。
//
//版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//

#include
#include
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/CAN.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"

//
//
//跟踪 TX 中断次数的计数器
//发生,它应与发送的 TX 消息数匹配。
//
//
volatile uint32_t g_ui32MsgCount = 0;

//
//
//指示发生了某些传输错误的标志。
//
//
volatile bool g_BErrFlag = 0;


//
//
//此函数使用简单的轮询方法提供1秒的延迟。
//
//
无效
SimpleDelay (空)

SysCtlDelay (16000000 / 3);

//
//
//此函数是 CAN 外设的中断处理程序。 它会进行检查
//查找中断原因,并保留所有消息的计数
//已传输。
//
//
无效
CANIntHandler (空)

uint32_t ui32Status;

ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

if (ui32Status = CAN_INT_INTID_STATUS)

ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);

G_bErrFlag = 1;

否则、如果(ui32Status = 1)

CANIntClear (CAN0_BASE、1);

G_ui32MsgCount++;

G_bErrFlag = 0;

其他


//
//
//配置 CAN 并输入循环以传输周期性 CAN 消息。
//
//
内部
main (空)

tCANMsgObject sCANMessage;
uint32_t ui32MsgData;
uint32_t TX_cnt;
uint32_t rx_cnt;
uint8_t * pui8MsgData;

pui8MsgData =(uint8_t *) ui32MsgData;

SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinConfigure (GPIO_PB4_CAN0RX);
GPIOPinConfigure (GPIO_PB5_CAN0TX);

GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5);

SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);

CANInit (CAN0_BASE);

CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);

CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

IntEnable (INT_CAN0);

CANEnable (CAN0_BASE);

ui32MsgData = 0;

sCANMessage.ui32MsgID = 0x101;
sCANMessage.ui32MsgIDMask = 0;
sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sCANMessage.ui32MsgLen = sizeof (pui8MsgData);
sCANMessage.pui8MsgData = pui8MsgData;

while (1)

CANErrCntrGet (CAN0_BASE、&TX_cnt、&RX_cnt);

CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX);

SimpleDelay();

ui32MsgData++;

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否通过 CAN 收发器将器件连接到 CAN 网络、且网络中至少有两个节点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    蔡国荣、

    是的、我已将 CAN Rx 和 TX 连接到 CAN 收发器、但仍然没有连接。
    如何知道问题是收发器而不是我的应用程序?

    当我调试应用程序时,程序会在第一次发送状态寄存器后发生中断,其值= 229 (0b11100101) ,并且从数据表中我了解到这些位意味着(BUS OFF,错误计数器> 96,错误报告状态,0, 0,最后3位=位0错误)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    CAN 协议指定发送和接收错误计数器。 错误计数器从零开始、并且递增(发生错误时)和递减(发生成功的 TX/Rx 时)。 当总线关闭位置位时、意味着控制器从总线关闭。

    我建议您获取 CAN 模块的 simple_tx 和 simple_Rx 示例、并在 CAN 网络中的两个单独节点上运行它们。 这两个示例证明是有效的。 许多客户从 CAN 网络中的这两个示例开始。 如果这两个示例发生故障、则可能是收发器连接出现了问题。 您可能需要检查 CAN 总线上是否有合适的端接电阻器。 如果这两个示例有效、则可以将这些示例与您自己的代码进行比较、并查看差异所在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已更改 CAN 收发器。 我现在使用 MCP2551 CAN 收发器、并且能够很好地处理我的代码。

    感谢 Charles 的支持。

    此致、

    雷达