打印
[技术问答]

请问M467的CANFD的fifo是哪里的问题!谢谢

[复制链接]
1627|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2024-6-20 17:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
期望实现4个CANFD通道的fifo分配与测试;发现并不顺利!
请指出代码问题

/************************************************************************************************//*
* @file     main.c
* @version  V1.00
* @brief    An example of M460 CAN FD Transmition .
*
* SPDX-License-Identifier: Apache-2.0
* @CopyRight (C) 2021 Nuvoton Technology Corp. All rights reserved.
**************************************************************************************************/

#include "stdio.h"
#include "string.h"
#include "NuMicro.h"
#include "gv.h"


CANFD_BUF_T __attribute__((section(".ARM.__at_0x40020200"))) CANFD0_Txfifo[2];
CANFD_BUF_T __attribute__((section(".ARM.__at_0x40024200"))) CANFD1_Txfifo[2];
CANFD_BUF_T __attribute__((section(".ARM.__at_0x40028200"))) CANFD2_Txfifo[2];
CANFD_BUF_T __attribute__((section(".ARM.__at_0x4002C200"))) CANFD3_Txfifo[2];

uint8_t u8Item = 0;

uint32_t u32TimeOutCnt0 = 0;
uint32_t u32TimeOutCnt1 = 0;
uint32_t u32TimeOutCnt2 = 0;
uint32_t u32TimeOutCnt3 = 0;


void TIM1_Init(void)
{
    TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, 100000);//1khz中断一次
    TIMER_EnableInt(TIMER1);
    NVIC_EnableIRQ(TMR1_IRQn);
    TIMER_Start(TIMER1);
}

void TMR1_IRQHandler(void)
{
    if (++u8Item > 1) u8Item = 0;

    TIMER_ClearIntFlag(TIMER1);
}

void SYS_Init(void)
{

    /* Set PF multi-function pins for XT1_OUT(PF.2) and XT1_IN(PF.3) */
    SET_XT1_OUT_PF2();
    SET_XT1_IN_PF3();

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable HIRC and HXT clock */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk | CLK_PWRCTL_HXTEN_Msk);

    /* Wait for HIRC and HXT clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk | CLK_STATUS_HXTSTB_Msk);

    /* Set PCLK0 and PCLK1 to HCLK/2 */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1);

    /* Set core clock to 200MHz */
    CLK_SetCoreClock(200000000);

    /* Enable all GPIO clock */
    CLK->AHBCLK0 |= CLK_AHBCLK0_GPACKEN_Msk | CLK_AHBCLK0_GPBCKEN_Msk | CLK_AHBCLK0_GPCCKEN_Msk | CLK_AHBCLK0_GPDCKEN_Msk |
                    CLK_AHBCLK0_GPECKEN_Msk | CLK_AHBCLK0_GPFCKEN_Msk | CLK_AHBCLK0_GPGCKEN_Msk | CLK_AHBCLK0_GPHCKEN_Msk;
    CLK->AHBCLK1 |= CLK_AHBCLK1_GPICKEN_Msk | CLK_AHBCLK1_GPJCKEN_Msk;

    CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HCLK_DIV2, 0);


    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));
    CLK_EnableModuleClock(UART0_MODULE);

    /* Set IP clock */
    CLK_SetModuleClock(CANFD0_MODULE, CLK_CLKSEL0_CANFD0SEL_HCLK, CLK_CLKDIV5_CANFD0(1));
    CLK_SetModuleClock(CANFD1_MODULE, CLK_CLKSEL0_CANFD1SEL_HCLK, CLK_CLKDIV5_CANFD1(1));
    CLK_SetModuleClock(CANFD2_MODULE, CLK_CLKSEL0_CANFD2SEL_HCLK, CLK_CLKDIV5_CANFD2(1));
    CLK_SetModuleClock(CANFD3_MODULE, CLK_CLKSEL0_CANFD3SEL_HCLK, CLK_CLKDIV5_CANFD3(1));
    /* Enable IP clock */
    CLK_EnableModuleClock(CANFD0_MODULE);
    CLK_EnableModuleClock(CANFD1_MODULE);
    CLK_EnableModuleClock(CANFD2_MODULE);
    CLK_EnableModuleClock(CANFD3_MODULE);

    CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1SEL_PCLK0, MODULE_NoMsk);
    CLK_EnableModuleClock(TMR1_MODULE);

    /*--------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                    */
    /*--------------------------------------------------------------------------------------------*/

    SET_UART0_RXD_PB12();       // Set multi-function pins for UART0 RXD and TXD
    SET_UART0_TXD_PB13();


    //CAN
    SET_CAN0_TXD_PD11();
    SET_CAN0_RXD_PD10();

    SET_CAN1_TXD_PC13();
    SET_CAN1_RXD_PD12();

    SET_CAN2_TXD_PB9();
    SET_CAN2_RXD_PB8();

    SET_CAN3_TXD_PF11();
    SET_CAN3_RXD_PF10();

}

