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.

[参考译文] 编译器/LAUNCHTXL-F2.8377万S:TX模块的CAN配置(逐处理器接收帧)

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/641606/compiler-launchxl-f28377s-can-configuration-for-tx-mod-recive-the-frame-by-processor

部件号:LAUNCHXL-F2.8377万S

工具/软件:TI C/C++编译器

您好,

我花了两天时间在RX模式下配置CAN。 (TX模式工作正常)

下面是我的代码,基于示例(F2837xS V210)。

我做错了什么,  

我将等待您的回答

/*
* v1_main.c
*
*创建日期:2017年21日
*作者:Dariusz
*/

//###################################################################
//
//文件:can_moje_transmit.c
//
//! - CANA位于GPIO71 (CANTXA)和GPIO70 (CANRXA)上
//
//!
//! \b监视变量\n
//! - TXCOUNT -调整以设置要传输的消息数
//! - txMsgCount -用于计算已发送消息数的计数器
//! -rxMsgCount-用于计数收到的消息数
//! - txMsgData -一个包含要发送的数据的数组
//! - rxMsgData -包含已接收数据的数组
//! - errorFlag -表示发生错误的标志
//###################################################################
//###################################################################
//
//包含的文件
//
#include "F28x_Project.h"//设备头文件和示例包括文件
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/HW_CAN.h"
#include "driverlib/can.h"

//RX
unsigned char rxMsgData_103h[4];

tCANMsgObject sRXCANMessage_103h;

Void主(void)

//
//初始化系统控制:
// PLL,看门狗,启用外设时钟
//
InitSysCtrl();
//
//为CANTX/CANRX初始化GPIO和配置GPIO引脚
//
伊尼特·格皮奥();
//
//为CAN-A TX/RX设置GPIO引脚多路复用
//
GPIO_SetupPinMux (70,GPIO _MUX_CPU1,5);//GPIO70 - CANRXA
GPIO设置PIN选项(70,GPIO输入,GPIO _异步);
GPIO_SetupPinMux (71,GPIO _MUX_CPU1,5);//GPIO71 - CANTXA
GPIO设置引脚选项(71,GPIO输出,GPIO推送);
//

//初始化CAN控制器
// CANInit (基于CAN地址)
CANInit (Cana_base);
//
//CANBitTimingSet (CAN地址,指向具有时钟参数(pClkParams)的结构)
//
//
//设置CAN源时钟。 选择选项
// CANClkSourceSelect (CAN的基本地址,时钟源) 0-选定的CPU SYSCLKOUT
CANClkSourceSelect(Cana_base, 0);// 500kHz CAN时钟
//
//为CAN设置通信参数
// CANBitRateSet (CAN的基本地址,CAN的时钟频率,以Hz为单位,比特率)
//250kb/s
CANBitRateSet(Cana_base, 2亿, 25万);
//
色调;
//
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//
InitPieCtrl();
//
//禁用CPU中断并清除所有CPU中断标志
//
IER = 0x0000;
IFR = 0x0000;

//最小化帧103h
//frame_103h
sRXCANMessage_103h.ui32MsgID = 0x103;// 11或29
sRXCANMessage_103h.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage_103h.ui32MsgLen = sizeof(rxMsgData_103h);
sRXCANMessage_103h.pucMsgData = rxMsgData_103h;

CANEnable (Cana_base);

对于(;;)

