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.

[参考译文] TMS320F28379D:CAN_EXTERNAL_Transmit 代码不能与(CANTXA、CANRXA)引脚一起使用已更改为(GPIO19和 GPIO18)

Guru**** 2525970 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/780470/tms320f28379d-can_external_transmit-code-not-working-with-changed-cantxa-canrxa-pin-to-gpio19-and-gpio18

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE
//######################################################################################################################
//
////文件:CAN_external_transmit。c
//
//标题:演示 CAN 外部传输的示例
//
! addtogroup cpu01_example_list
//! 

CAN-A 至 CAN-B 外部发送(CAN_EXTERNAL_Transmit)

//! //! 此示例初始化 CAN 模块 A 和 CAN 模块 B 的外部 //! 通信。 CAN-A 模块被设置为传输"n"的递增数据 //! 到 CAN-B 模块的次数、其中"n"为 TXCOUNT 的值。 //! CAN-B 模块设置为在 //! 接收数据。 如果传输的数据不 是//! 匹配接收到的数据。 //! //! 注意设备上的两个 CAN 模块都需要是 //! 通过 CAN 收发器相互连接。 //! //! b 外部连接\n //! - CANA 位于 GPIO31 (CANTXA)和 GPIO30 (CANRXA)// ! - CANB 位于 GPIO8 (CANTXB)和 GPIO10 (CANRXB)// ! //! b 监视\b 变量\n //! - TXCOUNT -调整以设置要传输的消息数 //! - txMsgCount -发送消息数的计数 器//! - rxMsgCount -接收到的消息数的计数 器//! - txMsgData -一个包含正在发送数据的数组 //! - rxMsgData -包含接收到的数据的数组 //! -errorFlag -指示发生错误 的标志//! // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V200 $// $发行 日期:星期二6月21日13:00:02 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" //设备头文件和示例包括文件 #include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ca.h" #include "driverlib/ca.h" // define TXCOUNT 100 #define unsigned_data_length 8 #define TX_MSG_OBJ_ID 1 #RX_CODE"// define 32 volatile Msgt_int_0 = 32;volatile t_int_unsignatile ms_ut_uint_uint_e_dex 32;volatile msg32 = volatile t_int_int_int_int_int_int_int_int_int_int_int_int_int_int_integ_int_int_intsq_int_ unsigned char rxMsgData[4]; tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; // //函数原型 // __interrupt void canbISR (void); // Main // void main (void) { // //初始化系统控制: // PLL、安全装置、启用外设时钟 // InitSysCtrl(); // //初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚 //在模块 A 和 B 上 // InitGpio(); // //为 CAN-A TX/RX 和 CAN-B TX/RX 设置 GPIO 引脚多路复用器 // GPIO_SetupPinMux (18、GPIO_MUX_CPU1、3);//GPIO30 - CANRXA GPIO_SetupPinOptions (18、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (19、GPIO_MUX_CPU1、3);//GPIO31 - CANTXA GPIO_SetupPinOptions (19、GPIO_OUTPUT、GPIO_PushPull); GPIO_SetupPinMux (10、GPIO_MUX_CPU1、2);//GPIO10 - CANRXB GPIO_SetupPinOptions (10、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (8、GPIO_MUX_CPU1、2);//GPIO8 - CANTXB GPIO_SetupPinOptions (8、GPIO_OUTPUT、GPIO_PushPull); // //初始化 CAN 控制器 // CANInit (CANA_base); CANInit (CANB_BASE); // //设置可以从 PLL 输出时钟计时 // CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟 CANClkSourceSelect (CANB_BASE、0);// 500kHz CAN 时钟 // //为每个模块将 CAN 总线位速率设置为500kHz //此函数为标称配置设置 CAN 总线时序。 //您可以使用实现对 CAN 总线时序的更多控制 //函数 CANBitTimingSet()代替这个函数(如果需要)。 //此外、请查阅器件数据表以了解更多相关信息 // CAN 模块计时。 // CANBitRateSet (CANA_base、200000000、50000); CANBitRateSet (CANB_BASE、200000000、50000); // //在 CAN B 外设上启用中断。 // CANIntEnable (CANB_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // //清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态为禁用所有 PIE 中断和标志 //被清除。 // InitPieCtrl(); // //禁用 CPU 中断并清除所有 CPU 中断标志 // IER = 0x0000; IFR = 0x0000; // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 //这将填充整个表,即使是中断也是如此 //在本例中未使用。 这对于调试很有用。 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 //此文件中的 ISR 函数。 //这在 PIE 矢量表中注册中断处理程序。 // EALLOW; PieVectTable.CANB0_INT = CANbISR; EDIS; // //在处理器(PIE)上启用 CAN-B 中断。 // PieCtrlRegs.PIEIER9.bit.INTx7=1; IER |= M_INT9; EINT; // //启用 CAN-B 中断信号 // CANGLALIntEnable (CANB_BASE、CAN_GLB_INT_CANINT0); // //初始化用于发送 CAN 消息的发送消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 消息对象标志:无 // 消息数据长度:4字节 // 报文发送数据:txMsgData // sTXCANMessage.ui32MsgID = 0x319; sTXCANMessage.ui32MsgIDMask = 0; sTXCANMessage.ui32Flags = 0; sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sTXCANMessage.pucMsgData = txMsgData; // //初始化用于接收 CAN 消息的接收消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 报文对象标志:接收中断 // 消息数据长度:4字节 // 消息接收数据:rxMsgData // sRXCANMessage.ui32MsgID = 0x319; sRXCANMessage.ui32MsgIDMask = 0; sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE; sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sRXCANMessage.pucMsgData = rxMsgData; CANMessageSet (CANB_BASE、RX_MSG_OBJ_ID、sRXCANMessage、 MSG_OBJ_TYPE_RX); // //初始化要发送的发送消息对象数据缓冲区 // txMsgData[0]= 0x12; txMsgData[1]= 0x34; txMsgData[2]= 0x56; txMsgData[4]= 0x78; txMsgData[5]= 0x78; txMsgData[6]= 0x78; txMsgData[7]= 0x78; // //启动 CAN 模块 A 和 B 操作 // CANEnable (CANA_base); CANEnable (CANB_BASE); // //将消息从 CAN-A 发送到 CAN-B // 对于(I = 0;I < TXCOUNT;I++) { // //检查错误标志以查看是否发生错误 // if (错误标志) { asm (" ESTOP0"); } // //验证传输的消息数是否等于的数量 //发送新消息之前收到的消息 // if (txMsgCount = rxMsgCount) { // //发送消息 // CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、 MSG_OBJ_TYPE_TX); txMsgCount++; } 其他 { errorFlag = 1; } // //在继续前延迟0.25秒 // DELAY_US (1000 * 250); // //递增发送消息数据中的值。 // txMsgData[0]+= 0x01; txMsgData[1]+= 0x01; txMsgData[2]+= 0x01; txMsgData[3]+= 0x01; } // //停止应用程序 // asm (" ESTOP0"); } // CAN B ISR -当 CAN 中断为 //时调用的中断服务例程 在 CAN 模块 B 上触发。 // _interrupt void canbISR (void) { uint32_t status; // //读取 CAN-B 中断状态以查找中断原因 // 状态= CANIntStatus (CANB_BASE、CAN_INT_STS_CAUST); // //如果原因是控制器状态中断,则获取状态 // if (status =CAN_INT_INT0ID_STATUS) { // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // API 文档,了解有关错误状态位的详细信息。 //读取此状态的操作将清除中断。 // STATUS = CANStatusGet (CANB_BASE、CAN_STS_CONTROL); // //检查是否发生错误。 // if (((status &~(CAN_ES_RXOK))!= 7)&& ((STATUS &μ~(CAN_ES_RXOK))!= 0)) { // //设置一个标志来指示可能发生的某些错误。 // errorFlag = 1; } } // //检查原因是否是 CAN-B 接收报文对象1 // 否则、如果(status == RX_MSG_OBJ_ID) { // //获取收到的消息 // CANMessageGet (CANB_BASE、RX_MSG_OBJ_ID、&sRXCANMessage、TRUE); // //到达这一点意味着 RX 中断发生在上 //报文对象1、报文 RX 完成。 清除 //消息目标中断。 // CANIntClear (CANB_BASE、RX_MSG_OBJ_ID); // //递增计数器以跟踪已有多少消息 //已收到。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // rxMsgCount++; // //由于接收到消息,请清除所有错误标志。 // errorFlag = 0; } // //如果发生意外导致中断的情况,这将对中断进行处理。 // 其他 { // //可以在此处执行伪中断处理。 // } // //清除 CAN 中断线的全局中断标志 // CANGLALIntClear (CANB_BASE、CAN_GLB_INT_CANINT0); // //确认位于组9中的此中断 // PieCtrlRegs.PIEACK.all = PIEACK_group9; } // //文件结束 //

