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.

[参考译文] LP-AM243:MCAN 环回测试(中断)扩展格式实现方法

Guru**** 2455560 points
Other Parts Discussed in Thread: TCA6424

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1473087/lp-am243-mcan-loopback-test-interrupt-extended-format-realization-method

器件型号:LP-AM243
主题中讨论的其他器件:TCA6424

工具与软件:

您好、TI 团队!
我正在研究如何使用 LP-2434发送和接收经典 CAN 扩展格式。
我对经典 CAN (e2e)有很多问题、但不知道如何实现。

环境:
 CCS12.7.0
 AM243x MCU+SDK 09.02.01.05
 LP-AM2434
 R5F 应用程序 mcan_loopback_interrupt_am243x-lp_r5fss0-0_nortos_ti-arm-clang

我想修改 mcan_loopback_interrupt、以检查传统 CAN 扩展格式的环回。

问题1。 我希望具有一个示例代码。
 您是否有任何示例代码?

问题2: MCAN_extTS***()在 API 名称中有一个外部字符串。
 我无法在在线手册中找到如何使用它。
  您是否有任何示例代码?

问题3。 我不知道哪个 API 用于在线手册中列出的定义。
 如果您没有传统 CAN 扩展格式示例代码、请让我知道要使用的定义和结构名称。

问题4。 我不知道使用哪个 API 来定义在线手册中列出的定义。
 例如、
 MCAN_STD_FILT_ELEM_SET_PRIORITY
 它是在 MCAN_StdMsgIDFilterElement 结构中设置的吗?
 应将其设置为哪个成员变量?

 我想查看在线手册的附录以了解如何使用它。

我在在线文档中搜索了外部字符串、找到了很多结构、API 和定义。

