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.

[参考译文] CCS/TM4C123GH6PM:CAN 总线连接--无连接

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605708/ccs-tm4c123gh6pm-can-bus-connection----no-connection

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

工具/软件:Code Composer Studio

我的 CAN 总线连接有问题

TX

#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/utilidio.idio.h"#include "drivers.idio"#include "driverlib/udio.idio.idio"#include "#include "us.trin.tru.idio.mdio"
#include






//
//// simple_tx.c -演示简单 CAN 消息传输的示例。
//
//版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
以源代码和二进制形式重新分发和使用,无论是否
进行//修改,只要
满足以下条件//:
//
重新分发源代码必须保留上述版权
//声明、此条件列表和以下免责声明。
//
//二进制形式的再发行必须复制上述版权
//声明、此条件列表和//

分发随附的//文档和/或其他材料中的以下免责声明。
////
未经

事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
////
本软件由版权所有者和贡献者提供
//“按原样”,不

承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
//所有者或贡献者都不对任何直接、间接、偶然、
//特殊、模范、 或相应的损害(包括但不
限于采购替代产品或服务;丧失使用、
//数据或利润; 或业务中断)、无论

出于何种原因使用
本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
//
//这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
////
*****************


//
//
//! \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); } //********* // //此函数使用简单的轮询方法提供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 (ui32Status = CAN_INT_INTID_STATUS) { // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // 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)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t ui32SysClock; #endif tCANMsgObject sCANMessage; uint32_t ui32MsgData; uint8_t * pui8MsgData; pui8MsgData =(uint8_t *) ui32MsgData; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC) 25000000); #else SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_16MHz | SYSCTL_OSC_MAIN); #endif // //设置用于显示消息的串行控制台。 这是 //仅针对此示例程序,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。 //待办事项:更改此项以匹配您正在使用的端口/引脚 // 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)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) CANBitRateSet (CAN0_BASE、ui32SysClock、50000); #else CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000); #endif // //在 CAN 外设上启用中断。 此示例使用静态 //分配中断处理程序,表示处理程序的名称 //位于启动代码的矢量表中。 如果您想使用动态的 //分配矢量表,然后还必须调用 CANIntRegister() //此处。 // // CANIntRegister (CAN0_BASE、CANIntHandler);// if using dynamic vectors // CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // //在处理器(NVIC)上启用 CAN 中断。 // 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 %02x"、 pui8MsgData[0]、pui8MsgData[1]、pui8MsgData[2]、 pui8MsgData[3]); // //使用对象1发送 CAN 消息(与不一样 // CAN ID、在本例中也是1)。 此函数将导致 //要立即传输的消息。 // CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX); // //现在等待1秒后再继续 // SimpleDelay(); // //检查错误标志以查看是否发生错误 // if (g_bErrFlag) { UARTprintf ("错误-电缆已连接?\n"); } 其他 { // //如果没有错误,则打印已发送消息的计数 // UARTprintf ("总数=%u\n"、g_ui32MsgCount); } // //递增消息数据中的值。 // ui32MsgData++; } // //返回无错误 // 返回(0); }
//
//
// simple_rx.c -演示简单 CAN 消息接收的示例。
//
//版权所有(c) 2010-2017 Texas Instruments Incorporated。  保留所有权利。
//软件许可协议
//
//  以源代码和二进制形式重新分发和使用,有无
//  如果满足以下条件,则允许进行修改
//  满足:
//
//  重新分发源代码必须保留上述版权
//  注意、此条件列表和以下免责声明。
//
//  二进制形式的重新分发必须复制上述版权
//  注意、中的条件列表和以下免责声明
//  随提供的文档和/或其他材料
//  分布。
//
//  德州仪器公司的名称和的名称都不是
//  其贡献者可用于认可或推广衍生产品
//  未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//
//这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
//
//

#include
#include
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.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"
#include "utils/uartstdio.h"
#include "utils/uartstdio.c"

//
//
//! 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 中断次数的计数器
//发生,它应与收到的消息数匹配。
//
//
volatile uint32_t g_ui32MsgCount = 0;

