打印
[应用方案]

BSP包里面的ISP_CAN

[复制链接]
862|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
東南博士|  楼主 | 2021-6-2 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
BSP, ISP, CAN, ck, TE
BSP包里面的ISP_CAN

学习了一下 ISP部分的CAN:
void SYS_Init(void)
{
    /* Enable Internal and External RC clock */
    CLK->PWRCTL |= CLK_PWRCTL_HIRCEN_Msk | CLK_PWRCTL_HXTEN_Msk;

    /* Waiting for Internal RC clock ready */
    while (!(CLK->STATUS & CLK_STATUS_HIRCSTB_Msk));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK->PLLCTL = PLLCON_SETTING;

    while (!(CLK->STATUS & CLK_STATUS_PLLSTB_Msk));

    CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLKSEL_Msk)) | CLK_CLKSEL0_HCLKSEL_PLL;
    CLK->CLKDIV0 &= ~CLK_CLKDIV0_HCLKDIV_Msk;
    CLK->CLKDIV0 |= CLK_CLKDIV0_HCLK(HCLK_DIV);
    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;                        // PLL
    SystemCoreClock = PLL_CLOCK / HCLK_DIV;             // HCLK
    CyclesPerUs     = SystemCoreClock / 1000000;  // For SYS_SysTickDelay()
}



使用特权

评论回复
沙发
東南博士|  楼主 | 2021-6-2 14:37 | 只看该作者
/*----------------------------------------------------------------------------*/
/*  Tx Msg by Normal Mode Function (With Message RAM)                    */
/*----------------------------------------------------------------------------*/
void CAN_Package_ACK(CAN_T *tCAN)
{
    STR_CANMSG_T tMsg;
    u8CAN_AckFlag = 1;
    /* Send a 11-bit Standard Identifier message */
    tMsg.FrameType = CAN_DATA_FRAME;
    tMsg.IdType    = CAN_STD_ID;
    tMsg.Id        = Device0_ISP_ID;
    tMsg.DLC       = CAN_ISP_DtatLength;
    memcpy(&tMsg.Data, &rrMsg.Data, 8);

    if (CAN_Transmit(tCAN, MSG(5), &tMsg) == FALSE)   // Configure Msg RAM and send the Msg in the RAM
    {
        return;
    }

    while (u8CAN_AckFlag);
}

使用特权

评论回复
板凳
東南博士|  楼主 | 2021-6-2 14:39 | 只看该作者
    /* stat update program */
    while (1)
    {
        if (u8CAN_PackageFlag)
        {
            u8CAN_PackageFlag = 0;
            Address = inpw(&rrMsg.Data);
            Data = inpw(&rrMsg.Data[4]);

            if (Address == CMD_GET_DEVICEID)
            {
                outpw(&rrMsg.Data[4], SYS->PDID);
            }
            else if (Address == CMD_READ_CONFIG)
            {
                outpw(&rrMsg.Data[4], FMC_Read(Data));
            }
            else if (Address == CMD_RUN_APROM)
            {
                break;
            }
            else
            {
                if ((Address % FMC_FLASH_PAGE_SIZE) == 0)
                {
                    FMC_Erase(Address);
                }

                FMC_Write(Address, Data);         //program ROM
                Data = FMC_Read(Address);
                memcpy(&rrMsg.Data[4], &Data, 4); //update data
            }

            CAN_Package_ACK(CAN1);            //send CAN ISP Package (ACK)
        }
    }

_APROM:
    SYS->RSTSTS = (SYS_RSTSTS_PORF_Msk | SYS_RSTSTS_PINRF_Msk);
    FMC->ISPCTL &= ~(FMC_ISPCTL_ISPEN_Msk | FMC_ISPCTL_BS_Msk);
    SCB->AIRCR = (V6M_AIRCR_VECTKEY_DATA | V6M_AIRCR_SYSRESETREQ);

    /* Trap the CPU */
    while (1);

使用特权

评论回复
地板
東南博士|  楼主 | 2021-6-2 14:40 | 只看该作者
其实呢,还是强烈希望 NUVOTON 开放一下 关于NUVOTON USB-CAN 的简单的设计案例,这样就可以自己设计一个CAN调试器了。

使用特权

评论回复
5
東南博士|  楼主 | 2021-6-2 14:40 | 只看该作者

使用特权

评论回复
6
東南博士|  楼主 | 2021-6-2 14:56 | 只看该作者
这样 如果可以 直接套用 ISP CAN部分。。。。。。

使用特权

评论回复
7
我们荡起双桨| | 2021-6-2 15:06 | 只看该作者
我看到你说的这个了,基本上用户用的最多的就是UART。至于CAN,可能是汽车级别的。或者其他的控制器。

不过,如果做成通用的了,对于用户来说是好一些的。

使用特权

评论回复
8
我们荡起双桨| | 2021-6-2 15:07 | 只看该作者
USB-CAN,其实用一个MCU就可以实现。

另外,用USB-MCU-CAN,就可以了。

但是不清楚ISP软件里面调用CAN,具体的是什么原理。

使用特权

评论回复
9
xinxianshi| | 2021-6-2 21:55 | 只看该作者
厂家提供了相当多的例子

使用特权

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

本版积分规则

382

主题

6081

帖子

34

粉丝