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/LAUNCHXL-F28377S:F28377s 可能会设置问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/624012/ccs-launchxl-f28377s-f28377s-can-setup-problems

器件型号:LAUNCHXL-F28377S

工具/软件:Code Composer Studio

我可以正常发送 CAN 消息、但我无法接收任何消息。

设置:

具有 PCAN Explorer 软件狗的 LaunchXL_F28377 (在 PC 上运行 PCAN Explorer 5)。  我还使用其他 CAN 器件对其进行了测试、没有任何问题。  我在 F28069 LaunchPad 上有一个工作版本、但这里的 CAN 驱动程序是如此不同、它们不能使用、但硬件设置显示它工作正常。

程序:我尝试了自己的程序并遇到了问题、因此我将直接从28377的 CAN_EXTERNAL_Transmit _CPU1示例项目中工作

编译器:17.6.0.STS

我已修改为仅使用 CAN A (也是为了正确设置初始 launchpad 不正确的时钟)进行编程。  

//GPIO 初始化:

GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);//GPIO30 - CANRXA

GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);


GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);//GPIO31 - CANTXA
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);

工作原理:

我可以正常传输、尽管它确实会在成功传输时触发中断、即使没有请求(我已经对其进行了三重检查)。

不起作用的地方:

我可以接收一个 CAN 消息、这会触发一个中断、 但是当尝试读回该消息时、PID 总是0、长度总是0、数据似乎也不会传入。

我已尝试将 RxMessage Template 上的 msgid 更改为零。  我已尝试将其与要发送的内容相匹配。  我尝试了扩展和标准帧。  除了零都没有...

另请注意、当尝试通过"Expressions"窗口读取 CanaRegs 时、返回错误消息:"Memory map prevented reading 0x00048080@Data"  

请提供任何帮助。

谢谢!

程序的源代码(修改的 TI 示例)如下所示:

