工具/软件:
您好:
我正在努力集成 CAN-FD 驱动程序、以在 基于 IWR6843AOP 的 D3 RS 6843AoP 上工作。
在 D3 Engineering、本论坛和文档的支持下、我获得了 CAN 总线上用于传输 TLV 消息的单个器件。
固件基于开箱即用演示并经过修改以利用 UART 的 CAN-FD 接口、它还使用硬编码 CLI 配置。
下一步的目的是能够使用 CAN-FD 协议通过 CAN 总线发送配置。
我在使 CAN-FD 接收器正常工作时遇到问题、只要我使用 pinmux 命令设置 RX 引脚、生成的二进制文件会在使用以下命令发送消息时停止:
错误:CANFD 实例0传输数据失败[错误代码-3502]
(我正在使用 CLI_WRITE 命令通过 UART 进行调试、以将消息打印到 CLI 控制台)
如果设置另一个 RX 引脚、生成的二进制文件会发送 CAN-FD 消息、而不会出现任何问题。
简言之、我在文档和论坛中找不到任何此行为的解决方案、也提到了 BOSCH MCAN 用户手册。
以下是使 TX 无法工作并停止整个程序的 CAN 配置:
/**************************************************************************
******************** CAN Parameters initialize Function *****************
**************************************************************************/
static void MCANAppInitParams(CANFD_MCANInitParams* mcanCfgParams)
{
/*Intialize MCAN Config Params*/
memset (mcanCfgParams, sizeof (CANFD_MCANInitParams), 0);
mcanCfgParams->fdMode = 0x1U;
mcanCfgParams->brsEnable = 0x1U;
mcanCfgParams->txpEnable = 0x0U;
mcanCfgParams->efbi = 0x0U;
mcanCfgParams->pxhddisable = 0x0U;
// Disable auto-retransmission
mcanCfgParams->darEnable = 0x1U;
mcanCfgParams->wkupReqEnable = 0x1U;
mcanCfgParams->autoWkupEnable = 0x1U;
mcanCfgParams->emulationEnable = 0x0U;
mcanCfgParams->emulationFAck = 0x0U;
mcanCfgParams->clkStopFAck = 0x0U;
mcanCfgParams->wdcPreload = 0x0U;
mcanCfgParams->tdcEnable = 0x1U;
mcanCfgParams->tdcConfig.tdcf = 0U;
mcanCfgParams->tdcConfig.tdco = 8U;
mcanCfgParams->monEnable = 0x0U;
mcanCfgParams->asmEnable = 0x0U;
mcanCfgParams->tsPrescalar = 0x0U;
mcanCfgParams->tsSelect = 0x0U;
mcanCfgParams->timeoutSelect = CANFD_MCANTimeOutSelect_CONT;
mcanCfgParams->timeoutPreload = 0x0U;
mcanCfgParams->timeoutCntEnable= 0x0U;
// Reject all remote frames:
// A remote frame is a frame that does not carry data,
// but instead requests data from another node
// CAN-FD does not support remote frames
mcanCfgParams->filterConfig.rrfe = 0x1U;
mcanCfgParams->filterConfig.rrfs = 0x1U;
// Reject Non-matching frames
// Non-matching frames are frames that do not match the
// filter configuration of the receiver
mcanCfgParams->filterConfig.anfe = 0x0U;
mcanCfgParams->filterConfig.anfs = 0x3U;
mcanCfgParams->msgRAMConfig.lss = 127U;
mcanCfgParams->msgRAMConfig.lse = 64U;
mcanCfgParams->msgRAMConfig.txBufNum = 32U;
mcanCfgParams->msgRAMConfig.txFIFOSize = 0U;
mcanCfgParams->msgRAMConfig.txBufMode = 0U;
mcanCfgParams->msgRAMConfig.txEventFIFOSize = 0U;
mcanCfgParams->msgRAMConfig.txEventFIFOWaterMark = 0U;
// FIFO0 and FIFO1 are not used
mcanCfgParams->msgRAMConfig.rxFIFO0size = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0waterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 0U;
mcanCfgParams->eccConfig.enable = 1U;
mcanCfgParams->eccConfig.enableChk = 1U;
mcanCfgParams->eccConfig.enableRdModWr = 1U;
/*
Simplify Interrupts for Debug:
Temporarily set mcanCfgParams->errInterruptEnable = 0U; while debugging reception.
Re-enable it later and ensure MCANAppErrStatusCallback handles errors correctly (clears flags).*/
mcanCfgParams->errInterruptEnable = 1U;
mcanCfgParams->dataInterruptEnable = 1U;
mcanCfgParams->appErrCallBack = MCANAppErrStatusCallback;
mcanCfgParams->appDataCallBack = MCANAppCallback;
}
/**************************************************************************
*************************** CAN Driver Initialize Function ***********************
**************************************************************************/
void Can_Initialize(void)
{
int32_t errCode = 0;
int32_t retVal = 0;
CANFD_MCANInitParams mcanCfgParams;
CANFD_MCANBitTimingParams mcanBitTimingParams;
gTxDoneFlag = 0;
gRxDoneFlag = 0;
/* Setup the PINMUX to bring out the XWR68xx CANFD pins. */
//Enable CAN transciever AOP
// D3 RS-6843AOPC: There is an enable signal on the CAN transceiver that is connected to ball C2 on the IWR6843AOP.
// * PINE15_PADAG functionality
// * Equivalent to PINC2_PADAG on XWR68XXAOP Device
Pinmux_Set_Pull(SOC_XWR68XX_PINE15_PADAG, PINMUX_PULLDOWN_EN);
// Set TX pin
// D3 RS-6843AOPC: CAN TX is on ball D1 of the IWR6843AOP.
// * PINE14_PADAE functionality
// * Equivalent to PIND1_PADAE on XWR68XXAOP Device
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINE14_PADAE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINE14_PADAE, SOC_XWR68XX_PINE14_PADAE_CANFD_TX);
// Set RX pin
// D3 RS-6843AOPC: RX is on E2.
// * PINF14_PADAJ functionality
// * Equivalent to PINE2_PADAJ on XWR68XXAOP Device
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINF14_PADAJ, SOC_XWR68XX_PINF14_PADAJ_CANFD_RX);
/* Configure the divide value for MCAN source clock */
SOC_setPeripheralClock(gMmwMCB.socHandle, SOC_MODULE_MCAN, SOC_CLKSOURCE_VCLK, 4U, &errCode);
/* Initialize peripheral memory */
SOC_initPeripheralRam(gMmwMCB.socHandle, SOC_MODULE_MCAN, &errCode);
CSL_FINSR(0x43201450, 22, 22, 0x1U);
CSL_FINSR(0x4320140C, 26, 16, 0x23U);
MCANAppInitParams (&mcanCfgParams);
/* Initialize the CANFD 0 driver */
canHandle = CANFD_init(0, &mcanCfgParams, &errCode);
if (canHandle == NULL)
{
CLI_write ("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
return;
}
/* Configuring 1Mbps and 1Mbps as nominal and data bit-rate respectively
* Bit Rate = CAN_CLK / (k(PHSEG1 + PROPSEG + PHSEG2 + 1) * BRP)
Prop seg: 8
Ph seg 1: 6
Ph Seg2 : 5
Sync jump: 1
BRP(Baud rate Prescaler): 2
Nominal Bit rate = (40)/(((8+6+5)+1)*BRP) = 1Mhz
Timing Params for Data Bit rate:
Prop seg: 1
Ph seg 1: 1
Ph Seg2 : 1
Sync jump: 1
BRP(Baud rate Prescaler): 2
Data Bit rate = (40)/(((1+1+1)+1)*BRP) = 5Mhz
*/
mcanBitTimingParams.nomBrp = 0x2U;
mcanBitTimingParams.nomPropSeg = 0x8U;
mcanBitTimingParams.nomPseg1 = 0x6U;
mcanBitTimingParams.nomPseg2 = 0x5U;
mcanBitTimingParams.nomSjw = 0x1U;
mcanBitTimingParams.dataBrp = 0x2U;
mcanBitTimingParams.dataPropSeg = 0x1U;
mcanBitTimingParams.dataPseg1 = 0x1U;
mcanBitTimingParams.dataPseg2 = 0x1U;
mcanBitTimingParams.dataSjw = 0x1U;
/* Configure the CAN driver */
retVal = CANFD_configBitTime (canHandle, &mcanBitTimingParams, &errCode);
if (retVal < 0)
{
CLI_write ("Error: CANFD Module configure bit time failed [Error code %d]\n", errCode);
return ;
}
/* Setup the transmit message object */
txMsgObjectParams.direction = CANFD_Direction_TX;
txMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
txMsgObjectParams.msgIdentifier = 0xD1;
txMsgObjHandle = CANFD_createMsgObject (canHandle, &txMsgObjectParams, &errCode);
if (txMsgObjHandle == NULL)
{
CLI_write ("Error: CANFD create Tx message object failed [Error code %d]\n", errCode);
return ;
}
/* Setup the receive message object */
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
rxMsgObjectParams.msgIdentifier = 0xA1;
rxMsgObjHandle = CANFD_createMsgObject (canHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle == NULL)
{
CLI_write ("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return ;
}
CLI_write("Debug: CANFD Instance 0 Initialization was successful\n");
}协助调查此问题、或获得 EVM 的 CAN-FD TX 和 RX 的工作示例非常有用。
谢谢你