void CANFD0_TX_fifo_Init(void)
{
    CANFD0_Txfifo[0].u32Id       = 0x001 << 18 ;                    // SID = 0x111
    CANFD0_Txfifo[0].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=8 mean 8 Bytes

    CANFD0_Txfifo[1].u32Id       = 0x002 << 18 ;                    // SID = 0x113
    CANFD0_Txfifo[1].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=9 =12 Bytes

    CANFD0_Txfifo[0].au32Data[0] = 0x11111111;
    CANFD0_Txfifo[1].au32Data[0] = 0x22222222;
}

void CANFD1_TX_fifo_Init(void)
{
    CANFD1_Txfifo[0].u32Id       = 0x011 << 18 ;                    // SID = 0x111
    CANFD1_Txfifo[0].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=8 mean 8 Bytes

    CANFD1_Txfifo[1].u32Id       = 0x012 << 18 ;                    // SID = 0x113
    CANFD1_Txfifo[1].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=9 =12 Bytes

    CANFD1_Txfifo[0].au32Data[0] = 0x11111111;
    CANFD1_Txfifo[1].au32Data[0] = 0x22222222;
}

void CANFD2_TX_fifo_Init(void)
{
    CANFD2_Txfifo[0].u32Id       = 0x021 << 18 ;                    // SID = 0x111
    CANFD2_Txfifo[0].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=8 mean 8 Bytes

    CANFD2_Txfifo[1].u32Id       = 0x022 << 18 ;                    // SID = 0x113
    CANFD2_Txfifo[1].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=9 =12 Bytes

    CANFD2_Txfifo[0].au32Data[0] = 0x11111111;
    CANFD2_Txfifo[1].au32Data[0] = 0x22222222;
}

void CANFD3_TX_fifo_Init(void)
{
    CANFD3_Txfifo[0].u32Id       = 0x031 << 18 ;                    // SID = 0x111
    CANFD3_Txfifo[0].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=8 mean 8 Bytes

    CANFD3_Txfifo[1].u32Id       = 0x032 << 18 ;                    // SID = 0x113
    CANFD3_Txfifo[1].u32Config   = 0x00300000 + 0x000F0000 ;        // DLC=9 =12 Bytes

    CANFD3_Txfifo[0].au32Data[0] = 0x11111111;
    CANFD3_Txfifo[1].au32Data[0] = 0x22222222;
}

