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:当我使用 CAN_EXTERNAL_SEND_C.c 时进行错误编码

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/590799/ccs-launchxl-f28377s-error-coding-when-i-use-can_external_transmit-c

器件型号:LAUNCHXL-F28377S

工具/软件:Code Composer Studio

大家好、我想使用 CAN_EXTERNAL_Transmit。c 来测试 CAN 总线

我将 MCP2551 (CAN 收发器)的2与 LAUNCHXL-F28377S 一起使用

结果是

这是我的源代码

//######################################################################################################################
//
////文件: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 支持库 V200 $// $发行 日期:星期二6月21日13:52:16 CDT 2016 $// 版权所有:版权所有(C) 2014-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 10 #define unsigned_data_length 4 #define TX_MSG_OBJ_ID 1 #RX_CODE"// define 32 volatile Msgt_int_0 = volatile 0xt_uint_32;/volatile Msgt_int_uint_eq_uint1 = 32;volatile 0xt_int_int_uint_int_int_uint_uint_int_int_int_int_int_int_int_int_int_int_int_int_int_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);//PIN76-J8 - CANRXA GPIO_SetupPinOptions (18、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (19、GPIO_MUX_CPU1、3);//PIN75-J8 - CANTXA GPIO_SetupPinOptions (19、GPIO_OUTPUT、GPIO_PushPull); /*GPIO_SetupPinMux (17、GPIO_MUX_CPU1、2);//引脚35-J4 - CANRXB GPIO_SetupPinOptions (17、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (16、GPIO_MUX_CPU1、2);//引脚36-J4 - CANTXB GPIO_SetupPinOptions (16、GPIO_output、GPIO_PushPull);*/ GPIO_SetupPinMux (21、GPIO_MUX_CPU1、3);//引脚33-J4 - CANRXB GPIO_SetupPinOptions (21、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (20、GPIO_MUX_CPU1、3);//引脚34-J4 - CANTXB GPIO_SetupPinOptions (20、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 // 对于(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; } // //文件结束 //

 

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

    您好、Kanthanet、

    看起来 CANB 没有接收到任何消息、因此错误标志被置位。  请彻底检查  并检查您与所使用的 MCP2551收发器的连接、以确保 CANTX、CANRX 和 CANL、CANH 连接正确。  如果任一连接被反接、那么发送/接收环路将不起作用。  ID 确实检查了您为 CANA 和 CANB 设置的 GPIO 配置、它们看起来是正确的。 我不熟悉 MCP2551、但还要确保电平与3.3V I/O 兼容、与28377相同。

    我可以提出的一个建议是在 LaunchPad 中使用板载收发器。  默认情况下、SN65HVD234D 收发器通过 GPIO70和71连接到 CANA。  这将是传输模块。  CAN 总线在 J12中可用、并且这已经有120欧姆端接电阻器。  您必须使用另一个收发器将 CANB 连接到 CAN 总线、并且您可能可以复制板载 SN65HVD234D 的同一电路。  最好将 SN65HVD234D 的参数与 MCP2551进行比较、尤其是在级别上、以确保它们兼容。

    此致、

    Joseph

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

    感谢您的回答、

    实际上、我检查了每个电路、但我对 mcp1551使用了5 v、但它仍然不起作用。

    根据您的建议、我将尝试这样做。

    如果您有时间、我想知道我是否要使用 J12将2个 f28377s Launchpad 连接在一起
    如何做到这一点?
    我尝试执行它、但它不起作用
    我有1个 labtop 和2个 f28377s launchpad。

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

    在我的编码之后、我认为 GPIO70与 GPIO18是同一个引脚。
    那么、如何相互连接。

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

    您好、Kanthanet、

    如果您有2个 LaunchPad、则可以尝试另一个选项。   您必须 从 J12将第一个 Launchpad 的 CANL 线路连接到第二个 Launchpad 的 CANL 线路。  对 CANH 线路执行相同的操作。

    复制示例代码、以便您现在有两个 CCS 项目。  将第一个项目命名为 CAN_Transmit 、这将用于第一个 Launchpad。  重命名第二个项目 CAN_Receive、该项目将用于第二个 Launchpad。

    在 CAN_Transmit 工程中、删除与 CANB 相关的所有代码。  同时删除 if (txMsgCount=rxMsgCount)条件、并保留 CANMessageSet 函数调用。  同时删除 else { errorFlag=1;}语句。  也删除了 canbISR 中断函数。  请不要忘记将 CANA 通道配置为与 CAN 通道匹配(CANRXA = GPIO70;CANTXA = GPIO71)。  这将是您将为第一个 Launchpad 加载的项目。

    在 CAN_Receive 工程中、删除与 CANA 相关的所有内容(包括传输缓冲区和例程)。  然后将所有 CANB 重命名为 CANA、因为第二个 Launchpad 上的接收 CAN 是 CANA。   您还必须将 CANA 模块用于第二个 Launchpad、因为它是连接到收发器的模块。  将中断函数重命名为 canbISR、将所有 CANB 引用更改为 CANA。  然后、您必须修改 CAN 接收项目、使其以这种方式显示(不要忘记 CAN 的初始化和 GPIO 分配、因为我没有在这里包含它)。

    //

    //初始化 CAN 控制器

    //

    CANInit (CANA_base);

    //

    //设置可以从 PLL 输出时钟计时

    //

    CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟

    //

    //为每个模块将 CAN 总线位速率设置为500kHz

    //此函数为标称配置设置 CAN 总线时序。

    //您可以使用实现对 CAN 总线时序的更多控制

    //函数 CANBitTimingSet()代替这个函数(如果需要)。

    //此外、请查阅器件数据表以了解更多相关信息

    // CAN 模块计时。

    //

    CANBitRateSet (CANA_base、200000000、50000);

    //

    //在 CAN 外设上启用中断。

    //

    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-A 中断。

    //

    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;

    IER |= M_INT9;

    EINT;

    //

    //启用 CAN-B 中断信号

    //

    CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);

    //

    //初始化用于接收 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 (CANA_base、RX_MSG_obj_ID、sRXCANMessage、

    MSG_OBJ_TYPE_RX);

    //

    //启动 CAN 模块 B 操作

    //

    CANEnable (CANA_base);

    //

    //停止应用程序

    //

    asm (" ESTOP0");

    请注意、当从 CANB 切换到 CANA 时、有一个中断更改分配。  有关这方面的详细信息、请访问 www.ti.com/.../spruhx5网站

    构建项目(编译和链接时不会出现任何错误)后、必须打开2个 CCS 实例、一个用于 CAN 传输、另一个用于 CAN 接收项目。  在 CCS 中单独加载2个项目、然后在第一个 Launchpad 上运行发送项目、然后立即在第二个 Launchpad 上运行接收项目。

    希望这对您有所帮助。

    此致、

    Joseph

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

    以及如何设置 CAN 引脚? 我已经在数据表中看到了、但我有一点困惑。
    代码、您认为它是正确的吗?

    InitGpio();

    GPIO_SetupPinMux (70、GPIO_MUX_CPU1、3);//PIN76 - CANRXA
    GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
    GPIO_SetupPinMux (71、GPIO_MUX_CPU1、3);//PIN77- CANTXA
    GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);


    此致、

    卡纳特