//######################################################################################################################
//
////文件: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 发布:F2837xS 支持库 v3.01.00.00 $ //$发布 日期:星期一5月22日15:44:59 CDT 2017 $ //版权所有: //版权所有(C) 2014-2017 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 8 #define TX_MSG_OBJ_ID 15 #RX_define MSG_CAN.h"// define TXCOUNT_32 volatile Msgt_int_0xt_32 = volatile 0xt_int_0xt_0xt_0xt_0xt_0xt_uint_32;volatile 0xt_int_int_uint_uint_32 = volatile 0x_int_uint_u_int_uint_int_uint_int_int_int unsigned char rxMsgData[4]; tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; // //函数原型 // __interrupt void canaISR (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 (70、GPIO_MUX_CPU1、5);//GPIO30 - CANRXA GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);//GPIO31 - CANTXA GPIO_SetupPinOptions (71、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、250000); //CANBitRateSet (CANB_BASE、200000000、50000); // //在 CAN B 外设上启用中断。 // CANIntEnable (CANA_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.CANA0_INT = CANaISR; EDIS; // //在处理器(PIE)上启用 CAN-B 中断。 // PieCtrlRegs.PIEIER9.bit.INTx5 = 1; IER |= M_INT9; EINT; // //启用 CAN-B 中断信号 // CANGLALIntEnable (CANA_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 = 0x0; sRXCANMessage.ui32MsgIDMask = 0; sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE; sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sRXCANMessage.pucMsgData = rxMsgData; CANMessageSet (CANA_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 // while (1) { // //检查错误标志以查看是否发生错误 // if (错误标志) { //asm (" ESTOP0"); } // //验证传输的消息数是否等于的数量 //发送新消息之前收到的消息 // // //发送消息 // //CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、MSG_OBJ_TYPE_TX); //txMsgCount++; // //在继续前延迟0.25秒 // DELAY_US (1000 * 250); // //递增发送消息数据中的值。 // txMsgData[0]+= 0x01; txMsgData[1]+= 0x01; txMsgData[2]+= 0x01; txMsgData[3]+= 0x01; // //如果超过一个字节、则复位数据 // if (txMsgData[0]> 0xFF) { txMsgData[0]= 0; } if (txMsgData[1]> 0xFF) { txMsgData[1]= 0; } if (txMsgData[2]> 0xFF) { txMsgData[2]= 0; } if (txMsgData[3]> 0xFF) { txMsgData[3]= 0; } } // //停止应用程序 // asm (" ESTOP0"); } // CAN B ISR -当 CAN 中断为 //时调用的中断服务例程 在 CAN 模块 B 上触发。 // _interrupt void canaISR (void) { uint32_t status; // //读取 CAN-B 中断状态以查找中断原因 // 状态= CANIntStatus (CANA_base、CAN_INT_STS_CAUST); // //如果原因是控制器状态中断,则获取状态 // if (status =CAN_INT_INT0ID_STATUS) { // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // API 文档,了解有关错误状态位的详细信息。 //读取此状态的操作将清除中断。 // 状态= CANStatusGet (CANA_base、CAN_STS_CONTROL); // //检查是否发生错误。 // if (((status &~(CAN_ES_RXOK))!= 7)&& ((STATUS &μ~(CAN_ES_RXOK))!= 0)) { // //设置一个标志来指示可能发生的某些错误。 // errorFlag = 1; }否则 { CANMessageGet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、true); // //到达这一点意味着 RX 中断发生在上 //报文对象1、报文 RX 完成。 清除 //消息目标中断。 // CANIntClear (CANA_base、RX_MSG_OBJ_ID); } } // //检查原因是否是 CAN-B 接收报文对象1 // 否则、如果(status == RX_MSG_OBJ_ID) { // //获取收到的消息 // CANMessageGet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、true); // //到达这一点意味着 RX 中断发生在上 //报文对象1、报文 RX 完成。 清除 //消息目标中断。 // CANIntClear (CANA_base、RX_MSG_OBJ_ID); // //递增计数器以跟踪已有多少消息 //已收到。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // rxMsgCount++; // //由于接收到消息,请清除所有错误标志。 // errorFlag = 0; } // //如果发生意外导致中断的情况,这将对中断进行处理。 // 其他 { // //可以在此处执行伪中断处理。 // } // //清除 CAN 中断线的全局中断标志 // CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0); // //确认位于组9中的此中断 // PieCtrlRegs.PIEACK.all = PIEACK_group9; } // //文件结束 //

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

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

    我已将其追溯到函数如何设置接受屏蔽。

    我已将其跟踪到实际寄存器中、其中 IF1MSK 被写入0x20000000、IF1ARB 被写入0x8000000、根据数据表、"接受所有消息"...  这似乎是正确的。

    但是 CANMessageSet (...) 函 数不会将 IF1CMD 掩码设置为将这些值实际写入消息 RAM、除非设置了"MSG_OBJ_USE_ID_FILTER"标志、这是反向直观的。  这也无法完全解决问题。

    CANMessageSet 不会将 IF1MCTL 中的 UMASK 设置为使用接受屏蔽、除非也 设置了标志"MSG_OBJ_USE_ID_FILTER"。  一般来说、这是有道理的、但实际上、除非设置了该位、否则我似乎无法从消息中获取任何信息。  

    因此、如果您需要"全部/任何" 消息、则必须将接受筛选器设置为0、并检查您是否确实正在使用接受筛选器...  这似乎与规格表中的内容不匹配。

    对于希望将来使用 CAN.c/can.h 的用户、您将需要使用此选项来设置通用邮箱:

    sRXCANMessage.ui32MsgID = 0x0;
    sRXCANMessage.ui32MsgIDMask = 0x0;
    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
    sRXCANMessage.pucMsgData = rxMsgData;
    CANMessageSet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、MSG_OBJ_TYPE_RX);

    谢谢、

    Kyle M