此致、
Yoshiki Koide

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

    尊敬的 Yoshiki-san:

    我正在处理您的问题、请预计1-2天内得到回复。

    此致。

    开会。

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

    谢谢。
    使用3引脚接头(J11)执行环回测试。

    我在经典 CAN 环回测试之前使用 CANFD 进行测试。
    我打算在 CANFD 成功后测试经典 CAN。

    示例代码使用了 mcan_loopback_interrupt。

    执行 APP_mcanIntrISR()、但 MCAN_INTR_SRC_TRANS_COMPLETE 关闭。
    数据段中发生协议错误中断。
    该错误在 CANFD 环回测试期间发生。 我们相信它也出现在经典 CAN 上。
    我们不使用环回模式。
    有什么问题吗?

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

    尊敬的 Yoshiki-san:

    我能够在我结束时再现这种情况、请允许我多花一些时间来找到根本原因。

    此致、

    开会。

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

    大家好、Meet-San。
    您是否找到了问题的原因?

    此致、
    Yoshiki

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

    尊敬的 Yoshiki-san:

    对于延迟、我们深表歉意。

    您需要启用 CAN 收发器才能看到总线上的数据。 您所使用的是一个内部环回示例、因此未启用收发器。 您可以将 mcan_external_loopback_interrupt 作为有关如何启用收发器的参考、使用一个 mcan_transceiver 文件来启用收发器、您可以尝试在工程中集成相同的。 通常需要将 MCAN 收发器的 STB 引脚拉低才能启用。

    此致、

    开会。

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

    谢谢。 我会检查!!

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

    你好,肉山。
    我已检查 mcan_transceivers.c.

    文件路径:
     mcu_plus_sdk_am243x_10_01_00_32\examples\drivers\mcan\mcan_external_loopback_interrupt\am243x-evm\mcan_transceter.c

    我想确保与 LP2434板配合使用。
    mcan_transceivers.c 控制 STB。
    在 LP2434上、无法控制 STB。
    EVM 可以控制 STB。

    mcan_transceivers.c 在 LP2434中不可用。
    如何使用 LP2434执行外部环回?

    用户指南"AM64x/AM243x 评估模块"、P54-55
     IC 的 STB 引脚默认连接到地、以避免 IC 进入待机模式。

     STB 引脚由 GPIO 进行控制以启用待机模式。

     在 mcan_transceivers.c 中、通过 I2C 控制 TCA6424。

    用户指南"AM243x LaunchPad"、p44
     STB 引脚可由 AM243x 直接驱动以启用待机模式。
     当不由 AM243x 直接驱动时、10kΩ 下拉电阻器将 CAN 接口 IC 置于正常工作模式。


    此致、
    Yoshiki

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

    尊敬的 Yoshiki-san:

    让我在结束时尝试一下。

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

    尊敬的 Yoshiki-san:

    以下常见问题解答将指导您实现此外部环回并验证功能、请参阅相同的内容: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1329465/faq-sk-am62x-sk-am62a-lp-testing-mcan-external-loopback-example-using-external-transceiver-tcan1042d

    当您使用 AM243-LP 时、您无需使用外部收发器、因为电路板上已经提供了该收发器、但您需要将收发器的 CANL 和 CANH 连接到 PCAN 模块并按照常见问题解答中提到的步骤进行操作。

    此致、

    开会。

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

    谢谢。 我会检查!!!!!

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

    谢谢。

    CAN 通信是串行通信。
    我想我可以像连接 UART 一样连接 TX=>Rx、RX=>TX。
    但这是一个错误。

    https://software-dl.ti.com/processor-sdk-linux/esd/AM62AX/09_01_00/exports/docs/linux/How_to_Guides/Target/How_to_test_MCAN_on_AM62x.html#mcan-overview


    无法与单个电路板进行 CAN 通信。
    需要两个电路板、如图所示。
    我将有两个 LP-2434。

    AM64x/AM243x
    《主机接口技术参考手册》

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

    我正在转录第一个请求。
    "我想修改 mcan_loopback_interrupt 以检查传统 CAN 扩展格式的环回。"
    "q1.我想要示例代码、可以下载吗?"

    我在网上文档学习了经典 CAN。

     mcan_loopback_interrupt.c  此示例代码为 CANFD。
     mcan_loopback_polling.c   此示例代码为传统 CAN、CANID 为29位。

    1.将 mcan_loopback_interrupt.c 修改为 ClassicCan。
    2.我用 CANID 11位确认回送。 3.将 mcan_loopback_interrupt.c 修改为 CANID 29位。
    3.将 mcan_loopback_interrupt.c 修改为 CANID 29位。 mcan_loopback_polling.c 已确认。
    4.我通过 CANID 29位确认回送。
    5.我确认 CANID 11位通信与2个 LP 板.
    6.我确认 CANID 29位通信与2个 LP 板.

    结果:
    2:发送/接收成功
    4:接收失败。

    我不知道 CANID 29bit 为什么会发生故障。

    我已更正(*1)-(*5)。

    经典 CAN 11位:
    (* 1) MCAN_InitParams::fdMode           错
      MCAN_InitParams::brsEnable         错


    (* 2) MCAN_MsgRAMConfigParams::LSS        APP_MCAN_STD_ID_FILTER_CNT (1)
      MCAN_MsgRAMConfigParams::LSE        APP_MCAN_EXT_ID_FILTER_CNT (0)

    (* 3) MCAN_MsgRAMConfigParams::rxBufElemSize MCAN_Elem_Size_8BYTES  (0)
      MCAN_MsgRAMConfigParams::rxFIFO0ElemSize MCAN_Elem_Size_8BYTES (0)
      MCAN_MsgRAMConfigParams::rxFIFO1ElemSize MCAN_Elem_Size_8BYTES (0)
      MCAN_MsgRAMConfigParams::txBufElemSize MCAN_Elem_Size_8BYTES  (0)

    (* 4) MCAN_StdMsgIDFilterElement::sfid1      0xc0
      MCAN_StdMsgIDFilterElement::sfid2      0xc0
      MCAN_StdMsgIDFilterElement::sfec      MCAN_STD_FILT_ELEM_BUFFER (7)
      MCAN_StdMsgIDFilterElement:SFT       MCAN_STD_FILT_TYPE_CLASSIC (2)

    (* 5) MCAN_TxBufElement::DLC           MCAN_DATA_SIZE_8BYTES (0)
      MCAN_TxBufElement::FDF           错

    传统 CAN 29位:
    (* 1) MCAN_InitParams::fdMode           错
      MCAN_InitParams::brsEnable         错

    (* 2) MCAN_MsgRAMConfigParams::LSS        APP_MCAN_STD_ID_FILTER_CNT (0)
      MCAN_MsgRAMConfigParams::LSE        APP_MCAN_EXT_ID_FILTER_CNT (1)

    (* 3) MCAN_MsgRAMConfigParams::rxBufElemSize MCAN_Elem_Size_8BYTES  (0)
      MCAN_MsgRAMConfigParams::rxFIFO0ElemSize MCAN_Elem_Size_8BYTES (0)
      MCAN_MsgRAMConfigParams::rxFIFO1ElemSize MCAN_Elem_Size_8BYTES (0)
      MCAN_MsgRAMConfigParams::txBufElemSize MCAN_Elem_Size_8BYTES  (0)

    (* 4) MCAN_ExtMsgIDFilterElement::efid1      0xd0
      MCAN_ExtMsgIDFilterElement::efid2      0xd0
      MCAN_ExtMsgIDFilterElement::EFEC      MCAN_EXT_FILT_ELEM_BUFFER (7)
      MCAN_StdMsgIDFilterElement::eft.       MCAN_EXT_FILT_TYPE_CLASSIC (2)

    (* 5) MCAN_TxBufElement::id
      MCAN_TxBufElement::XTD           错
      MCAN_TxBufElement::DLC           MCAN_DATA_SIZE_8BYTES
      MCAN_TxBufElement::FDF           错

    我在做什么错?

    此致、
    Yoshiki。

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

    /// my init
    {
        /* Initialize MCAN module initParams */
        MCAN_initOperModeParams(&initParams);
        initParams.fdMode          = FALSE;					// classic canはFALSE
        initParams.brsEnable       = FALSE;					// classic canはFALSE
    }
    
    /// my msgram config
    static char trial_MCAN_MsgRAMConfigParams(uint32_t mode, MCAN_MsgRAMConfigParams *pConfig)
    {
    	MCAN_MsgRAMConfigParams	wk_cfg;
    
        if (pConfig == NULL)
        {
            return -1;
        }
    
        /*
    	 * Configure the user required msg ram params
    	 */
    
    	// This API will initialize MCAN message config RAM params to default.
        MCAN_initMsgRamConfigParams(&wk_cfg);
    
    	if (mode == MCAN_MODE_STANDARD)
    	{
    		wk_cfg.lss = LLD_MCAN_STD_ID_FILTER_CNT;		// List Size: Standard ID
    	    wk_cfg.lse = 0;									// List Size: Extended ID
    	}
    	else
    	{
    		wk_cfg.lss = 0;									// List Size: Standard ID
    	    wk_cfg.lse = LLD_MCAN_EXT_ID_FILTER_CNT;		// List Size: Extended ID
    	}
    
    	/* Maximum TX Buffer + TX FIFO, combined can be configured is 32 */
        wk_cfg.txBufCnt  = LLD_MCAN_TX_BUFF_CNT;			// (1)
        wk_cfg.txFIFOCnt = LLD_MCAN_TX_FIFO_CNT;			// (0)
    
        /* 
    	 * Buffer/FIFO mode is selected
    	 */
        wk_cfg.txBufMode = MCAN_TX_MEM_TYPE_BUF;
    
    	/* Maximum TX Event FIFO can be configured is 32 */
        wk_cfg.txEventFIFOCnt = LLD_MCAN_TX_EVENT_FIFO_CNT;
    
    	/* Maximum RX FIFO 0 can be configured is 64 */
        wk_cfg.rxFIFO0Cnt = LLD_MCAN_FIFO_0_CNT;
    
    	/* Maximum RX FIFO 1 can be configured is 64 and
    	 * rest of the memory is allocated to RX buffer which is again of max size 64 */
        wk_cfg.rxFIFO1Cnt = LLD_MCAN_FIFO_1_CNT;
    
        /* FIFO blocking mode is selected */
        wk_cfg.rxFIFO0OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
        wk_cfg.rxFIFO1OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
    
        wk_cfg.rxBufElemSize = MCAN_ELEM_SIZE_8BYTES;
        wk_cfg.rxFIFO0ElemSize = MCAN_ELEM_SIZE_8BYTES;
        wk_cfg.rxFIFO1ElemSize = MCAN_ELEM_SIZE_8BYTES;
    
    	//This API will calculate start addresses of message RAM params
        (void)MCAN_calcMsgRamParamsStartAddr(&wk_cfg);
    
    	(void)memcpy((void*)pConfig, &wk_cfg, sizeof(wk_cfg));
        return 0;
    }
    
    /// my std filter
    static char trial_StdFilterElemParams(MCAN_StdMsgIDFilterElement *pstdFiltElem)
    {
        if (pstdFiltElem == NULL)
        {
            return -1;
        }
    
        /* sfid1 defines the ID of the standard message to be stored. */
        pstdFiltElem->sfid1 = 0;
        /* As buffer mode is selected, sfid2 should be bufNum[0 - 63] */
        pstdFiltElem->sfid2 = 0;
    
        /* Store message in buffer */
    	// Store into Rx Buffer or as debug message, configuration of SFT[1:0] ignored.
        pstdFiltElem->sfec  = MCAN_STD_FILT_ELEM_BUFFER;
    
    #if 0
    uint32_t sft;		
    /**< Standard Filter Type		
     *   00 = Range filter from SFID1 to SFID2 (SFID2 ≥ SFID1)		
     *   01 = Dual ID filter for SFID1 or SFID2		
     *   10 = Classic filter: SFID1 = filter, SFID2 = mask		
     *   11 = Filter element disabled		
     */
    #endif
    
        /* Below configuration is ignored if message is stored in buffer */
        pstdFiltElem->sft   = MCAN_STD_FILT_TYPE_CLASSIC;
    
        return 0;
    }
    
    /// my std filter
    {
    	(void)trial_StdFilterElemParams(&stdFiltElem[0]);
    	stdFiltElem[0].sfid1 = pTrial->acceptanceCode;	// 0x0c
    	stdFiltElem[0].sfid2 = pTrial->acceptanceMask;	// 0x0c
    }
    
    /// my ext filter
    static char trial_ExtFilterElemParams(MCAN_ExtMsgIDFilterElement *pextFiltElem)
    {
        if (pextFiltElem == NULL)
        {
            return -1;
        }
    
        /* efid1 defines the ID of the standard message to be stored.
         * Message id configured is 0xD0 to 0xD4 */
        pextFiltElem->efid1 = 0;
        /* As fifo mode is selected, efid2 should be mask */
        pextFiltElem->efid2 = 0;
    
        /* Store message in buffer */
        //pextFiltElem->efec  = MCAN_STD_FILT_ELEM_FIFO0;
        pextFiltElem->efec  = MCAN_EXT_FILT_ELEM_BUFFER;
     
    #if 0
    uint32_t eft;								
    /**< Extended Filter Type								
     *   00 = Range filter from EFID1 to EFID2 (EFID2 ≥ EFID1)								
     *   01 = Dual ID filter for EFID1 or EFID2								
     *   10 = Classic filter: EFID1 = filter, EFID2 = mask								
     *   11 = Range filter from EFID1 to EFID2 (EFID2 ≥ EFID1),								
     *        XIDAM mask not applied								
     */								
    #endif
       /* Below configuration is ignored if message is stored in buffer */
        pextFiltElem->eft   = MCAN_STD_FILT_TYPE_CLASSIC;
    
        return 0;
    }
    
    /// my ext filter
    {
    	(void)trial_ExtFilterElemParams(&extFiltElem[0]);
    	extFiltElem[0].efid1 = pTrial->acceptanceCode;	// 0xd0
    	extFiltElem[0].efid2 = pTrial->acceptanceMask;	// 0xd0
    }
    
    /// my send config
    char trial_SendConfig(
    			uint32_t				baseAddr,
    			uint32_t				mode,
    			TRIAL_t*				pTrial,
    			MCAN_TxBufElement*		plld_tx )
    {
    	MCAN_TxBufElement	wk_tx;
    	uint8_t             ii;
    
    	/* Initialize message to transmit */
        MCAN_initTxBufElement(&wk_tx);
    
    	/**< Identifier */
    	wk_tx.id = (uint32_t)pTrial->id;
    
    	/**< Remote Transmission Reques
    	     *   0 = Transmit data frame
    	     *   1 = Transmit remote frame
    	*/
    	wk_tx.rtr = pTrial->frame;
    
    	/**< Extended Identifier
    	     *   0 = 11-bit standard identifier
    	     *   1 = 29-bit extended identifier
    	*/
    	wk_tx.xtd = TRUE;
    	//if( m_UsrParam[channel].mode == MCAN_MODE_STANDARD )
    	if( mode == MCAN_MODE_STANDARD )
    	{
    		wk_tx.xtd = FALSE;
    	}
    
    	/**< FD Format	
    	     *   0 = Frame transmitted in Classic CAN format	
    	     *   1 = Frame transmitted in CAN FD format	
    	*/
    	wk_tx.fdf = FALSE;
    
    	/**< Data Length Code
    	     *   0-8  = CAN + CAN FD: transmit frame has 0-8 data bytes
    	     *   9-15 = CAN: transmit frame has 8 data bytes
    	     *   9-15 = CAN FD: transmit frame has 12/16/20/24/32/48/64 data bytes
    	*/
    	wk_tx.dlc = pTrial->length;
    
    	for(ii = 0; ii < pTrial->length; ii++)
    	{
    		wk_tx.data[ii] = pTrial->data[ii];
    	}
    
    	memcpy((void*)plld_tx, &wk_tx, sizeof(wk_tx));
    
    	return 0;
    }

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

    中断状态(INT 状态)的值为0x0000 8200。


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

    我的参数有什么问题?

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

    尊敬的 Yoshki-san:

    请允许我多花一些时间来回顾代码并给您回复。

    此致、

    开会。

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

    mcan_loopback_interrupt.c 设置以下结构
     MCAN_InitParams
     MCAN_ConfigParams
     MCAN_MsgRAMConfigParams
     MCAN_StdMsgIDFilterElement
     MCAN_ExtMsgIDFilterElement
     MCAN_BitTimingParams
     MCAN_TxBufElement

    我认为通过修改这些结构、我可以发送和接收 CANID 11位和29位。 我是对吗?

    此致、
    Yoshiki。

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

    尊敬的 Thaker:

    这里有很多讨论。

    首先、您能否将29位模式用于内部循环回路、对其进行测试 并与 Yoshiki-san 共享代码?

    谢谢你。

    此致、

    Kasai

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

    尊敬的 Kasai-San、Yoshiki-San、

    mcan_loopback_polling 使用29位 ID、我知道 Yoshiki-san 尝试为中断示例启用相同的 ID、并面临一些问题。 请注意、中断示例使用缓冲器模式、如果您使用缓冲器模式、efid2必须设置为缓冲器编号、我看到它在此处设置为0xD0、我不确定原因、但理想情况下应设置为缓冲器编号。 我将尝试在结尾处运行示例、并让您知道此处可能需要进行哪些其他更改。

    此致、

    开会。