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/TMS320F28379D:ADC 感应并将数据存储在寄存器中

Guru**** 2579335 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623584/ccs-tms320f28379d-adc-sensing-and-storing-data-in-register

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:Code Composer Studio

大家好、

     目前、我正在检测 ADC 端口中的输入数据、并将其存储在 ADC 寄存器中。 我使用  ADC_SoC_ePWM 的源代码来获取输出。 我通过 MCU 卡在 ADC 通道3感应3.3V 电压。 源代码如下所示:

[  

//######################################################################################################################
//
//文件:adc_soc_ePWM_cpu01.c
//
//标题:针对 F2837xD 通过 ePWM 触发 ADC。
//
//! addtogroup cpu01_example_list
//!

ADC ePWM 触发(ADC_SoC_ePWM)


//!
//! 此示例设置 EPWM 以定期触发 ADC。
//!
//! 程序运行后,内存将包含:\n
//! -\b 结果:一系列的模数转换样本
//! 引脚 A0。 采样之间的时间根据周期确定
//! PWM 计时器的功能。
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/保留所有权利$
//######################################################################################################################

//
//包含的文件
//
#include "F28x_Project.h"

//
//函数原型
//
void ConfigureADC (void);
void ConfigureEPWM (void);
void SetupADCepwm (uint16通道);
中断 void adca1_ISR (void);

//
//定义
//
#define results_buffer_size 8.

//
//全局
//
uint16 AdcaResults[results_buffer_size];
uint16结果索引;
易失性 uint16 bufferFull;

void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();//针对此示例跳过

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();

//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
EDIS;

//
//配置 ADC 并为其加电
//
ConfigureADC();

//
//配置 ePWM
//
ConfigureEPWM();

//
//在通道0上设置用于 ePWM 触发转换的 ADC
//
SetupADCepwm (2);

//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//初始化结果缓冲区
//
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

AdcaResults[resultsIndex]=0;

resultsIndex = 0;
bufferFull = 0;

//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

//
//同步 ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

//
//循环无限地进行转换
//
操作

//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式

//
//等待、而 ePWM 导致 ADC 转换、然后导致中断、
//填充结果缓冲区,最终设置 bufferFull
//flag
//
while (!bufferFull);
bufferFull = 0;//清除缓冲区已满标志

//
//停止 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

//
//此时,AdcaResults[]包含一系列转换
//从所选通道
//

//
//软件断点,再次点击运行以获取更新的转换
//
// asm (" ESTOP0");
} while (1);

//
// ConfigureADC -写入 ADC 配置并为两者加电
// ADC A 和 ADC B
//
空配置 ADC (空)

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);

EDIS;

//
// ConfigureEPWM -配置 ePWM SOC 并比较值
//
空配置 EPWM (空)

EALLOW;
//假设 ePWM 时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x0800;//将比较 A 值设置为2048个计数
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EDIS;

//
// SetupADCepwm -设置 ADC ePWM 采集窗口
//
void SetupADCepwm (uint16通道)

uint16 acqps;

//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

acqps = 14;//75ns

否则、//分辨率为16位

acqps = 63;//320ns

//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC2CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;

//
// adca1_ISR -在 ISR 中读取 ADC 缓冲器
//
中断 void adca1_ISR (void)

AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT2;
if (results_buffer_size <= resultsIndex)

resultsIndex = 0;
bufferFull = 1;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//
//文件结束
//]

但令人惊讶的是 、没有数据存储在 AdcResults 变量中。 是否有人可以在上述源代码中建议缺少命令

提前感谢。

此致