//
//
//中断处理程序指示已接收消息的标志。
//
//
volatile bool g_BRXFlag = 0;

//
//
//指示发生了一些接收错误的标志。
//
//
volatile bool g_BErrFlag = 0;

//
//
//此函数将 UART0设置为用于控制台显示信息
//因为示例正在运行。
//
//
无效
InitConsole (空)

   //
   //启用用于 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);


//
//
//此函数是 CAN 外设的中断处理程序。  它会进行检查
//查找中断原因,并保留所有消息的计数
//已收到。
//
//
void hardware_init (void)

   //将 CPU 时钟设置为40MHz。 400MHz PLL/2 = 200 DIV 5 = 40MHz
   SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);

   //添加 Tiva-C GPIO 设置-启用端口、设置引脚1-3 (RGB)引脚进行输出
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
   GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

   //打开 LED
   GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、4);



无效
CANIntHandler (空)


 hardware_init();
   uint32_t ui32Status;

   //
   //读取 CAN 中断状态以查找中断原因
   //
   ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

   //
   //如果原因是控制器状态中断,则获取状态
   //
   if (ui32Status = CAN_INT_INTID_STATUS)
   {
       //
       //读取控制器状态。  这将返回状态字段
       //可以指示各种错误的错误位。  错误处理
       //本示例中不是为了简单起见。  请参阅
       // API 文档,了解有关错误状态位的详细信息。
       //读取此状态的操作将清除中断。
       //
       //hardware_init();
       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;
   }

   //
   //否则,发生意外导致中断的情况。  这应该是
   //永远不会发生。
   //
   其他
   {
       //
                // hardware_init();       //伪中断处理可以在此处进行。
       //
   }


//
//
//配置 CAN 并输入循环以接收 CAN 消息。
//
//
内部
main (空)


#if defined (target_IS_TM4C129_RA0)||                                        \
   已定义(TARGET_IS_TM4C129_RA1)||                                        \
   已定义(TARGET_IS_TM4C129_RA2)
   uint32_t ui32SysClock;
#endif

   tCANMsgObject sCANMessage;
   uint8_t pui8MsgData[8];

   //
   //将时钟设置为直接从外部晶振/振荡器运行。
   // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
   //您的板上使用的晶体。
   //
#if defined (target_IS_TM4C129_RA0)||                                        \
   已定义(TARGET_IS_TM4C129_RA1)||                                        \
   已定义(TARGET_IS_TM4C129_RA2)
   ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
                                      SYSCTL_OSC_MAIN |
                                      SYSCTL_USE_OSC)
                                      25000000);
其他
   SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);





#endif

   //
   //设置用于显示消息的串行控制台。  这是
   //仅针对此示例程序,CAN 操作不需要。
   //
   InitConsole();

   //
   //对于此示例、CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。
   //您使用的实际端口和引脚可能有所不同,请参阅
   //数据表以了解更多信息。
   // GPIO 端口 B 需要启用、以便可以使用这些引脚。
   // TODO:将其更改为您正在使用的 GPIO 端口
   //
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

   //
   //配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。
   //此步骤选择可用于这些引脚的替代功能。
   //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。
   //请查阅数据表以查看每个引脚分配的函数。
   // TODO:更改此选项以选择您正在使用的端口/引脚
   //
   GPIOPinConfigure (GPIO_PB4_CAN0RX);
   GPIOPinConfigure (GPIO_PB5_CAN0TX);
   //GPIOPinConfigure (GPIO_PE4_CAN0RX);
   //GPIOPinConfigure (GPIO_PE5_CAN0TX);

   //
   //启用 GPIO 引脚上的复用功能。  以上步骤选择
   //可用的备用功能。  此步骤实际上启用
   //这些引脚的替代功能、而不是 GPIO。
   //待办事项:更改此项以匹配您正在使用的端口/引脚
   //
   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)||                                        \
   已定义(TARGET_IS_TM4C129_RA1)||                                        \
   已定义(TARGET_IS_TM4C129_RA2)
   CANBitRateSet (CAN0_BASE、ui32SysClock、50000);
其他
   CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);
