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

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

器件型号:LAUNCHXL-F28379D

工具与软件:

大家好、团队。

我一直在通过 Launchxl F28379D 处理 CAN 通信。 我用过它将数据传递到 CAN 总线。 我的目标是传输该板作为输入接收到的数据。 我已成功发送数字输入数据、但一直在发送模拟输入数据。 我需要有关此问题的帮助。  

我正在附加我正在使用的代码片段。  

#include "driverlib.h"
#include "device.h"

#define TX_MSG_OBJ_ID 1.
#define TX_MSG_OBJ_ID_ADC 2 //为 ADC 数据添加新消息对象 ID
#define MSG_DATA_LENGTH 8.

uint8_t txMsgData[8];//要发送的数据
uint8_t txAdcData[8];//发送 ADC 结果的数据

void checkCANStatus (void){
uint16_t canStatus = HWREGH (CANA_BASE + CAN_O_ES);

if (canStatus & CAN_ES_Boff){
//处理总线关闭错误
}
如果(canStatus 和 CAN_ES_EPASS){
//处理错误被动条件
}
如果(canStatus 和 CAN_ES_EWARN){
//处理错误警告条件
}
}

void initCAN (void){
//像以前一样初始化 CAN-A 和 CAN-B 模块
can_initModule (cana_base);
CAN_setBitRate (CANA_BASE、DEVICE_SYSCLK_FREQ、500000、16);
//设置 CAN-A 和 CAN-B 的发送消息对象
CAN_setupMessageObject (CANA_BASE、TX_MSG_OBJ_ID、0x18FB47FF、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANA_BASE、TX_MSG_OBJ_ID_ADC、0x18FF47FF、// ADC 数据的新消息 ID
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、500000、16);
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID、0x18FB47FF、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID_ADC、0x18FF47FF、//对于 CAN-B 也是如此
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);

can_startModule (cana_base);
can_startModule (cNB_BASE);
}

void initADC (void){
ADC_setPrescaler (ADCA_BASE、ADC_CLK_DIV_4_0);
ADC_setMode (ADCA_BASE、ADC_Resolution_12bit、ADC_MODE_single_ended);
//增加采样窗口(例如128)以提供稳定性
ADC_setupSOC (ADCA_BASE、ADC_SOC_Number3、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN3128);
ADC_setInterruptPulseMode (ADCA_BASE、ADC_PULSE_END_OF_CONV);
ADC_enableConverter (ADCA_BASE);
DEVICE_DELAY_US (1000);//延迟以使 ADC 稳定
}

uint16_t readADC (void){
ADC_forceSOC (ADCA_BASE、ADC_SOC_Number3);
//等待 ADC 转换而不阻塞其他进程
while (! ADC_getInterruptStatus (ADCA_BASE、ADC_INT_number1){
//这里的小延迟或产量函数可以帮助管理时序
}
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_number1);
返回 ADC_readResult (ADCARESULT_BASE、ADC_SOC_Number3);
}

void main (void){
device_init();
device_initGPIO();

//为 CAN-A 和 CAN-B 配置 GPIO 引脚
GPIO_setPinConfig (GPIO_30_CANRXA);
GPIO_setPinConfig (GPIO_31_CANTXA);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);

//配置数字输入引脚(例如 GPIO32)
GPIO_setPadConfig (32、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (32、GPIO_DIR_MODE_IN);

initCAN();
initADC();

while (1){
//读取数字输入引脚状态(1或0)
uint16_t digitalInput = GPIO_readPin (32);

//使用数字输入值更新 txMsgData
txMsgData[0]=(digitalInput)? 0xFF:0x00;//对高电平使用0xFF、对低电平使用0x00

//通过 CAN-A 发送数字输入状态
can_sendMessage (CANA_BASE、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、txMsgData);

//在出现错误时检查 CAN 状态
checkCANStatus();

//读取 ADC 值并准备要传输的数据
uint16_t adcValue = readADC ();
txAdcData[0]=(adcValue >> 8)& 0xFF;//高字节
txAdcData[1]= adcValue & 0xFF;//低字节

//通过 CAN-A 传输 ADC 数据
can_sendMessage (CANA_BASE、TX_MSG_OBJ_ID_ADC、2、txAdcData);

//主循环的简单延迟-针对所需的传输频率进行调整
DEVICE_DELAY_US (1000000);
}
}

当我调试并运行这个代码时、只传送一条消息。 在同一代码中、当我注释掉 ADC 部分时、数字输入部分在发送过程中不会出现任何错误。 此外、我需要在完成 ADC 输入部分后将数字输出和 DAC 输出添加到此代码中。 因此也请为它们提供方法建议

我需要有关此问题的帮助。  

此致、

Chirag

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

    Chirag、您好!

    我没有看到发送数字数据(txMsgData)和 ADC 数据(txAdcData)之间有什么区别。 在 checkCANStatus()传输数字数据后的状态位是什么?

    如果注释掉传输数字消息的指令、那么模拟 TX 是否工作?

    // can_sendMessage (CANA_BASE、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、txMsgData);

    //checkCANStatus();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但我滞留在传输模拟输入数据[/报价]

    代码卡在 can_sendMessage()函数中的什么位置?

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

    尊敬的 Wang:  

    当我注释掉数字部分时、模拟部分不进行传输。 无法找到代码卡住的位置、我猜是 ADC 传输部分有一些问题。 我是否需要调整任何配置或项目设置?  

    此致