void CANFD0_Tx_Init(CANFD_T *psCanfd, int16_t TxBuff_Quantity, int16_t DLC_Max, uint16_t TxBuff_StartAddr)
{
    psCanfd->TXBC = (TxBuff_Quantity << CANFD_TXBC_NDTB_Pos)
                    + TxBuff_StartAddr ;

    psCanfd->TXESC = DLC_Max <<  CANFD_TXESC_TBDS_Pos;
}
void CANFD1_Tx_Init(CANFD_T *psCanfd, int16_t TxBuff_Quantity, int16_t DLC_Max, uint16_t TxBuff_StartAddr)
{
    psCanfd->TXBC = (TxBuff_Quantity << CANFD_TXBC_NDTB_Pos)
                    + TxBuff_StartAddr ;

    psCanfd->TXESC = DLC_Max <<  CANFD_TXESC_TBDS_Pos;
}
void CANFD2_Tx_Init(CANFD_T *psCanfd, int16_t TxBuff_Quantity, int16_t DLC_Max, uint16_t TxBuff_StartAddr)
{
    psCanfd->TXBC = (TxBuff_Quantity << CANFD_TXBC_NDTB_Pos)
                    + TxBuff_StartAddr ;

    psCanfd->TXESC = DLC_Max <<  CANFD_TXESC_TBDS_Pos;
}
void CANFD3_Tx_Init(CANFD_T *psCanfd, int16_t TxBuff_Quantity, int16_t DLC_Max, uint16_t TxBuff_StartAddr)
{
    psCanfd->TXBC = (TxBuff_Quantity << CANFD_TXBC_NDTB_Pos)
                    + TxBuff_StartAddr ;

    psCanfd->TXESC = DLC_Max <<  CANFD_TXESC_TBDS_Pos;
}

void CANFD0_TxTest(CANFD_T *psCanfd, uint8_t cnt)
{
    switch (cnt)
    {
        case 0:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt0 == 0) break;
            }
            psCanfd->TXBAR = 1 << 0 ;
            break;

        case 1:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt0 == 0) break;
            }
            psCanfd->TXBAR = 1 << 1 ;
            break;

        default:
            break ;
    }
}

void CANFD1_TxTest(CANFD_T *psCanfd, uint8_t cnt)
{
    switch (cnt)
    {
        case 0:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt1 == 0) break;
            }
            psCanfd->TXBAR = 1 << 0 ;
            break;

        case 1:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt1 == 0) break;
            }
            psCanfd->TXBAR = 1 << 1 ;
            break;

        default:
            break ;
    }
}

void CANFD2_TxTest(CANFD_T *psCanfd, uint8_t cnt)
{
    switch (cnt)
    {
        case 0:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt2 == 0) break;
            }
            psCanfd->TXBAR = 1 << 0 ;
            break;

        case 1:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt2 == 0) break;
            }
            psCanfd->TXBAR = 1 << 1 ;
            break;

        default:
            break ;
    }
}

void CANFD3_TxTest(CANFD_T *psCanfd, uint8_t cnt)
{
    switch (cnt)
    {
        case 0:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt3 == 0) break;
            }
            psCanfd->TXBAR = 1 << 0 ;
            break;

        case 1:
            while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE)
            {
                if (--u32TimeOutCnt3 == 0) break;
            }
            psCanfd->TXBAR = 1 << 1 ;
            break;

        default:
            break ;
    }
}

void CANFD0_Init(void)
{
    CANFD_FD_T sCANFD_Config0;
    SYS_ResetModule(CANFD0_RST);
    CANFD_GetDefaultConfig(&sCANFD_Config0, CANFD_OP_CAN_FD_MODE);
    sCANFD_Config0.sBtConfig.sNormBitRate.u32BitRate = 500000;
    sCANFD_Config0.sBtConfig.sDataBitRate.u32BitRate = 2000000;
    CANFD_Open(CANFD0, &sCANFD_Config0);
}

void CANFD1_Init(void)
{
    CANFD_FD_T sCANFD_Config1;
    SYS_ResetModule(CANFD1_RST);
    CANFD_GetDefaultConfig(&sCANFD_Config1, CANFD_OP_CAN_FD_MODE);
    sCANFD_Config1.sBtConfig.sNormBitRate.u32BitRate = 500000;
    sCANFD_Config1.sBtConfig.sDataBitRate.u32BitRate = 2000000;
    CANFD_Open(CANFD1, &sCANFD_Config1);
}

void CANFD2_Init(void)
{
    CANFD_FD_T sCANFD_Config2;
    SYS_ResetModule(CANFD2_RST);
    CANFD_GetDefaultConfig(&sCANFD_Config2, CANFD_OP_CAN_FD_MODE);
    sCANFD_Config2.sBtConfig.sNormBitRate.u32BitRate = 500000;
    sCANFD_Config2.sBtConfig.sDataBitRate.u32BitRate = 2000000;
    CANFD_Open(CANFD2, &sCANFD_Config2);
}