#endif

   //
   //在 CAN 外设上启用中断。  此示例使用静态
   //分配中断处理程序,表示处理程序的名称
   //位于启动代码的矢量表中。  如果您想使用动态的
   //分配矢量表,然后还必须调用 CANIntRegister()
   //此处。
   //
   // CANIntRegister (CAN0_BASE、CANIntHandler);// if using dynamic vectors
   //
   CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

   //
   //在处理器(NVIC)上启用 CAN 中断。
   //
   IntEnable (INT_CAN0);
   //hardware_init();
   //
   //启用 CAN 以进行操作。
   //
   CANEnable (CAN0_BASE);

   //
   //初始化用于接收 CAN 消息的消息对象
   //任何 CAN ID。  为了接收任何 CAN ID、ID 和掩码必须同时存在
   //设置为0,并启用 ID 过滤器。
   //
   sCANMessage.ui32MsgID = 0;
   sCANMessage.ui32MsgIDMask = 0;
   sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
   //sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
   sCANMessage.ui32MsgLen = 8;

   //
   //现在将消息对象加载到 CAN 外设中。  加载后
   // CAN 将在总线上接收任何消息,并将发生中断。
   //使用消息对象1接收消息(与不同)
   //此示例中可以是任何值的 CAN ID)。
   //
   CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_RX);
   //hardware_init();
   //
   //输入循环以处理收到的消息。  该循环仅检查一个标志
   //由中断处理程序设置,如果该位置位,则读取
   //消息并显示内容。  这不是一种稳健的方法
   //处理传入的 CAN 数据,并且一次只能处理一条消息。
   //如果多条消息一起接收,则会收到一些消息
   //可能被丢弃。  在实际应用中、应使用其他一些方法
   //对收到的消息进行排队,以确保它们不会丢失。  您
   //也可以使用 CAN FIFO 模式,允许消息为
   //在处理前进行缓冲。
   //
   for (;;)
   {
       unsigned int uIdx;

       //
       //如果该标志被置位、则表示发生了 RX 中断、然后
       //有一条消息可以从 CAN 读取
       //
       //hardware_init();
       if (g_bRXFlag)
       {

           //
           //重复使用之前用于配置的同一消息对象
           //用于接收消息的 CAN。  用于存储的缓冲器
           //还必须提供接收到的数据,所以设置缓冲区指针
           //在消息对象中。
           //
           sCANMessage.pui8MsgData = pui8MsgData;

           //
           //从 CAN 读取消息。  使用1号报文对象
           //(与 CAN ID 不相同)。  中断清除
           //标志未设置、因为中已清除此中断
           //中断处理程序。
           //
           CANMessageGet (CAN0_BASE、1、&sCANMessage、0);

           //
           //清除挂起的消息标志,以便中断处理程序可以
           //在下一条消息到达时再次设置它。
           //
           G_bRXFlag = 0;

           //
           //检查是否有某些消息的指示
           //丢失。
           //
           if (sCANMessage.ui32Flags & MSG_OBJ_DATA_LOST)
           {
               UARTprintf ("检测到 CAN 消息丢失\n");
           }

           //
           //打印接收到的消息的内容。
           //
           UARTprintf ("Msg ID=0x%08X len=%u data=0x"、
                      sCANMessage.ui32MsgID、sCANMessage.ui32MsgLen);
           for (uIdx = 0;uIdx < sCANMessage.ui32MsgLen;uIdx++)
           {
               UARTprintf ("%02x "、pui8MsgData[uIdx]);
           }
           UARTprintf ("total count=%u\n"、g_ui32MsgCount);
       }
   }

   //
   //返回无错误
   //
   返回(0);