//来自103h帧的数据
CANMessageSet (Cana_base,1,&sRXCANMessage_103h,MSG_OBJ_TYPE_RX);
}

}//结束主
//
//文件结束
//

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

    我正在尝试根据您共享的代码来理解您的示例。 因此,我所了解的内容,请您澄清一下:

    1.您已拆分Tx和Rx部件,其中您说Tx正在工作,而您共享的Rx代码不在工作。
    2.您已在此代码中配置了Rx部件,并且正在等待接收发送的数据。

    我认为您出错的地方是在初始化之后,您没有设置帧,而是在"for (;;)"内设置帧,您应该在那里等待消息被接收。

    循环中应该有CANMessageGet API,您应该在其中接收由Tx代码发送的消息。

    请您回答我的问题,并告诉我您对Rx部件的期望是什么,但没有发生。

    谢谢,此致
    Harshmeet Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet,您好!
    您非常了解(第1点和第2点)。
    我会尽快检查您的建议,解决通信RX问题的方法。
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,用户470.0872万,

    您还可以启用接收中断来检查是否正在接收数据,这可能有助于更好地进行调试。
    希望这些建议能帮到您。

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

    感谢您的支持。 您的建议非常有帮助。
    我想与您和其他用户分享测试CAN功能(帧的传输和接收模式)的COD
    在代码下方
    //###################################################################
    //
    //文件:can_moje_transmit.c
    //
    //! - CANA位于GPIO71 (CANTXA)和GPIO70 (CANRXA)上
    //用于LaunchXL-F2.8377万S
    //###################################################################


    //包含的文件
    //
    #include "F28x_Project.h"//设备头文件和示例包括文件
    #include <stdint.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/HW_CAN.h"
    #include "driverlib/can.h"
    //
    //定义
    //
    #define red_LED_GPIO 12 //红色GPIO 12
    #define blue_LED_GPIO 13 //蓝色GPIO 13

    //TX
    unsigned char txMsgData_203h[4];
    unsigned char txMsgData_205H[4];
    tCANMsgObject sTXCANMessage_203h;
    tCANMsgObject sTXCANMessage_205H;

    //RX
    无符号char a_103h,b_103h,c_103h,d_103h;
    无符号char a_105h,b_105h,c_105h,d_105h;
    unsigned char rxMsgData_103h[4];
    tCANMsgObject sRXCANMessage_103h;
    unsigned char rxMsgData_105h[4];
    tCANMsgObject sRXCANMessage_105h;


    Void主(void)


    //初始化系统控制:
    // PLL,看门狗,启用外设时钟
    //
    InitSysCtrl();

    //为CANTX/CANRX初始化GPIO和配置GPIO引脚
    //在模块A和B上
    //
    伊尼特·格皮奥();

    //为CAN-A TX/RX设置GPIO引脚多路复用
    //CAN-A位于GPIO71 (CANTXA)和GPIO70 (CANRXA)上
    //
    GPIO_SetupPinMux (70,GPIO _MUX_CPU1,5);//GPIO70 - CANRXA
    GPIO设置PIN选项(70,GPIO输入,GPIO _异步);
    GPIO_SetupPinMux (71,GPIO _MUX_CPU1,5);//GPIO71 - CANTXA
    GPIO设置引脚选项(71,GPIO输出,GPIO推送);

    //设置LED RED_LED (GPIO12),BLUE_LED (GPIO13)的GPIO引脚多路复用
    //
    GPIO_SetupPinMux (RED_LED_GPIO,GPIO _MUX_CPU1,0);
    GPIO设置引脚选项(RED_LED_GPIO,GPIO输出,GPIO PushPull);
    GPIO_SetupPinMux (blue_LED_GPIO,GPIO _MUX_CPU1,0);
    GPIO_SetupPinOptions (blue_LED_GPIO,GPIO输出,GPIO);

    //初始化CAN控制器
    // CANInit (基于CAN的地址)
    CANInit (Cana_base);

    //设置CAN源时钟。 选择选项
    CANClkSourceSelect(Cana_base, 0);// 0-选定的CPU SYSCLKOUT

    //为CAN设置通信参数
    // CANBitRateSet (CAN的基本地址,CAN的时钟频率,以Hz为单位,比特率)
    CANBitRateSet (Cana_base,2000万0,25万);//200MHz,250kb/s

    //清除所有中断并初始化PIE矢量表:
    //禁用CPU中断
    色调;

    //将PIE控件寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    InitPieCtrl();

    //禁用CPU中断并清除所有CPU中断标志
    //
    IER = 0x0000;
    IFR = 0x0000;
    //初始化TX模式帧203h和205H
    //frame_203h
    sTXCANMessage_203h.ui32MsgID = 0x203;// 11或29
    sTXCANMessage_203h.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
    sTXCANMessage_203h.ui32MsgLen = sizeof(TxMsgData_203h);
    sTXCANMessage_203h.pucMsgData = txMsgData_203h;
    //205H机架
    sTXCANMessage_205H.ui32MsgID = 0x205;// 11或29
    sTXCANMessage_205H.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
    sTXCANMessage_205H.ui32MsgLen = sizeof(TxMsgData_205H);
    sTXCANMessage_205H.pucMsgData = txMsgData_205H;
    //初始日期在203h和205h框架中
    // 203h帧
    txMsgData_203h[0]= 0x1;
    txMsgData_203h[1]= 0x2;
    txMsgData_203h[2]= 0x3;
    txMsgData_203h[3]= 0x4;
    //机架205H
    txMsgData_205H[0]= 0x1;
    txMsgData_205H[1]= 0x1;
    txMsgData_205H[2]= 0x1;
    txMsgData_205H[3]= 0x1;

    //初始化RX模式帧103h
    sRXCANMessage_103h.ui32MsgID = 0x103;// 11或29
    sRXCANMessage_103h.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sRXCANMessage_103h.ui32MsgLen = sizeof(rxMsgData_103h);
    sRXCANMessage_103h.pucMsgData = rxMsgData_103h;

    //初始化RX模式帧105h
    sRXCANMessage_105h.ui32MsgID = 0x105;// 11或29
    sRXCANMessage_105h.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sRXCANMessage_105h.ui32MsgLen = sizeof(rxMsgData_105h);
    sRXCANMessage_105h.pucMsgData = rxMsgData_105h;

    //设置RX模式
    //帧103h
    CANMessageSet (Cana_base,3,&sRXCANMessage_103h,MSG_OBJ_TYPE_RX);
    //帧105h
    CANMessageSet (Cana_base,4,&sRXCANMessage_105h,MSG_OBJ_TYPE_RX);

    //可以启用
    CANEnable (Cana_base);

    //关闭LaunchXL F2.8377万S上的LED
    GPIO写入引脚(RED_LED_GPIO,1);
    GPIO写入引脚(blue_LED_GPIO,1);

    对于(;;)


    //帧203h的数据更新//增加值
    txMsgData_203h[0]+= 0x01;//+1
    txMsgData_203h[1]+= 0x02;//+1
    txMsgData_203h[2]+= 0x03;//+1
    txMsgData_203h[3]+= 0x04;//+1

    //帧205H的数据更新//常量值
    txMsgData_205H[0]= 0x10;
    txMsgData_205H[1]= 0x20;
    txMsgData_205H[2]= 0x30;
    txMsgData_205H[3]= 0xFF;

    //延迟0.5秒
    DELAY _US (1000 * 500);

    //将203h和2035h发送到CAN总线
    CANMessageSet (Cana_base,1,&sTXCANMessage_203h,MSG_OBJ_TYPE_TX);
    CANMessageSet (Cana_base,2,&sTXCANMessage_205H,MSG_OBJ_TYPE_TX);//延迟0.5秒
    //延迟0.5秒
    DELAY _US (1000 * 500);

    //获得103小时的CAN总线
    CANMessageGet (Cana_base,3,&sRXCANMessage_103h,TRUE);
    //从CAN总线获取105hfrom
    CANMessageGet (Cana_base,4,&sRXCANMessage_105h,TRUE);
    //延迟0.5秒
    DELAY _US (1000 * 500);

    //从103h帧获得日期
    a_103h=rxMsgData_103h[0];
    b_103h=rxMsgData_103h[1];
    c_103h=rxMsgData_103h[2];
    D_103h=rxMsgData_103h[3];

    //从105h帧获得日期
    a_105h=rxMsgData_105h[0];
    b_105h=rxMsgData_105h[1];
    c_105h=rxMsgData_105h[2];
    D_105h=rxMsgData_105h[3];

    //从103h帧接收数据A时的操作
    // 103h帧的第一个数据将为10 (十进制) A (十六进制) blue_LED闪烁
    如果(a_103h=10)

    //蓝色LED闪烁
    GpioDataRegs.GPATOGLE.bit.GPIO13 = 1;
    //关闭红色LED
    GPIO写入引脚(RED_LED_GPIO,1);
    DELAY _US (1000 * 500);
    }
    否则

    //关闭蓝色LED
    GPIO写入引脚(blue_LED_GPIO,1);
    }

    //接收105h帧中的数据A时的操作
    //帧105h的第二个数据将为255 (dec) FF (十六进制) blue_LED闪烁
    如果(b_105h=255)

    //红色LED闪烁
    GpioDataRegs.GPATOGLE.bit.GPIO12 = 1;
    //关闭蓝色LED
    GPIO写入引脚(blue_LED_GPIO,1);
    DELAY _US (1000 * 500);
    }
    否则

    //关闭红色LED
    GPIO写入引脚(RED_LED_GPIO,1);
    }

    }
    }
    //
    //文件结束
    //