工具与软件:
大家好、团队。
我一直在通过 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