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:CANbus Tx 中断处理

Guru**** 2471920 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1478287/launchxl-f28379d-canbus-tx-interrupt-handling

器件型号:LAUNCHXL-F28379D

工具与软件:

您好、论坛:
我在针对 f2837d launchpad 触发通道 B 的 CANbus Tx 中断时遇到问题。

我想我已经正确设置了所有内容、但中断服务例程函数要么从未进入、要么更糟糕的是、以一个永无休止的周期不断地进入(我100%遗漏了一些内容)。

只要我排除了中断部分、消息就会正确传输、因为我使用 CAN 分析仪对其进行了认证。

这是我实现的代码、用于解释一些 C2000缓冲函数。


// CANBUS B 中断初始化

EALLOW;

PieVectTable.CANB0_INT =&CANB_ISR;


PieCtrlRegs.PIEIER9.bit.INTx7 = 1;

IER |= M_INT9;

EDIS;



CanbRegs.CAN_CTL.bit.DAR = 0;// Disable automatic retransmission (禁用自动重新传输)

CanbRegs.CAN_CTL.bit.Test = 0;// Enable test mode and select external loopback (启用测试模式并选择外部环回)
CanbRegs.CAN_TEST.bit.EXL = 0;// External Loopback (外部环回)

//
//初始化将用于发送 CAN 的消息对象
//消息。
//

//最后一个参数是:
// 1 (TxIE 已启用)
// 0表示 TxIE 禁用
setupMessageObject (CAN_TX_MSG_OBJ_1、CAN_MSG_ID_0、MSG_OBJ_TYPE_TRANSMIT、1);


CanbRegs.CAN_CTL.bit.Init = 0;// Enable CAN for operation (启用 CAN 以进行操作)

CanbRegs.CAN_CTL.bit.IE0 = 1;
CanbRegs.CAN_CTL.bit.SIE = 1;
CanbRegs.CAN_GLB_INT_EN.bit.GLBINT0_EN = 1;

EINT;//启用全局中断 INTM
erTM;//启用全局实时中断 DBGM

//超级循环

while (1){
sendCANMessage (CAN_TX_MSG_OBJ_1);
DELAY_US(1000*1000);
}




功能:


void setupMessageObject (uint32_t Objid、uint32_t msgid、msgObjType msgType、uint16_t int_tx)

//
//为 IF1CMD 使用 Shadow 变量。 IF1CMD 应写入
//单个32位写入。
//
UNION CAN_IF1CMD_REG CAN_IF1CMD_SHADOW;

//
等待 BUSY 位清零
//
while (CanbRegs.CAN_IF1CMD.bit.busy)

}

//
//清除和写入寄存器以对消息目标进行编程。
//
CAN_IF1CMD_SHADON.ALL = 0;
CanbRegs.CAN_IF1MSK.All = 0;
CanbRegs.CAN_IF1ARB.all = 0;
CanbRegs.CAN_IF1MCTL.ALL = 0;

//
//设置 Control (控制)、Mask (掩码)和 ARB 位、以便将其传输到
//消息对象。
//
CAN_IF1CMD_SHADON.BIT.Control = 1;
can_IF1CMD_shadow.bit.arb = 1;
CAN_IF1CMD_SHADON.bit.Mask = 1;
CAN_IF1CMD_SHADON.BIT.DIR = 1;

//
//设置发送方向
//
if (msgType == MSG_OBJ_TYPE_TRANSMIT)

CanbRegs.CAN_IF1ARB.bit.Dir = 1;
}

//
//设置消息 ID (此示例假设采用11位 ID 掩码)
//
CanbRegs.CAN_IF1ARB.bit.ID =(msgid << CAN_MSG_ID_SHIFT);
CanbRegs.CAN_IF1ARB.bit.MsgVal = 1;

//
//设置数据长度、因为此值是针对所有传输设置的。 这是
//这也是一个单次传输而不是一个 FIFO 传输、因此应设置 EOB 位。
//
CanbRegs.CAN_IF1MCTL.bit.DLC = messageSize;
CanbRegs.CAN_IF1MCTL.bit.EOB = 1;


//请求 Tx 中断
//在这里、我决定在消息传输中生成一个中断
CanbRegs.CAN_IF1MCTL.bit.TxIE = int_TX;
CanbRegs.CAN_IF1MCTL.bit.IntPnd = 0;

//
//将数据传输到消息对象 RAM
//
CAN_IF1CMD_SHADON.BIT.MSG_NUM = Objid;
CanbRegs.can_IF1CMD.all = can_IF1CMD_shadow.all;
}

//
// sendCANMessage -从指定的报文对象发送数据
//
void sendCANMessage (uint32_t Objid)

//
//为 IF1CMD 使用 Shadow 变量。 IF1CMD 应写入
//单个32位写入。
//
UNION CAN_IF1CMD_REG CAN_IF1CMD_SHADOW;

//
等待 BUSY 位清零
//
while (CanbRegs.CAN_IF1CMD.bit.busy)

}

//
//写入数据以传输到 DATA-A 和 DATA-B 接口寄存器
//
uint16_t 索引;
for (index = 0;index < messageSize;index++)

开关(索引)

情况0:
CanbRegs.CAN_IF1DATA.bit.Data_0 = ucTXMsgData[index];
休息;
案例1:
CanbRegs.CAN_IF1DATA.bit.Data_1 = ucTXMsgData[index];
休息;
案例2:
CanbRegs.CAN_IF1DATA.bit.Data_2 = ucTXMsgData[index];
休息;
案例3:
CanbRegs.CAN_IF1DATA.bit.Data_3 = ucTXMsgData[index];
休息;
情况4:
CanbRegs.CAN_IF1DATB.bit.Data_4 = ucTXMsgData[index];
休息;
情况5:
CanbRegs.CAN_IF1DATB.bit.Data_5 = ucTXMsgData[index];
休息;
情况6:
CanbRegs.CAN_IF1DATB.bit.Data_6 = ucTXMsgData[index];
休息;
情况7:
CanbRegs.CAN_IF1DATB.bit.Data_7 = ucTXMsgData[index];
休息;
}
}

//
//设置写入方向以及设置要传输的 DATA-A/DATA-B
//消息对象
//
CAN_IF1CMD_SHADON.ALL = 0;
CAN_IF1CMD_SHADON.BIT.DIR = 1;
CAN_IF1CMD_SHADON.bit.DATA_A = 1;
CAN_IF1CMD_SHADON.bit.DATA_B = 1;

//
//设置 Tx 请求位
//
CAN_IF1CMD_SHADON.bit.TXRQST = 1;


//
//将报文对象传输到指定的报文对象
// Objid。
//
CAN_IF1CMD_SHADON.BIT.MSG_NUM = Objid;
CanbRegs.can_IF1CMD.all = can_IF1CMD_shadow.all;
}



_interrupt void canb_isr (void){

DBG_CAN++;


if (((CanbRegs.CAN_IF1MCTL.bit.IntPnd)&&(CanbRegs.CAN_INT.bit.INT0ID = 1)){
GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
CanbRegs.CAN_IF1CMD.bit.ClrIntPnd = 1;

}


CanbRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;
PieCtrlRegs.PIEACK.bit.ACK9 = 1;

}


我设计了 ISR 函数、而其他两个函数已经形成。

有人能帮我吗?
提前感谢您!

Elia