大家好、

 

我正在测试 CONTRAL_SUITE 中提供的 CAN_EXTERNAL_Transmit 示例代码。 由于 J9连接器不能通过简单的跳线连接、因此我可以尝试使用另一个(CANTXA、CANRXA)对进行测试、如所示  

(GPIO19、GPIO18)。 我已将示波器连接到 J1引脚3 (GPIO19)和引脚4 (GPIO18)。 但我在示波器上看不到任何变化。 我在代码中所做的更改如下所示:

如果我缺少配置的重要部分、请告诉我。  

谢谢、

Akshay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
       我建议您从 TI 网站下载最新版本的 C2000ware、并在此处尝试示例。
     
    我强烈建议您下载 app.note SPRA876并查看我的调试检查清单(第3.3节)。 具体而言、请查看  3.3.3硬件调试提示中的第一个要点
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试过 GPIO12 (CANTXB)和 GPIO17 (CANRXB)、它们是连接到 CAN 收发器的引脚?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、哈里什。 我在 CANH CANL 线路上尝试了12、17和示波器。 仍然没有变化。

    谢谢、

    Akshay

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

    您好 Harish、

    这是 C2000ware 的示例代码、我对其进行了少量编辑、并尝试使用 launchpad。 我在此代码中所做的重要编辑是、

    1) 1)将 CAN 基地址更改为 CANB、因为收发器的 CANH 和 CANL 连接到 CANTXB (GPIO12)和 CANRXB (GPIO17)  

    2) 2)已注释所有接收代码  

    3) 3)在 CANB 而不是 CANA 上发送数据所需的更改

    4) 4)从代码发送数据后、向 get_status 添加了 check  

    //######################################################################################################################

    //
    ////文件:CAN_external_transmit。c
    //
    //标题:演示 CAN 外部传输的示例
    //
    ! addtogroup cpu01_example_list
    //! 

    CAN-A 至 CAN-B 外部发送(CAN_EXTERNAL_Transmit)

    //! //! 此示例初始化 CAN 模块 A 和 CAN 模块 B 的外部 //! 通信。 CAN-A 模块被设置为传输"n"的递增数据 //! 到 CAN-B 模块的次数、其中"n"为 TXCOUNT 的值。 //! CAN-B 模块设置为在 //! 接收数据。 如果传输的数据不 是//! 匹配接收到的数据。 //! //! 注意设备上的两个 CAN 模块都需要是 //! 通过 CAN 收发器相互连接。 //! //! 要求硬件\n //! -具有两个 CAN 收发器的 C2000电路板 //! //! b 外部连接\n //! - controlCARD CANA 位于 GPIO31 (CANTXA)和 GPIO30 (CANRXA)// ! - controlCARD CANB 位于 GPIO8 (CANTXB)和 GPIO10 (CANRXB)// ! //! b 监视\b 变量\n //! - TXCOUNT -调整以设置要传输的消息数 //! - txMsgCount -发送消息数的计数 器//! - rxMsgCount -接收到的消息数的计数 器//! - txMsgData -一个包含正在发送数据的数组 //! - rxMsgData -包含接收到的数据的数组 //! -errorFlag -指示发生错误 的标志//! // //########################################################################################################################## //$TI 发布:F2837xD 支持库 v3.05.00.00 $ //$发布 日期:截至10月18日15:48:42 CDT 2018 $ //版权所有: //版权所有(C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "F28x_Project.h" //设备头文件和示例包括文件 #include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ca.h" #include "driverlib/ca.h" // define TXCOUNT 100 #define unsigned_data_length 4 #define TX_MSG_OBJ_ID 1 #RX_CODE"// define 32 volatile Msgt_int_0 = volatile 0xt_int_uint_32;volatile MSG_0xt_uint_uint_32;volatile MSG_0xt_int_int_uint_uint_int_uint_int_int_u_int_int_int_ex 32;volatile unsigned char rxMsgData[4]; uint32_t status; tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; // 函数原型 // __interrupt void canbISR (void); // // Main // void main (void) { // //初始化系统控制: // PLL、安全装置、启用外设时钟 // InitSysCtrl(); // //初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚 //在模块 A 和 B 上 // InitGpio(); // //为 CAN-A TX/RX 和 CAN-B TX/RX 设置 GPIO 引脚多路复用器 // GPIO_SetupPinMux (17、GPIO_MUX_CPU1、2);//GPIO30 - CANRXA GPIO_SetupPinOptions (17、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (12、GPIO_MUX_CPU1、2);//GPIO31 - CANTXA GPIO_SetupPinOptions (12、GPIO_OUTPUT、GPIO_PushPull); /* GPIO_SetupPinMux (10、GPIO_MUX_CPU1、2);//GPIO10 - CANRXB GPIO_SetupPinOptions (10、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (8、GPIO_MUX_CPU1、2);//GPIO8 - CANTXB GPIO_SetupPinOptions (8、GPIO_OUTPUT、GPIO_PushPull); * // //初始化 CAN 控制器 // //CANInit (CANA_base); CANInit (CANB_BASE); // //设置可以从 PLL 输出时钟计时 // //CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟 CANClkSourceSelect (CANB_BASE、0);// 500kHz CAN 时钟 // //为每个模块将 CAN 总线位速率设置为500kHz //此函数为标称配置设置 CAN 总线时序。 //您可以使用实现对 CAN 总线时序的更多控制 //函数 CANBitTimingSet()代替这个函数(如果需要)。 //此外、请查阅器件数据表以了解更多相关信息 // CAN 模块计时。 // //CANBitRateSet (CANA_base、200000000、50000); CANBitRateSet (CANB_BASE、200000000、50000); // //在 CAN B 外设上启用中断。 // CANIntEnable (CANB_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // //清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态为禁用所有 PIE 中断和标志 //被清除。 // InitPieCtrl(); // //禁用 CPU 中断并清除所有 CPU 中断标志 // IER = 0x0000; IFR = 0x0000; // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 //这将填充整个表,即使是中断也是如此 //在本例中未使用。 这对于调试很有用。 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 //此文件中的 ISR 函数。 //这在 PIE 矢量表中注册中断处理程序。 // EALLOW; PieVectTable.CANB0_INT = CANbISR; EDIS; // //在处理器(PIE)上启用 CAN-B 中断。 // PieCtrlRegs.PIEIER9.bit.INTx7=1; IER |= M_INT9; EINT; // //启用 CAN-B 中断信号 // CANGLALIntEnable (CANB_BASE、CAN_GLB_INT_CANINT0); // //初始化用于发送 CAN 消息的发送消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 消息对象标志:无 // 消息数据长度:4字节 // 报文发送数据:txMsgData // sTXCANMessage.ui32MsgID = 0x5555; sTXCANMessage.ui32MsgIDMask = 0; sTXCANMessage.ui32Flags = 0; sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sTXCANMessage.pucMsgData = txMsgData; // //初始化用于接收 CAN 消息的接收消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 报文对象标志:接收中断 // 消息数据长度:4字节 // 消息接收数据:rxMsgData // sRXCANMessage.ui32MsgID = 0x5555; sRXCANMessage.ui32MsgIDMask = 0; sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE; sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sRXCANMessage.pucMsgData = rxMsgData; //CANMessageSet (CANB_BASE、RX_MSG_OBJ_ID、&sRXCANMessage、 // MSG_OBJ_TYPE_RX); // //初始化要发送的发送消息对象数据缓冲区 // txMsgData[0]= 0x12; txMsgData[1]= 0x34; txMsgData[2]= 0x56; txMsgData[3]= 0x78; // //启动 CAN 模块 A 和 B 操作 // //CANEnable (CANA_base); CANEnable (CANB_BASE); // //将消息从 CAN-A 发送到 CAN-B // for (;;) { // //发送消息 // CANMessageSet (CANB_BASE、TX_MSG_OBJ_ID、&sTXCANMessage、 MSG_OBJ_TYPE_TX); STATUS = CANStatusGet (CANB_BASE、CAN_STS_TXREQUEST); DELAY_US (1000 * 250); } // //停止应用程序 // asm (" ESTOP0"); } // CAN B ISR -当 CAN 中断为 //时调用的中断服务例程 在 CAN 模块 B 上触发。 // _interrupt void canbISR (void) { uint32_t status; // //读取 CAN-B 中断状态以查找中断原因 // 状态= CANIntStatus (CANB_BASE、CAN_INT_STS_CAUST); // //如果原因是控制器状态中断,则获取状态 // if (status =CAN_INT_INT0ID_STATUS) { // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // API 文档,了解有关错误状态位的详细信息。 //读取此状态的操作将清除中断。 // STATUS = CANStatusGet (CANB_BASE、CAN_STS_CONTROL); // //检查是否发生错误。 // if (((status &~(CAN_ES_RXOK))!= 7)&& ((STATUS &μ~(CAN_ES_RXOK))!= 0)) { // //设置一个标志来指示可能发生的某些错误。 // errorFlag = 1; } } // //检查原因是否是 CAN-B 接收报文对象1 // 否则、如果(status == RX_MSG_OBJ_ID) { // //获取收到的消息 // CANMessageGet (CANB_BASE、RX_MSG_OBJ_ID、&sRXCANMessage、TRUE); // //到达这一点意味着 RX 中断发生在上 //报文对象1、报文 RX 完成。 清除 //消息目标中断。 // CANIntClear (CANB_BASE、RX_MSG_OBJ_ID); // //递增计数器以跟踪已有多少消息 //已收到。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // rxMsgCount++; // //由于接收到消息,请清除所有错误标志。 // errorFlag = 0; } // //如果发生意外导致中断的情况,这将对中断进行处理。 // 其他 { // //可以在此处执行伪中断处理。 // } // //清除 CAN 中断线的全局中断标志 // CANGLALIntClear (CANB_BASE、CAN_GLB_INT_CANINT0); // //确认位于组9中的此中断 // PieCtrlRegs.PIEACK.all = PIEACK_group9; } // //文件结束 //

    请在以下图像的调试窗口中查找我的连接的图像和当前状态的快照:

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

    Akshay、

               我附加了一个仅进行传输的更简单的测试用例。 无接收或中断。 我为 CAN-A 编写了它;请为 CAN-B 修改它        为 CAN 操作选择正确的 GPIO 至关重要。 请参阅随附的 Word 文档中的注释。

    由于您没有其他用于 ACK 的节点,因此传输将永远重试。 (有关更多详细信息、请参阅我的 app.note)

    e2e.ti.com/.../DCAN_2D00_driverlib-notes-_2D00_-Copy.docxe2e.ti.com/.../can_5F00_ex4_5F00_simple_5F00_transmit.cYour 范围不支持本地触发 CAN。 如果您未正确配置示波器、则在 CAN 波形上触发可能会有点棘手。 在您的情况下、我假设您只是在 CAN 总线上寻找一些脉冲来验证流量。 我建议您使用 CANTX 引脚、而不是差分总线。

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

    如果代码工作正常、您应该会看到一个类似于所附波形的波形。 如果您没有 CAN 总线分析器、我强烈建议您获取一个。  这样、将生成一个 ACK 并且帧传输将完成。

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

    您好、Haresh、

    我使用的是 CAN_ex4_simple_transmit。c、我遇到了一些奇怪的问题。

    让我告诉您、在我之前使用代码时、我仅将示波器连接到 CANTXA 和 CANRXA (而不是连接到 CANH 和 CANL)。

    现在、我已经像这样修改了 device.h、

    我在调试类似这样的代码时遇到了一个问题、

    导致此问题的代码是、

    实际上、  

    函数 SYSCTL_DELAY 的定义已经位于、

    这个问题仍然存在。 我很惊讶地看到、  

    我还附加了一个项目文件、

    e2e.ti.com/.../Hareesh_5F00_Example.zip

    现在、我已将示波器连接到 GPIO18和 GPIO19、使其成为 CANTXA 和 CANRXA。

    请对此进行进一步指导。

    谢谢、

    Akshay Godase

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

    由于您没有连接另一个节点、为了能够查看 CAN 活动、最好使用 GPIO12和 GPIO17、它们是连接到 CAN 收发器的引脚。 了解您无法轻松探测 GPIO12。 您可以改为探测 CAN_H 引脚。 如果您在示波器上正确设置了触发级别,则*应该*能够在当前示波器上查看此引脚上的活动。

    请购买 CAN 总线分析仪。 基于 USB 的工具的售价约为150美元。 这是调试 CAN 问题时不可或缺的工具。

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

    如前所述、问题是、我们未连接任何其他节点、而这些节点将确认 Launchpad 发起的传输。
    连接另一个节点后、通信成功、我可以在我们的 CAN 分析仪上看到数据。 非常感谢您的支持和帮助。

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