Sumanta

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

    这是否适用于 controlSUITE 中未更改的示例? 如果不是、您应该关注硬件调试、例如检查通道连接、电源轨、ADC 基准等 如果它不发生改变、请返回到该代码并一次进行一个更改、并在每个步骤中验证操作是否正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    感谢您的回答。 我正在使用 ADC 通道(ADCINA2)、并在源代码中进行相应配置。 我想知道您建议在程序或任何其他 ADC 程序中进行哪些更改、这些更改可以通过调试和检查来将数据从 ADC 模拟输入存储到 ADC 寄存器。

    提前感谢。

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

    我认为默认情况下、该示例设置为在通道 A0上进行转换? 在对库存示例进行更改之前、请尝试使其正常工作。 如果您无法使其正常工作、问题可能与硬件/设置相关(例如 VDDA 电源轨不正确、未提供 VREF 引脚、输入激励连接到错误的接头和/或引脚等)。 如果 A0正常工作、但 A2不工作、则应仔细考虑您所做的软件更改、以确定它们是否正确/完整。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    您能告诉我在上述源代码中、通道 ADCINA2的相应配置设置是什么、以便可以在 Code Composer Studio 窗口环境中获取存储在寄存器中的 ADC 输出。 请建议。

    提前感谢。

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

    修改后的源代码如下所示:
    [
    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #include
    #include
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_ca.h"
    #include "driverlib/CAN.h"

    //
    //函数原型
    //
    void ConfigureADC (void);
    void ConfigureEPWM (void);
    void SetupADCepwm (uint16通道);
    中断 void adca1_ISR (void);

    //
    //定义
    //
    #define results_buffer_size 8.

    //全局
    //
    volatile unsigned long g_ulMsgCount = 0;//跟踪的计数器
    //发送次数
    //成功。
    volatile unsigned long g_BErrFlag = 0;//一个标志来指示某些标志
    //发生传输错误。

    uint16 AdcaResults[results_buffer_size];
    uint16结果索引;
    易失性 uint16 bufferFull;

    //
    //主函
    //
    void main (void)

    tCANMsgObject sTXCANMessage;
    tCANMsgObject sRXCANMessage;
    无符号 char ucTXMsgData[8]={'0'、'0'、'0'、'0'、'0'、'0'、'0'}、ucRXMsgData[8]={'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0'、'0';

    //
    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    //
    InitSysCtrl();

    //
    //步骤2. 初始化 GPIO:8
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //


    InitGpio();
    GPIO_SetupPinMux (36、GPIO_MUX_CPU1、6);//GPIO30 - CANRXA
    GPIO_SetupPinMux (37、GPIO_MUX_CPU1、6);//GPIO31 - CANTXA
    GPIO_SetupPinOptions (36、GPIO_INPUT、GPIO_异 步);
    GPIO_SetupPinOptions (37、GPIO_OUTPUT、GPIO_PushPull);

    //
    //初始化 CAN 控制器
    //
    CANInit (CANA_base);

    //
    //设置可以根据 M3/主子系统时钟计时
    //
    CANClkSourceSelect (CANA_base、0);

    //
    //设置 CAN 总线的比特率。 此函数设置 CAN
    针对标称配置的//总线时序。 您可以实现更多控制
    //使用函数 CANBitTimingSet()代替 CAN 总线时序
    //如果需要。
    //在此示例中、CAN 总线设置为500kHz。 在以下函数中、
    //对 SysCtlClockGet ()的调用用于确定该时钟速率
    //用于为 CAN 外设计时。 可将其替换为
    //固定值如果您知道系统时钟的值,则节省额外的值
    //函数调用。 对于某些器件、CAN 外设采用固定计时
    // 8MHz,无论在哪种情况下调用的系统时钟如何
    // SysCtlClockGet ()应替换为80000。 请查阅数据
    //表以了解有关 CAN 外设计时的更多信息。
    //
    CANBitRateSet (CANA_base、200000000、50000);

    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;

    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();

    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();

    //
    //映射 ISR 函数
    //
    EALLOW;
    PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
    EDIS;

    //
    //配置 ADC 并为其加电
    //
    ConfigureADC();

    //
    //配置 ePWM
    //
    ConfigureEPWM();

    //
    //在通道0上设置用于 ePWM 触发转换的 ADC
    //
    SetupADCepwm (2);

    //
    //启用全局中断和更高优先级的实时调试事件:
    //
    IER |= M_INT1;//启用组1中断
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    //
    //初始化结果缓冲区
    //
    for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

    AdcaResults[resultsIndex]=0;

    resultsIndex = 0;
    bufferFull = 0;

    //
    //启用 PIE 中断
    //
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

    //
    //同步 ePWM
    //
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

    //
    //循环无限地进行转换
    //
    操作

    //
    //启动 ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式

    //
    //等待、而 ePWM 导致 ADC 转换、然后导致中断、
    //填充结果缓冲区,最终设置 bufferFull
    //flag
    //
    while (!bufferFull);
    bufferFull = 0;//清除缓冲区已满标志

    //
    //停止 ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

    //
    //此时,AdcaResults[]包含一系列转换
    //从所选通道
    //

    //
    //软件断点,再次点击运行以获取更新的转换
    //
    // asm (" ESTOP0");
    } while (1);


    //
    // ConfigureADC -写入 ADC 配置并为两者加电
    // ADC A 和 ADC B
    //
    空配置 ADC (空)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为晚期
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

    //
    //为 ADC 加电
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1ms 以允许 ADC 加电时间
    //
    DELAY_US (1000);

    EDIS;


    //
    // ConfigureEPWM -配置 ePWM SOC 并比较值
    //
    空配置 EPWM (空)

    EALLOW;
    //假设 ePWM 时钟已启用
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较 A 值设置为2048个计数
    EPwm1Regs.TBPRD = 0x1000; //将周期设置为4096个计数
    EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器
    EDIS;


    //
    // SetupADCepwm -设置 ADC ePWM 采集窗口
    //
    void SetupADCepwm (uint16通道)

    uint16 acqps;

    //
    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns


    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;


    //
    // adca1_ISR -在 ISR 中读取 ADC 缓冲器
    //
    中断 void adca1_ISR (void)

    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;

    if (results_buffer_size <= resultsIndex)

    resultsIndex = 0;
    bufferFull = 1;


    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    //
    //文件结束
    //

    //
    //启用测试模式并选择外部环回
    //
    //HWREG (CANA_base + CAN_O_CTL)|= CAN_CTL_TEST;
    //HWREG (CANA_base + CAN_O_TEST)= CAN_TEST_EXL;

    //
    //启用 CAN 以进行操作。
    //
    CANEnable (CANA_base);

    //
    //初始化将用于发送 CAN 的消息对象
    //消息。 消息将是包含一个递增的4个字节
    //值。 最初它将设置为0。
    //
    //*(unsigned long *) ucTXMsgData = 0;
    sTXCANMessage.ui32MsgID = 1; // CAN 消息 ID -使用1.
    sTXCANMessage.ui32MsgIDMask = 0; // TX 不需要掩码
    sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在 TX 上启用中断
    sTXCANMessage.ui32MsgLen = sizeof (ucTXMsgData);//消息大小为4
    sTXCANMessage.pucMsgData = ucTXMsgData; // ptr 至消息内容

    //
    //初始化将用于接收 CAN 的消息对象
    //消息。
    //
    /**(unsigned long *) ucRXMsgData = 0;
    sRXCANMessage.ui32MsgID = 1; // CAN 消息 ID -使用1.
    sRXCANMessage.ui32MsgIDMask = 0; // TX 不需要掩码
    sRXCANMessage.ui32Flags = MSG_OBJ_NO_FLAGS;
    sRXCANMessage.ui32MsgLen = sizeof (ucRXMsgData);//消息大小为4
    sRXCANMessage.pucMsgData = ucRXMsgData; // ptr 至消息内容
    *
    //
    //设置用于接收消息的消息对象
    //
    //CANMessageSet (CANA_base、2、&sRXCANMessage、MSG_OBJ_TYPE_RX);

    //
    //输入循环以发送消息。 根据、将发送一条新消息
    //秒。 4字节的消息内容将被视为无符号
    // long 并每次递增1。
    //
    for (;;)

    ucTXMsgData[0]=结果[0];
    ucTXMsgData[1]=结果[1];
    ucTXMsgData[2]=结果[2];
    ucTXMsgData[3]=结果[3];
    ucTXMsgData[4]=结果[4];
    ucTXMsgData[5]=结果[5];
    ucTXMsgData[6]=结果[6];
    ucTXMsgData[7]=结果[7];


    //
    //使用对象1发送 CAN 消息(与不一样
    // CAN ID、在本例中也是1)。 此函数将导致
    //要立即传输的消息。
    //
    CANMessageSet (CANA_base、1、&sTXCANMessage、MSG_OBJ_TYPE_TX);

    //
    //现在等待1秒后再继续
    //
    DELAY_US (1000*1000);

    //
    //获取接收消息
    //
    //CANMessageGet (CANA_base、2、&sRXCANMessage、true);

    //
    //确保接收到的数据与发送的数据匹配
    //
    /* if ((*(unsigned long *) ucTXMsgData)!=(*(unsigned long *) ucRXMsgData))

    asm (" ESTOP0");

    *
    //
    //递增发送消息数据中的值。
    //
    //(*(unsigned long *) ucTXMsgData)++;



    //
    //文件结束
    //
    ]

    调试时、它会在以下行给出错误:

    1) CANEnable (CANA_base);

    2) sTXCANMessage.ui32MsgID = 1; // CAN 消息 ID -使用1.
    sTXCANMessage.ui32MsgIDMask = 0; // TX 不需要掩码
    sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在 TX 上启用中断
    sTXCANMessage.ui32MsgLen = sizeof (ucTXMsgData);//消息大小为4
    sTXCANMessage.pucMsgData = ucTXMsgData;

    3) for (;;)

    ucTXMsgData[0]=结果[0];
    ucTXMsgData[1]=结果[1];
    ucTXMsgData[2]=结果[2];
    ucTXMsgData[3]=结果[3];
    ucTXMsgData[4]=结果[4];
    ucTXMsgData[5]=结果[5];
    ucTXMsgData[6]=结果[6];
    ucTXMsgData[7]=结果[7];


    //
    //使用对象1发送 CAN 消息(与不一样
    // CAN ID、在本例中也是1)。 此函数将导致
    //要立即传输的消息。
    //
    CANMessageSet (CANA_base、1、&sTXCANMessage、MSG_OBJ_TYPE_TX);

    //
    //现在等待1秒后再继续
    //
    DELAY_US (1000*1000);

    //
    //获取接收消息
    //
    //CANMessageGet (CANA_base、2、&sRXCANMessage、true);

    //
    //确保接收到的数据与发送的数据匹配
    //
    /* if ((*(unsigned long *) ucTXMsgData)!=(*(unsigned long *) ucRXMsgData))

    asm (" ESTOP0");

    *
    //
    //递增发送消息数据中的值。
    //
    //(*(unsigned long *) ucTXMsgData)++;




    请建议上述源代码中是否缺少任何重要命令。

    提前感谢。


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

    您好、Sumanta、

    我们通常不会直接调试代码、而是在故障排除的第一步。  请查看我之前发布的调试问题、尝试这些问题并报告确切的工作情况/不工作情况、然后我们可以根据需要执行其他调试步骤。

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

    您好 Devin、

            我会解释我目前所面对的问题。 2个 MCU 之间的数据传输。  

    1) 1)在 MCU1中、数据从 ADCIN 端口进行感应、并存储在 CAN 端口的发送器(TX)寄存器中。

    2) 2)从(TX)寄存器传输的数据应由 MCU2的接收器(RX)寄存器接收。

    操作方框图如附件图所示:

    调试时、程序数据将在存储在 MCU1 TX 寄存器中的 ADC 寄存器中进行感测。 但 MCU2 RX 寄存器无法检索相同的数据。 只要 MCU2的 ADCIN 被提供外部输入、它就会感应数据。

    它是 reqd。 单独配置 MCU2的 ADC 以接收数据、最后检查 DAC 输出、该输出将与 ADC 输入相同。

    请建议。

    提前感谢。

    此致

    Sumanta

     

    Thanga Raj Chelliah 博士

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

    Devin 正在度假、因此我将尽力为您提供帮助。

    这是我对您尝试执行的操作的理解:
    ADC 转换在 MCU1上完成。
    该转换结果由 MCU1在 CAN 总线上广播。
    3. MCU2在 CAN 总线上检索此转换结果并将其写入 DAC。

    看起来您能够在 MCU1上进行转换、但无法将转换结果传输到 MCU2。 您所面临的问题不是 ADC 或 DAC 问题、而更多是 CAN 传输问题。 请查看 C2000Ware 中的 CAN 示例以熟悉 CAN 的工作原理、如果遇到任何问题、您可以单独发布 CAN 问题、合适的 CAN 专家将解决这些问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Frank、

             正如您正确理解的那样、目前正在通过 DSP 的 CAN 端口在2个 MCU 卡之间进行数据传输

    CAN 总线。 我将解释我要执行的任务和我目前面临的困难:

    1) 1)如果转换器输入数据(消息)出现任何故障、将 通过 MCU1的 ADC 端口进行感应、该端口将通过 CAN 传输到 MCU2

      机制。

    2) 2) MCU2接收到数据后、会向辅助端口(例如 DAC、QEP 或 PWM)发送信号以执行特定操作(例如

      指示故障或关闭 PWM 信号的 LED 闪烁)。

    因此、现在我尝试生成一个事件(例如将 ADC 通道的 Vin 从0更改为+3.3V)、将相应的数据存储在的 ADC 寄存器中

    MCU1并将其发送到 MCU2、MCU2会使 LED 闪烁。

    请就源代码中的实施提出任何想法。

    提前感谢。

    此致

    Sumanta

     

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

    Sumanta、

    您要做的是、相当干净地分成3个不同的部分、这些部分不应该太难实现。 C2000Ware 中的启动代码可帮助完成这3个部分。 我建议分别编写和测试3段代码、然后在您验证所有代码均正常工作后最终合并它们。

    这可以通过中断来实现。 我认为这是一种方法、您可以采用这种方法。

    1.编写在 MCU1上转换的代码。 ADC_SoC 示例应可帮助您快速入门。

    编写代码、仅在2个 MCU 之间进行纯测试即可传输。 CAN_EXTERNAL_Transmit 示例应能让您快速入门。

    3.编写点亮 LED 的代码。 GPIO_toggle 示例应可帮助您入门。

    让各个部分正常工作后、您可以将它们粘在一起、看起来应该是这样的。

    触发 ADC 以在发生故障时转换信号。 ADC 具有多个触发源。 ADC 完成转换后、它将触发一个中断、以启动 MCU1上的 CAN 传输。 MCU2接收到一个传输中断并从 CAN 传输总线中读取数据。 接收到数据后、它会切换 LED。

    示例代码可能不一定能完全满足您的需求、但应该足以让您快速入门。

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

    目前、我在 ADC 输入端感应3.3V 电压、该电压将被数字化为:[2028、2051、2022、2040、2055、 2042、2037、2039]。 上述数据将从 MCU1发送到 MCU2。 但在 MCU2中,数据是通过以下方式获得的:[237、241、243、240、245、 246、243、246]。

    请说明传输和接收数据不相似的原因以及如何解决该问题。

    提前感谢。


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

    Sumanta、

    您是否仍在使用 CAN 在2个 MCU 之间传输数据? 查看传输和接收的数据、这并不像一个简单的丢弃字节或重新排列字节的情况。 您是否通过将 ADC 从方程中取出并仅创建和传输虚拟阵列来解决传输问题?

    我不是 CAN 专家、因此要对您面临的传输问题做出更好、更准确的响应、您必须创建有关 CAN 传输问题的新帖子。

    顺便说一下、如果您在 ADC 输入端感应3.3V 电压、那么您应该读取的值应该非常接近满量程4095。

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

    您好、Frank、

            实际上、我正在尝试在发送器和接收器变量的8位空间中容纳16位数据。 因此、即使我在处感应到3.3V

    ADC 输入显示2048而不是4096、而在接收接收器 MCU 值256时获得。 您能不能建议如何操作

    完成数据转换、以便两个 MCU 卡之间的发送和接收不会丢失数据。

    此致

    Sumanta

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

    Sumanta、

    如前所述、您应该将问题和调试步骤拆分为2个步骤、因为您面临两个完全不同的问题。

    第一个问题是 ADC 转换问题、您看到的是2048而不是4095。 您应该独立于 CAN 单独进行调试。 ADC_SoC 示例应该有所帮助。

    第二个问题是您通过 CAN 传输2048个数据、但接收256个数据。 您还应该独立于 ADC 单独调试它。 发送虚拟号码并查看您是否能够正确接收。 由于这是一个 ADC 线程、如果您无法解决第二部分、请创建有关 CAN 传输问题的新帖子。

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

    您好、Frank、

            很抱歉耽误你的回答。 实际上,我能够转换16位 ADC 输入数据,即[2428、2433、2426、....] 转换为两个8位数据、如下所示:  

    [128、131、129、.] 和[9、9、9、...] 以适应 CAN TX msg 变量中的单独8位。 现在、我要解决的问题

    AM 所面对的是合并两个8位数据并在接收器 MCU 中重新生成16位数据。 它是否是两个8位数据或的算术加法

    它需要在将8位数据与16位数据相分离时进行一些逻辑添加。 请建议。

    提前感谢。

    此致

    Sumanta   

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

    在这里、您需要采取的策略是在 C 语言中编写一个函数、以重新组合这两个字节。 馈送函数虚拟数据并观察输出。 如果输出不正确、请调整您的算法并重试、直到它适用于一组代表性的可能输入。

    您将需要反转用于解压缩数据的步骤、以便重新汇编数据。 添加两个字节将不起作用。 您可以通过上述方法进行实验验证。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sumantha、

    对于16位 ADC 转换数据、无需特殊的数学运算。 只需在传输过程中将8位 lsb 转换数据移动到第一个 CAN 消息字节、将8位 MSB 转换数据移动到第二个 CAN 消息字节。 在接收到 CAN 报文时、将第2个 CAN 报文字节与第1个报文字节组合(不添加)以获得16位转换数据。

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

    您好、Joseph、

             我已经测试了回送模式下的16位数据传输。 我能够在发送器和接收器变量中看到以下数据:

    ucTXMsgdata =[2428、2433、2426、2442、2434、 2434、2421、2433]、

    ucRXMsgdata = [2428、2433、2426、2442、2434、 2434、2421、2433]、用于3.3伏 ADC 输入

    但我面临的问题是、由于与接收器 MCU 相对应的接收器变量无法接收16位数据、因此在2个 MCU 之间进行数据传输。 如果您遇到类似问题、请提出建议。

             提前感谢。

    此致

    Sumanta  

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

    您好、Sumanta、

    我假设您已经对通过 CAN 总线通信的2个 MCU 网络进行了所有基本检查:

    1) 已检查每个 MCU 的 CAN RX/TX 引脚是否正确配置和分配(通过 GPIO 控制)并连接到收发器、其 输出连接到 CANL/H 线路。

    2) 两个 MCU 节点上使用的收发器均为3.3V 电平兼容、并且已正确加电。

    3) 出于调试目的、使用相同的 CAN 时基和波特率。

    4)  当您使用示波器探测 CAN 总线时、 您可以在尝试通过 CAN 模块发送数据时看到一些活动。

    一旦您在设置中确认了上述项目、数据传输和接收应简单明了。  接收器无法接受16位 ADC 转换数据、这对我们来说并不是什么大问题。  您需要隔离代码中传输(或接收)中断的位置。  在我看来、您已经修复了 ADC 转换问题、通过环回测试、您可以确认数据从 TX 引脚流出并进入 RX 端子。  这是一个很好的开始、但您必须确保您传输的数据正确进入 CAN 总线、因此我建议执行上面的基本 CAN 接口检查。

    希望这对您有所帮助。

    此致、

    Joseph

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

    您好、Joseph、

              感谢您的建议。 基本上、我使用的是具有相同电路和 IC 的2个 MCU。 正如您提到 的、我已经检查了每个具有 GPIO 控制的 MCU 的配置、二者都兼容3.3伏、源代码中使用相同的 CAN 时基和波特率。 我附加的波形(a)仅保持发送器 MCU 处于活动状态、(b)保持发送器和接收器 MCU 均处于活动状态、以演示通过 CAN 模块发送数据的活动。

    但与发送器变量相同的数据不会显示在接收器变量中。 请建议 CAN 总线上的信号是否正确。 此外、我需要在2个 MCU 之间的同一时刻进行20个变量的数据传输。 另请就这一问题提出建议。

    提前感谢。

    此致

    Sumanta   

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

    您能否制作一个简单的调试代码来将已知的固定值发送到 CAN 总线(与 ADC 转换值相对的常量值、因为这些常量值可能是动态的、具体取决于所转换的信号)。 如果从被传输到 CAN 总线的固定已知值开始、调试代码将会更容易。

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

    您好、Joseph、

             感谢您的建议。 为了实现一个特定的目标、我将在环回模式下运行 CAN 代码。 我已经定义了一组固定的两个输入数据、如下所示:

    uint16 ucTXMsgData1[8]={2428、2433、2426、2442、2434、2434、2421、2433}; ucRXMsgData1[8];  
    uint16 ucTXMsgData2[8]={2428、2433、2426、2442、2434、2434、2421、2433}; ucRXMsgData2[8]

    运行代码后、如果我们想更新发送器变量中的任何值、该值将以8位格式发生更改、即发送器中的2429在接收器输入端产生129。 您能不能建议对源代码进行可能的修改、以接收传输的准确数据。

    提前感谢。

    此致

    Sumanta

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

    您好、Sumanta、

    好的、现在您的问题是有道理的。  您要将16位数字传递到 TX 缓冲区、但该缓冲区定义为8位宽的 char。  所发生的情况是、您要发送的16位数字的高8位被截断、并键入 casted to char 类型、缓冲区将仅表示低8位。  对于您的示例:

       -二进制数字2429表示为16位二进制数000 1001 0111 1101

       -当您将2429移动到 TX 缓冲区时,仅容纳较低的8位(0111 1101),因此2429将为125 (8位表示)

    下面是您必须执行的操作。  在将数字移动到 TX 缓冲区之前、请先以8位格式细分数字。  请注意、一条 CAN 消息最多只允许发送8字节数据(8位数字或8个字符类型数字)。  这意味着您只能在一条消息中发送4个16位转换数据(而不能是8个)。  假设您的转换数据被定义为类型为 uint16的 adcconv。  在传输前、您可以尝试以下操作:

    uint16 adcconv;

    //第一个 ADC 转换结果

    adcconv = AdcResultsReg。ADCRESULT0; //根据您的应用使用适当的结果寄存器

    txMsgData[0]=(unsigned char) adcconv;

    txMsgData[1]= (无符号字符)(adcconv>>>8);

    //第二个 ADC 转换结果

    adcconv = AdcResultsReg。ADCRESULT0; //根据您的应用使用适当的结果寄存器

    txMsgData[2]=(无符号字符) adcconv;

    txMsgData[3]= (无符号字符)(adcconv>>8);

    //第三个 ADC 转换结果

    adcconv = AdcResultsReg。ADCRESULT0; //根据您的应用使用适当的结果寄存器

    txMsgData[4]=(unsigned char) adcconv;

    txMsgData[5]= (无符号字符)(adcconv>>>8);

    //第四个 ADC 转换结果

    adcconv = AdcResultsReg。ADCRESULT0; //根据您的应用使用适当的结果寄存器

    txMsgData[6]=(unsigned char) adcconv;

    txMsgData[7]= (无符号字符)(adcconv>>8);

    在数据接收期间、您需要将这些字节合并回16位数字以重新创建原始数据:

    uint16 adcconv

    //第一个 ADC 转换数据

    adcconv =(uint16) rxMsgData[0]+ (uint16)(rxMsgData[1]<<8);

    //第二个 ADC 转换数据

    adcconv =(uint16) rxMsgData[2]+ (uint16)(rxMsgData[3]<<8);

    //第三个 ADC 转换数据

    adcconv =(uint16) rxMsgData[4]+ (uint16)(rxMsgData[5]);

    //第四个 ADC 转换数据

    adcconv =(uint16) rxMsgData[6]+ (uint16)(rxMsgData[7]<8);

    这将解决您的数据传输问题....

    此致、

    Joseph

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

    感谢您提供源代码。 我目前正在进行相同的测试、但在两个不同 F2837x 控制卡 R1.3的两个不同 CAN 端口(即 CANA 和 CANB)之间进行双向数据传输时遇到困难。 使用示例 CAN_loopback 数据传输源代码、成功测试了同一控制卡(即1个 MCU)的特定 CANA 端口(即 GPIO 30和31)和 CANB 端口(即 GPIO 8和10)之间的数据传输。

    但同一代码无法在两个不同控制卡的两个 CAN 端口之间执行数据传输。 您能不能建议修改源代码中有关 msgid 或任何其他参数的内容、以便成功进行数据传输。

    提前感谢。

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

    您好、Sumanta、

    您关于代码未能在两个不同控制卡的两个 CAN 端口之间执行数据传输的说法有些含糊。  您能更具体吗?  您能确定问题发生在哪里吗?  是在传输过程中还是在接收过程中?  您是否有办法监控/范围 CAN 总线上的活动以查看是否有总线活动?  很遗憾、除非我知道 CAN 总线正在发生什么情况、否则我无法提出任何建议或建议。

    此致、

    Joseph

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

    您好、Joseph、

             我正在附上我目前在两个控制卡之间进行 CAN 通信工作的方框图。

    正如我在上一篇文章中提到的、CCS Studio 中的源代码已成功通过控制 CARD1的两个 CAN 端口(即 CANA 和 CANB)或控制卡 D2进行测试、  但使用相似的 CAN 端口(即控制卡 D1的 CANA 和控制卡 D2的 CANB)时、不会执行相同的操作。 所以、我问过您是否在 CAN 数据传输方面遇到过类似的问题。

    此致

    Sumanta

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

    感谢您提供系统的方框图。 抱歉、您可能之前已经回答过此问题、但我仍然不确定 CAN 收发器的位置。 F2837x 控制卡没有内置 CAN 收发器、而控制卡集线站(最新版本4.1)也没有收发器。 您是否在集线站中安装了 CAN 收发器、或者您是否具有为每个 CAN 模块提供收发器的自定义集线站?

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

    您好、Joseph、

              我尚未指定 CAN 收发器、但在我的系统设置中、收发器已固定在单独的 PCB 中、这些 PCB 连接起来形成 CAN 总线 因此、使用我之前的帖子中提到的类似架构、我已经在每个控制卡的2个 CAN 端口和每个控制卡的相似 CAN 端口之间进行了测试、在这些端口中、可以观察到数据传输问题。 请建议。

    此致

    Sumanta

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

    您好、Sumanta、

    好的、感谢您确认您的设置。  您是否可以查看 CAN 寄存器、特别是 CAN_ES (错误和状态寄存器)?  您能否告诉我您在发送节点以及接收端从该寄存器中读取的内容?  这将告诉我们您的设置正在进行什么。

    谢谢、此致、

    Joseph

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

    您好、Joseph、

             目前、如果访问相同控制卡的2个 CAN 端口进行数据传输、则在 CAN 寄存器中观察到的信息如下:

    CAN_ES 寄存器:RxOk = 1 = TxOk、但如果2个 CAN 端口(单个控制卡1个)用于数据传输、

    总线关闭状态=警告状态=错误被动状态= 1且 RxOk = 0 = TxOk、最后一个错误代码= 010。

    请建议是否可以从上述观察中获得一些状态信息。

    提前感谢。

    此致

    Sumanta  

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

    在2个 CAN 端口之间执行数据传输时、我想分享更多有关 CANA 和 CANB 寄存器状态的信息:

    在 CANA 寄存器中:

    1)最后一个错误代码(LEC)= 111、TxRqstReg1 = 01、Msg 有效寄存器1 = 01、访问数据字节(0-3)= 1、

    2)访问数据字节(4-7)= 1、发送中断使能= 1、发送请求= 1、块结束= 1、

    3) 3)数据长度代码= 1000、

    4) 4) CAN_IF1DATB 和 CAN_IF1DATA

    数据字节0 = 01111100、
    DATA_1 = 10000001、
    DATA_2 = 01111010、
    DATA_3 = 10001010、
    DATA_4 = 10000010、
    DATA_5 = 10000010、
    DATA_6 = 01110101、
    DATA_7 = 10000001、

    在 CANb 寄存器中、几乎所有参数的值都为零。

    您能否根据上述参数建议一些信息、以找出 CAN 端口之间没有正确数据传输的原因。

    提前感谢。


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

    您好、Sumanta、

    不确定您的问题是否已通过 ADC 转换和 CAN 数据传输得到解决。  如果您仍需要一些指导、请告诉我。  我没有看到弗兰克的反馈有任何回应、所以我只会与您联系。

    此致、

    Joseph

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

    总线关闭状态很好地说明了您无法通过 CAN 总线获得数据进行发送/接收的原因。 您需要调试应用程序以查看何时设置了脱离总线位。 CAN 模块中有一个功能、允许 CAN 自动从总线关闭状态中恢复。 此功能通过设置 CAN_CTL 寄存器(位9)中的 ABO 位来实现。 尝试在两个卡上的应用程序代码中设置此位、以查看此位是否可以解决您的问题。

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

    我认为这篇文章与我先前对设置的脱离总线位所做的回应有关。 从这个帖子中可以看到更多的表明 CANB 可能未初始化、这是因为您在 CANB 寄存器中看到的值为0。 我假设 CANB 是您在第二个卡上使用的模块、而 CANA 是第一个卡上使用的模块。

    在第二张卡片上、确保执行以下所有陈述:

    - CANB 的 GPIO 映射(确保使用了正确的 GPIO 通道并实际连接到收发器)
    - CANInit (CANB_BASE);CANClkSourceSelect (CANB_BASE);CANBitRateSet (CANB_BASE、您的系统速度、您的波特率); CANIntEnable (如果您决定在收到消息时使用中断、并且当然添加了中断定义和 ISR、则为 CANB 启用)

    确认上述语句在第二张卡上执行后、再次读回 CANB 寄存器的值、并确认寄存器是否仍然包含0。 首先执行这些步骤、以确保2ns 卡上的 CAN B 确实首先被正确配置。

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

    您好、Joseph、

             我已经成功测试了 CAN A 到 CAN B 的数据传输、反之亦然、通过 CAN_External_transmit

    代码。 现在、下一步是使用相同的源代码为两个单独的 MCU 卡(即 MCU1的 CANA 和 MCU2的 CANB)构建应用程序。

    因此、有必要将 CANA 或 CANB 配置为在传输模式下工作、并在接收特定信号时生成中断

    消息数据。 在使用单独的配置应用调试2个 MCU 卡时、CAN A 或 CAN B 都无法接收中的数据

    我猜、接收模式需要正确配置与 CANA 或 CANB 相关的寄存器。

    如果需要对 CAN_External_transmit 的源代码进行任何其他修改、请提出建议。  

    此致

    Sumanta