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.

[参考译文] TM4C123GH6PM:CAN 协议

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/615710/tm4c123gh6pm-can-protocol

器件型号:TM4C123GH6PM
主题中讨论的其他器件:SN65HVD232

大家好、

我已经尝试了 TivaWare_C_Series-2.1.2.111中的简单发送器和接收器程序。但我遇到了一些有关   UARTprintf 和 UARTStdioConfig 语句的错误。因此、我删除了这两行。

在程序本身中、我们必须添加  INT_CAN0 - CANIntHandler。 添加此语句后、出现错误。因此、我也删除了此行。

现在该程序没有错误、但当我将 PB4和 PB5与其他板 LED 的 PB5和 PB4连接时、它不会发光。

我附上了下列方案。

e2e.ti.com/.../8831.simple_5F00_tx.ce2e.ti.com/.../2158.simple_5F00_rx.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CAN 通信链路的(两端)通常需要一个"CAN 收发器和端接电阻器"。 在没有这些组件的情况下、大多数"直接连接"的尝试都会报告失败、如下所示。

    IIRC -当 CAN TX 线被"拉高"时、出现了几个(很少)"成功报告"(@降低了比特率)。 强烈建议使用收发器和终端电阻器...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Abhishek Dutta"]现在程序没有错误,但当我将 PB4和 PB5与其他板 LED 的 PB5和 PB4连接时,该程序不会亮起。

    CAN 需要收发器(具有适当的布线和端接)。

    CAN 要求发送器件的接收线路看到输出、以便它可以验证输出。 否则、它将报告错误并停止发送。

    Robert

    BTW:不会下载文件以查看源代码。 使用粘贴代码 选项

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

    您好、先生、

    我粘贴了以下代码:-

    简单发送器
    
    
    
    #include 
    #include 
    #include "inc/hw_ca.h"
    #include "include/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/ca.h"
    #include "driverlib/ca.c"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/driverlib.udio.h"#include "driverlib/us.pne.h
    
    
    
    
    
    //
    //! \addtogroup CAN_examples_list
    //! 

    简单 CAN TX (simple_tx)

    //! //! 此示例显示了 CAN 的基本设置、以便传输消息 //! 总线上的电流。 CAN 外设配置为发送消息 //! 具有特定的 CAN ID。 然后每秒传输一条消息 、//! 使用简单的延迟环路进行计时。 发送的消息是4 //! 包含递增模式的字节消息。 A CAN 中断 //! 处理程序用于确认消息传输并计数 //! 已发送的消息。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - CAN0外设 //! - GPIO 端口 B 外设(用于 CAN0引脚) //! - CAN0RX - PB4 //! - CAN0TX - PB5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 CAN 的运行不需要这些参数。 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! - INT_CAN0 - CANIntHandler // /********* // // //跟踪 TX 中断次数 的计数器//发生,该计数器应与发送的 TX 消息数匹配。 //// ***************** 易失性 uint32_t g_ui32MsgCount = 0; //********* // //指示发生了一些传输错误的标志。 //// ***************** volatile bool g_BErrFlag = 0; //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // 为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // 启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // 使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC); // 为这些引脚选择备用(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // 初始化控制台 I/O 的 UART // // UARTStdioConfig (0、115200、16000000); UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、 115200、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); } //********* // //此函数使用简单的轮询方法提供1秒延迟。 //// ***************** void SimpleDelay (void) { // // 1秒延迟周期 // SysCtlDelay (16000000 / 3); } //********* // //此函数是 CAN 外设的中断处理程序。 它会检查 //中断原因,并保持 //已传输的所有消息的计数。 //// ***************** void CANIntHandler (void) { uint32_t ui32Status; // 读取 CAN 中断状态以查找中断原因 // ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST); // 如果原因是控制器状态中断,则获取状态 // if (ui32_base、CAN_INT_STATUS = // CANT_INT_INT_INT_ININT )。 这将返回一个状态 //错误位字段,该字段可以指示各种错误。 为 简单起见、本示例中未执行错误处理//。 有关 错误状态位的详细信息、请参阅// API 文档。 //读取此状态的操作将清除中断。 如果 // CAN 外设未与其它 CAN 器件 //存在 的 CAN 总线连接,则会发生错误,并在//控制器状态中指示。 // ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL); // 设置一个标志来指示可能发生的某些错误。 // g_bErrFlag = 1; } // 检查原因是否为消息对象1,我们将使用该对象 来//发送消息。 // 否则、如果(ui32Status = 1) { // //到达此点意味着 TX 中断发生在 //消息对象1上、且消息 TX 完成。 清除 //消息目标中断。 // CANIntClear (CAN0_BASE、1); // 递增计数器以跟踪 已发送的消息数//。 在实际应用中、这可用于将标志设置为 //指示何时发送消息。 // g_ui32MsgCount++; // //自从发送消息以来,清除任何错误标志。 // g_bErrFlag = 0; } // 否则,意外的情况会导致中断。 这应该 //永远不会发生。 // 否则 { // ////杂散中断处理可以转到此处。 // } //********* // //配置 CAN 并输入循环以传输周期性 CAN 消息。 //// ***************** int main (void) { #if defined (target_is_TM4C129_RA0)||\ defined (target_is_TM4C129_RA1)||\ defined (target_is_TM4C129_RA2) uint32_t ui32SysClock; #endif tMsgObject sCANMessage;Uint32_uiMsuuu82u/ uiuiuiuut 直接从外部晶体计时;uint8_u32uiMsg8_ui_uuuuuuuuui32/ uint8 *到 uiuiuiuiu32ui_uiuiuiui_uuuuuuuuuui32/ uui // TODO:必须更改 SYSCTL_XTAL_值以匹配 电路板上//晶体的值。 // #if defined (target_IS_TM4C129_RA0)||\ defined (target_IS_TM4C129_RA1)||\ defined (target_IS_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz)| SYSCTL _SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_SET_UST_SYSC_UST_SYSC_SC_UST_SYSC_UST_SYSC_SC_UST_SYSC_SC_UST_SYSC/ #SYSC_SC_UST_SYSC_SC_UST_SYSC_SET_UST_SYSC/#SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_SET 这只是 针对这个示例程序的//、而 CAN 操作不需要。 // InitConsole(); // 对于本示例,CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。 //您的器件上使用的实际端口和引脚可能不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您使用的任何 GPIO 端口 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // 配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。 //此步骤选择可用于这些引脚的替代功能。 //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。 //请查阅数据表以查看每个引脚分配的函数。 // TODO:将此选项更改为选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PB4_CAN0RX); GPIOPinConfigure (GPIO_PB5_CAN0TX); // 启用 GPIO 引脚上的备用功能。 以上步骤选择 //可用的备用功能。 这一步实际上启用 了这些引脚的//替代功能、而不是 GPIO。 // TODO:更改此值以匹配您使用的端口/引脚 // GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5); // 已为 CAN 设置 GPIO 端口和引脚。 必须 启用 CAN 外设//。 // SysCtlPeripheralEnable (SYSCTL_Periph_CAN0); // 初始化 CAN 控制器 // CANInit (CAN0_BASE); // 设置 CAN 总线的位速率。 此函数为 标称配置设置 CAN //总线时序。 如果 需要,可以使用函数 CANBitTimingSet()代替这个函数//来实现对 CAN 总线时序的更多控制。 //在此示例中、CAN 总线设置为500kHz。 在下面的函数中、 //对 SysCtlClockGet ()或 ui32SysClock 的调用被用来确定 用于为 CAN 外设计时的//时钟速率。 如果您知道系统时钟的值、可以//替换为固定值、 //保存额外的函数调用。 对于某些器 件、CAN 外设采用固定的8MHz 时钟、与系统时钟无关。在这种情况下//对 SysCtlClockGet ()或 ui32SysClock 的调用应替换为// 80000。 有关 CAN //外设时钟的更多信息、请参阅数据表。 // #if defined (target_IS_TM4C129_RA0)||\ defined (target_IS_TM4C129_RA1)||\ defined (target_IS_TM4C129_RA2) CANCtlRateSet (CAN0_BASE、ui32SysClock、500000); #else SysBitRateSet (CANBit0_BASE、CANClockGet) 500000); #endif // //在 CAN 外设上启用中断。 此示例使用静态 //分配中断处理程序、这意味着处理程序的名称 //位于启动代码的矢量表中。 如果要使用 矢量表的动态//分配,则还必须在 此处调用 CANIntRegister()//。 // // CANIntRegister (CAN0_BASE、CANIntHandler);//如果使用动态矢量 // CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // 启用处理器上的 CAN 中断(NVIC)。 // IntEnable (INT_CAN0); // 启用 CAN 以进行操作。 // CANEnable (CAN0_BASE); // 初始化将用于发送 CAN //消息的消息对象。 消息将是包含一 个递增//值的4个字节。 最初它将设置为0。 // ui32MsgData = 0; sCANMessage.ui32MsgID = 1; sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE; sCANMessage.ui32MsgLen = sizeof (pui8MsgData); sCANMessage.pui8MsgData = pui8MsgData; // 输入用于发送消息的循环。 每 //秒将发送一条新消息。 4个字节的消息内容将被视为一个 uint32_t //并且每次递增1。 // while (1) { // //将一条消息打印到控制台,显示消息计数和 所发送消息的//内容。 // /* UARTprintf ("发送消息:0x%02x %02x %02x %02x"、 pui8MsgData[0]、pui8MsgData[1]、pui8MsgData[2]、 pui8MsgData[3]);*/ UARTCharPut (UART0_BASE、 pui8MsgData[0]); UARTCharPut (UART0_BASE、pui8MsgData[1]); UARTCharPut (UART0_BASE、pui8MsgData[2]); UARTCharPut (UART0_BASE、pui8MsgData[3]); // 使用对象1发送 CAN 消息(与 // CAN ID 不同、在本例中也是1)。 此功能将导致 //立即传输消息。 // CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX); // 现在等待1秒后再继续 // SimpleDelay (); // UARTCharPut (UART0_BASE、g_ui32MsgCount); // 检查错误标志以查看是否发生错误 (UART0_BASE);// UART0_ERROR (UARTBEn);// UARTBE_ERROR 否则 { // ////如果没有错误,则打印已发送消息的计数 // UARTCharPut (UART0_BASE,g_ui32MsgCount); // UARTprintf ("总数=%u\n",g_ui32MsgCount); } // 递增消息数据中的值。 // ui32MsgData++; } // 返回无错误 // } 简单接收器 #include #include #include "inc/hw_ca.h" #include "include/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/ca.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/driverlib.idio.h"#include "driverlib/driverlib"#include "driverlib.udio.idio.h // //! \addtogroup CAN_examples_list //!

    简单 CAN RX (simple_Rx)

    //! //! 此示例显示了 CAN 的基本设置、以便接收消息 //! 总线的电流。 CAN 外设配置为接收消息 //! 使用任何 CAN ID、然后将消息内容打印到控制台。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - CAN0外设 //! - GPIO 端口 B 外设(用于 CAN0引脚) //! - CAN0RX - PB4 //! - CAN0TX - PB5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 CAN 的运行不需要这些参数。 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! - INT_CAN0 - CANIntHandler // /********* // // //跟踪 RX 中断次数 的计数器//发生,该计数器应与接收到的消息数匹配。 //// ***************** 易失性 uint32_t g_ui32MsgCount = 0; //********* // //中断处理程序的标志,指示已收到消息。 //// ***************** 易失性 bool g_BRXFlag = 0; //********* // //指示发生了一些接收错误的标志。 //// ***************** volatile bool g_BErrFlag = 0; //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // 为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // 启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // 使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC); // 为这些引脚选择备用(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // 初始化控制台 I/O 的 UART // // UARTStdioConfig (0、115200、16000000); UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、 115200、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); } //********* // //此函数是 CAN 外设的中断处理程序。 它会检查 //中断原因,并对 所有已接收到的消息进行计数。 //// ***************** void CANIntHandler (void) { uint32_t ui32Status; // 读取 CAN 中断状态以查找中断原因 // ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST); // 如果原因是控制器状态中断,则获取状态 // if (ui32_base、CAN_INT_STATUS = // CANT_INT_INT_INT_ININT )。 这将返回一个状态 //错误位字段,该字段可以指示各种错误。 为 简单起见、本示例中未执行错误处理//。 有关 错误状态位的详细信息、请参阅// API 文档。 //读取此状态的操作将清除中断。 // ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL); // 设置一个标志来指示可能发生的某些错误。 // g_bErrFlag = 1; } // 检查原因是否为消息对象1,我们将使用该对象 来接收消息。 // 否则、如果(ui32Status = 1) { // //到达此点意味着 RX 中断发生在 //消息对象1上、并且消息接收完成。 清除 //消息目标中断。 // CANIntClear (CAN0_BASE、1); // 递增计数器以跟踪 已接收到多少条消息//。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // g_ui32MsgCount++; // 设置标志以指示接收到的消息正暂挂。 // g_bRXFlag = 1; // //自从收到消息后,清除任何错误标志。 // g_bErrFlag = 0; } // 否则,意外的情况会导致中断。 这应该 //永远不会发生。 // 否则 { // ////杂散中断处理可以转到此处。 // } //********* // //配置 CAN 并输入一个循环来接收 CAN 消息。 //// ***************** int main (void) { #if defined (target_is_TM4C129_RA0)||\ defined (target_is_TM4C129_RA1)||\ defined (target_is_TM4C129_RA2) uint32_t ui32SysClock; #endif tMsgObject sCANMessage;uint8_TM4C129_RA2) uint32 ui32_t ui32SysClock ;#endif tMsgObjectsCANMessage;uint8_t 直接从外部振荡器/ ui20/ ui20u/u82u/ u/u // TODO:必须更改 SYSCTL_XTAL_值以匹配 您电路板上使用的//晶体的值。 // #if defined (target_IS_TM4C129_RA0)||\ defined (target_IS_TM4C129_RA1)||\ defined (target_IS_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz)| SYSCTL _SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_SET_UST_SYSC_UST_SYSC_SC_UST_SYSC_UST_SYSC_SC_UST_SYSC_SC_UST_SYSC/ #SYSC_SC_UST_SYSC_SC_UST_SYSC_SET_UST_SYSC/#SYSC_UST_SYSC_UST_SYSC_UST_SYSC_UST_SYSC_SET 这只是 针对这个示例程序的//、而 CAN 操作不需要。 // InitConsole(); // 对于本示例,CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。 //您的器件上使用的实际端口和引脚可能不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您使用的任何 GPIO 端口 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // 配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。 //此步骤选择可用于这些引脚的替代功能。 //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。 //请查阅数据表以查看每个引脚分配的函数。 // TODO:将此选项更改为选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PB4_CAN0RX); GPIOPinConfigure (GPIO_PB5_CAN0TX); // 启用 GPIO 引脚上的备用功能。 以上步骤选择 //可用的备用功能。 这一步实际上启用 了这些引脚的//替代功能、而不是 GPIO。 // TODO:更改此值以匹配您使用的端口/引脚 // GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5); // 已为 CAN 设置 GPIO 端口和引脚。 必须 启用 CAN 外设//。 // SysCtlPeripheralEnable (SYSCTL_Periph_CAN0); // 初始化 CAN 控制器 // CANInit (CAN0_BASE); // 设置 CAN 总线的位速率。 此函数为 标称配置设置 CAN //总线时序。 如果 需要,可以使用函数 CANBitTimingSet()代替这个函数//来实现对 CAN 总线时序的更多控制。 //在此示例中、CAN 总线设置为500kHz。 在下面的函数中、 //对 SysCtlClockGet ()或 ui32SysClock 的调用被用来确定 用于为 CAN 外设计时的//时钟速率。 如果您知道系统时钟的值、可以//替换为固定值、 //保存额外的函数调用。 对于某些器 件、CAN 外设采用固定的8MHz 时钟、与系统时钟无关。在这种情况下//对 SysCtlClockGet ()或 ui32SysClock 的调用应替换为// 80000。 有关 CAN //外设时钟的更多信息、请参阅数据表。 // #if defined (target_IS_TM4C129_RA0)||\ defined (target_IS_TM4C129_RA1)||\ defined (target_IS_TM4C129_RA2) CANCtlRateSet (CAN0_BASE、ui32SysClock、500000); #else SysBitRateSet (CANBit0_BASE、CANClockGet) 500000); #endif // //在 CAN 外设上启用中断。 此示例使用静态 //分配中断处理程序、这意味着处理程序的名称 //位于启动代码的矢量表中。 如果要使用 矢量表的动态//分配,则还必须在 此处调用 CANIntRegister()//。 // // CANIntRegister (CAN0_BASE、CANIntHandler);//如果使用动态矢量 // CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // 启用处理器上的 CAN 中断(NVIC)。 // IntEnable (INT_CAN0); // 启用 CAN 以进行操作。 // CANEnable (CAN0_BASE); // 初始化用于接收带有 //任意 CAN ID 的 CAN 报文的报文对象。 为了接收任何 CAN ID、ID 和掩码必须同时 //设置为0、并且 ID 滤波器被启用。 // sCANMessage.ui32MsgID = 0; sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; sCANMessage.ui32MsgLen = 8; // 现在将消息对象加载到 CAN 外设中。 加载后 、// CAN 将在总线上接收任何消息、并将发生中断。 //使用消息对象1接收消息(这与 // CAN ID 不同,在本示例中可以是任意值)。 // CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_RX); // 输入循环以处理接收到的消息。 这个循环只检查 一个由中断处理程序设定的标志//、如果被设定、它读取 //消息并显示内容。 这不是 一种用于//处理传入 CAN 数据的可靠方法,并且一次只能处理一条消息。 //如果收到的消息太多,则可能 会丢失一些消息//。 在实际应用中、应使用其他一些方法 //对收到的消息进行排队、以确保它们不会丢失。 您 //也可以使用 CAN FIFO 模式,该模式允许 //缓冲消息,然后再处理它们。 // for (;;) { unsigned int uIdx; // //如果标志被置位、这意味着发生了 RX 中断并且 //有一条消息准备从 CAN 读取 // if (g_bRXFlag) { // //重复使用之前用来配置 // CAN 接收消息的同一个消息对象。 还必须提供一个用于存储//接收数据的缓冲区,因此在 报文对象内设置缓冲区指针//。 // sCANMessage.pui8MsgData = pui8MsgData; // 从 CAN 读取消息。 使用1号报文对象 //(与 CAN ID 不同)。 中断清除 //标志未置1、因为中断 已在//中断处理程序中清除。 // CANMessageGet (CAN0_BASE、1、&sCANMessage、0); // 清除挂起的消息标志,以便中断处理程序可以 //在下一条消息到达时再次设置它。 // g_bRXFlag = 0; // //检查是否有表明某些消息 丢失的迹象。 // if (sCANMessage.ui32Flags & MSG_obj_data_lost) { // UARTprintf ("CAN 消息丢失被检测到\n"); UARTCharPut (UART0_BASE、'E'); } // 打印接收到的消息的内容。 // // UARTprintf ("Msg ID=0x%08X len=%u data=0x"、 // sCANMessage.ui32MsgID、sCANMessage.ui32MsgLen); UARTCharPut (UART0_BASE、sCANMessage.ui32MsgID); UARTCharPut (UART0_BASE、sCANMessage.ui32MsgLen); for (uIdx = 0;uIdx < sCANMessage.ui32MsgLen;uIdx++) { // UARTprintf ("%02x "、pui8MsgData[uART32]);UART32n/ UARTn (uatrum_u返 工 计数 );UART0/ UARTn_uiCounts (uategrum/uature/uature/uum/uature/uum/uature/uum/uum/uature/uum/uum/u返 工计数)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以及收发器、电缆和终端器?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在两个电路板的 PB4和 PB5之间连接了147欧姆电阻器。 然后、我将 PB4连接到 PB4、将 PB5连接到 PB5、以实现电路板之间的通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要收发器和终端器以及正确的布线。 没有快捷方式。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    先生,您能告诉我应该使用哪种转接接收器和终结器吗? 以及如何连接电路板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是一个提供了大量详细信息的应用手册。 简单的答案是总线两端的120欧姆终端器和 SN65HVD232等 CAN 收发器  
    www.ti.com/.../sloa101b.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob 为您提供了有关收发器和终端的建议。

    要进行原型设计、最简单易用的电缆是以太网电缆。 对于生产、首选电缆是专用于 CAN 的电缆、例如用于 Devicenet 或 SDS 的电缆。

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

    这意味着 SIR PB4和 PB5应连接到 SN65HVD32D 的 D 和 R 引脚、PB4和 PB5之间的电阻为120欧姆。

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

    PB4 (CAN0Rx)应连接到 R、PB5 (CAN0Tx)应连接到 D。 CANH 和 CANL 连接到双线 CAN 总线。 然后将一个120欧姆电阻器连接到 CAN 总线的每一端。 总线上至少需要两个节点、以便不同的节点可以确认第一个节点传输的内容。

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

    尊敬的先生,

    我需要电缆进行原型设计、但在市场上、我只有下面提到的以太网电缆。 因此、我不理解如何在我的应用中使用这种类型的电缆。请指导我并告诉我应该为我的应用购买哪种类型的以太网电缆。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    虽然对于某些使用 CAN 的标准(例如 NMEA2000)有特定的电缆和连接器要求、但对于通用 CAN 没有特定要求。 我经常使用带有双绞线的9针 D 型连接器。 请查看此链接以查看示例: en.wikipedia.org/.../CAN_bus
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以购买不带插头的电缆、但为了快速终止、购买附带插头的接插线电缆可能会更便宜。

    您有两个选项

    1. 购买相关插座并将其导入。 优点是电缆易于连接且很难断开。 缺点是插头组装可能有点难设置。 不过、这可能是最佳路线。 您还需要确定对连接的引脚。 许多网络参考中都提供了连接图、可帮助您解决这一问题。
    2. 切断插头并直接用电线连接一对。 优点、易于连接。 缺点是它是永久性的、导线很容易断开。

    不要忘记终结器。

    Robert