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.

[参考译文] LAUNCHXL-F28379D:LAUNCHXL-F28379D

Guru**** 2478765 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1464080/launchxl-f28379d-launchxl-f28379d

器件型号:LAUNCHXL-F28379D

工具与软件:

团队成员、您好!  

我使用的是  LAUNCHXL-F28379D、我目前正在使用其中的 CAN 通信。 在那里,我没有建立沟通的问题。 然而、我在处理 ADCIN 数据时遇到了问题。 我想 通过 CAN 将板上的 GPIO 引脚的数据传输到中央计算机。  

我已经成功地从数字 GPIO 引脚传输了数据、但来自 ADC 引脚的数据对我来说是个问题。 关于与 ADCIN 引脚对应的数据传输、我需要帮助。  

我附加了用于 ADCIN 引脚的语法。  

//
//包含的文件
//
#include "device.h"
#include "driverlib.h"
#include "F28x_Project.h"// DSP28x 头文件


#include
#include
#include
#include

#define TX_MSG_OBJ_ID 1.
#define MSG_DATA_LENGTH 8.

//
//对 ADC 数据进行采样的函数
//
int16_t 采样 ADC (void)

int16_t 采样;

//
//在 SOC0上强制开始转换
//
AdcaRegs.ADCSOCFRC1.all = 0x01;

//
//等待转换结束
//
while (AdcaRegs.ADCINTFLG.bit.ADCINT1 = 0)

//等待 ADCINT1
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// Clear ADCINT1

//
//从 SOC0获取 ADC 采样结果
//
样本= AdcaResultRegs.ADCRESULT0;

返回样品;
}

//
//用于初始化 ADC 的函数
//
void 初始化 ADC (void)

EALLOW;

//
//配置 ADC 时钟预分频器
//
AdcaRegs.ADCCTL2.bit.prescale = 6;

//
//设置 ADC 分辨率和信号模式
//
AdcSetMode (ADC_ADCA、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);

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

//
//打开 ADC 的电源
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 上电
//
DEVICE_DELAY_US (1000);

//
//配置 SOC0以对 ADCIN14进行采样
//
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0x0E;// SOC0将转换引脚 ADCIN14
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 25;//采样窗口为25+1个 SYSCLK 周期

//
//为 SOC0配置中断
//
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0 end of SOC0将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;// Enable INT1 flag (启用 INT1标志)
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// Clear INT1 flag (清除 INT1标志)

EDIS;
}

//
//检查 CAN 状态的功能
//
void checkCANStatus (void)

uint16_t canStatus = HWREGH (CANB_BASE + CAN_O_ES);

IF (canStatus 和 CAN_ES_Boff)

//处理总线关闭错误
}
IF (CANStatus 和 CAN_ES_EPASS)

//处理错误被动条件
}
中频(canStatus 和 CAN_ES_EWARN)

//处理错误警告条件
}
}

//
// Main 函数
//
void main (void)

//
//初始化设备和外设
//
device_init();
device_initGPIO();

//
//为 CAN 配置 GPIO
//
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);

//
//初始化 ADC
//
initializeadc();


//
//初始化 CAN 模块
//
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、250000、16);

//
//配置 CAN 消息目标
//
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID、0x181、
CAN_MSG_FRAME_STD、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);

//
//启动 CAN 模块
//
can_startModule (cNB_BASE);

while (1)

//
//获取 ADC 样本
//
int16_t adcData = sampleADC ();

//
//准备 CAN 消息数据
//
uint16_t txMsgData_1[8]={0};
txMsgData_1[0]=(uint16_t)(adcData & 0xFF);// ADC 数据的低8位
txMsgData_1[1]=(uint16_t)((adcData >> 8)& 0xFF);// ADC 数据的高8位

//
//通过 CAN 发送 ADC 数据
//
can_sendMessage (CANB_BASE、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、txMsgData_1);


while (((HWREGH (CANB_BASE + CAN_O_ES)和 CAN_ES_TXOK))= CAN_ES_TXOK)

}


DEVICE_DELAY_US (500000);
}
}

任何类型的帮助都将是非常有帮助的。  

此致

Gourav

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

    您好 Gourav、

    关于这个问题、我有一些想法供您考虑:
    首先、消息数据数组是8个字节、但只有两个字节被填充。 如果接收器期望完整的8字节消息在代码中创建标志、这个不匹配可能会导致问题。

    此外、ADC 值被转换为 uint16_t、由于它已经是16位、因此实际并不需要该值。 如果 ADC 结果实际上是一个12位值、你能将它打包到12位 CAN 消息中吗?
    最后、while 环路中的延迟(device_delay_US (500000);)位于传输检查之后。 如果环路卡住、可能会导致传输间隔不一致。 最好将延迟置于任何潜在的阻塞情况之外。

    此致、

    Masoud

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

    您好、Masoud:  

    感谢您的帮助、但我已经弄清楚了。 做了一些修整和做了。  

    此致。

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

    很高兴听到问题已解决! 请告诉我们问题的根源是什么。

    此致、

    Masoud

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

    存在一些链接错误。 我刚刚在 ADC 初始化和 CAN 传输中添加了一些延迟、这消除了错误、并且还在 can.h 文件中手动添加了一些配置。