Putty 输出:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的问题是什么? 您能简要介绍一下您的问题吗? 到目前为止、您已经执行了哪些调试步骤?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    即使是"多张图片" 也无法提供简单的清晰度、从而完全/正确地描述您的"问题"。    不应该有任何"图片"尝试"说明并更好地支持" 您的观点?   

    我们必须假设您的"无连接"报告是由于您无法接收到 CAN 传输?     (由于 您在打开帖子时将您的问题"仅"置于主题行中(这很难查看)、因此供应商代理"错过"了该事实。   供应商代理必须处理许多此类过帐。)    

    我怀疑您已经在该"插件"实验板插座板上安装了2个 CAN Xcvrs。    您是否曾尝试过 " CAN 通信"的"反向"?   (即 侧面(现在)发送成为接收器-反之亦然。)    如果是这样-问题是否仍然存在-在(两个)方向上?

    当调试(任何)串行类型接口时-查看总线活动的能力被证明是最有用的。   示波器或逻辑分析仪是"首选工具"-尽管您可能能够找到一些(较小的)基于 PC 的分析仪-这将让您对数据的存在和流式有所了解...

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

    请注意、这种原型板因连接不良和间歇性而臭名昭著。 与携带高速信号的鼠窝布线结合在一起可能会使调试变得困难。

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

    请注意、"我们著名的芝加哥老鼠整齐地平行于它们(巢)的连接线束。"   (因此符合严格的"城市建筑法规"。)

    没有提到"两个 LPad 和两个 CAN Xcvrs 是如何供电的!"    在所有工作条件下、电源是否足够?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题是,收银员不工作。 我不确定问题是我的连接问题还是芯片本身问题。我使用其他工具(如 CAN 转 USB)测试了程序。 很不错!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价用户="Magdy Hafez"]问题是,收银员无法工作。[/quot]

    AHA -"不工作!" 现在一切都非常清晰!

    您是否可以描述一下您是如何得出这一结论的?   在您报告"不工作"时、您是否按照先前提供的建议尝试以"反向"进行传输?   除非您滥用这些器件-两个器件的可能性极小、新 CAN Xcvrs 出现故障。

    可能是一个原理图、而不是5张照片、可以更好地"远程诊断?"   包括 Xcvr 的制作者、器件型号也是一种帮助。

    您的原理图和书面说明应该包括如何为两个 LPad 和两个 CAN Xcvrs 供电。

    请更详细地描述(可能是另一个原理图)您如何使用"CAN 转 USB-"进行"测试"、如果这不是"品牌名称"-也提供该"工具"的源供应商和型号。

    可以指出,"不起作用"是"不提供"充分数据的"不起作用"。   无连接-密切关注"不工作"的脚跟-提供可用诊断...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要对我的描述不清楚表示歉意,但有一些原因:这是我第一次使用 CAN 总线,我在几个月前就开始使用 Tiva C,我在社区找不到任何帮助,最后英语不是我的母语。

    我将尝试更确定:我在大学中测试了我的程序,它的价格昂贵,包含嵌入在上面的 MCP2551,整个系统正常工作。 我的板可以发送和接收数据。 但是当我用电路板连接两个收发器时,电路板根本无法检测到它连接到任何东西,我尝试通过 USB-TO-CAN 模块对每个收发器进行直接测试,也不起作用。我有两个建议: 收发器无法正常工作、或者我无法正确连接收发器。 很抱歉,我没有这么清楚,但我在资源非常差的环境中工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感受您的痛苦-但请理解-您的"帮助者"是远程的-并完全依赖您的清晰详细解释。   (因此、作为诊断辅助、"无连接"故障严重...)

    您是否能够生成原理图(即使用一只手绘制、然后扫描)?   这是一项关键要求。

    您是否考虑过查看"昂贵屏蔽 w/MCPx"的原理图、然后将该原理图用作您自己实施的基础(模型)?

    了解照片(即使是高质量的照片)提供了有关实际连接的"无线索"、甚至是 CAN 收发器的"供电"(故障)。

    您可能会注意到、"为资源而挨饿"通常需要"更详细的信息"、而简单的原理图证明了最有效的计数器、甚至是资源限制。   (注意:您的问题是"无连接"-但您对这些连接(任何)没有提供任何/零的见解。)    您学校的某个人应该能够帮助您创建原理图-这(将证明)尤其"资源丰富!"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    EK-TM4C123GXL 和原型板之间是否有接地线? 您如何为收发器供电? 具有直流失调电压可能会导致收发器看不到正确的电平。 也许您可以提供所连接内容的原理图。