void CANFD3_Init(void)
{
    CANFD_FD_T sCANFD_Config3;
    SYS_ResetModule(CANFD3_RST);
    CANFD_GetDefaultConfig(&sCANFD_Config3, CANFD_OP_CAN_FD_MODE);
    sCANFD_Config3.sBtConfig.sNormBitRate.u32BitRate = 500000;
    sCANFD_Config3.sBtConfig.sDataBitRate.u32BitRate = 2000000;
    CANFD_Open(CANFD3, &sCANFD_Config3);
}


int32_t main(void)
{

    SYS_UnlockReg();                         // Unlock protected registers
    SYS_Init();                              // Init System, peripheral clock and multi-function I/O

    UART_Open(UART0, 115200);                           // Init UART to 115200-8n1 for print message

    SYS_ResetModule(CANFD0_RST);
    CANFD0->CCCR = CANFD_CCCR_CCE_Msk | CANFD_CCCR_INIT_Msk | CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk;

    SYS_ResetModule(CANFD1_RST);
    CANFD1->CCCR = CANFD_CCCR_CCE_Msk | CANFD_CCCR_INIT_Msk | CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk;

    SYS_ResetModule(CANFD2_RST);
    CANFD2->CCCR = CANFD_CCCR_CCE_Msk | CANFD_CCCR_INIT_Msk | CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk;

    SYS_ResetModule(CANFD3_RST);
    CANFD3->CCCR = CANFD_CCCR_CCE_Msk | CANFD_CCCR_INIT_Msk | CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk;

    CANFD0_Init();
    CANFD1_Init();
    CANFD2_Init();
    CANFD3_Init();

    CANFD0_TX_fifo_Init();
    CANFD1_TX_fifo_Init();
    CANFD2_TX_fifo_Init();
    CANFD3_TX_fifo_Init();
       

    CANFD0_Tx_Init(CANFD0, 2, 7, 0);
    CANFD0->CCCR = CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk ;    // Write is OK after 2 CLKs
       
    CANFD1_Tx_Init(CANFD1, 2, 7, 0);
    CANFD1->CCCR = CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk ;    // Write is OK after 2 CLKs

    CANFD2_Tx_Init(CANFD2, 2, 7, 0);
    CANFD2->CCCR = CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk ;    // Write is OK after 2 CLKs

    CANFD3_Tx_Init(CANFD3, 2, 7, 0);
    CANFD3->CCCR = CANFD_CCCR_BRSE_Msk | CANFD_CCCR_FDOE_Msk ;    // Write is OK after 2 CLKs

    SYS_LockReg();

    TIM1_Init();

    u32TimeOutCnt0 = CANFD_TIMEOUT;
    u32TimeOutCnt1 = CANFD_TIMEOUT;
    u32TimeOutCnt2 = CANFD_TIMEOUT;
    u32TimeOutCnt3 = CANFD_TIMEOUT;


    while (1)
    {
        CANFD0_TxTest(CANFD0, u8Item);
        CANFD1_TxTest(CANFD1,u8Item);
        CANFD2_TxTest(CANFD2,u8Item);
        CANFD3_TxTest(CANFD3,u8Item);
    }

}


使用特权

评论回复
沙发
643757107| | 2024-6-20 21:55 | 只看该作者
代码是自己写的还是官方的示例啊

使用特权

评论回复
板凳
classroom| | 2024-8-20 19:24 | 只看该作者
地址分配错误

使用特权

评论回复
地板
laocuo1142| | 2024-8-20 19:24 | 只看该作者
CANFD支持扩展的帧格式和更高的数据速率,但如果通信双方对帧格式的理解不一致或配置错误,可能会导致数据传输错误或FIFO无法正确处理接收到的数据。

使用特权

评论回复
5
yangxiaor520| | 2024-8-20 19:56 | 只看该作者
对端设备是不是也是CANFD?要确认一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

7520

帖子

30

粉丝