0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32F0160 FlexCAN-FD接口实现CAN FD通信

灵动MM32MCU 来源:灵动MM32MCU 2023-12-14 16:44 次阅读

1FlexCAN-FD简介

MM32F0160 系列 MCU 具有一个 FlexCAN 模块,该模块遵循 ISO 11898-1 标准、 CAN FD 和 CAN 2.0B 协议规范,不仅兼容传统CAN,还支持CAN FD模式。在CAN-FD模式下,可实现最高8 Mbps的FD模式通信速率,支持标准帧(11位标识符)和扩展帧(29位标识符),支持最大64字节有效负载,并且具有非常灵活的用于传输和接收的邮箱系统。

使用CAN FD较传统CAN具有如下优点:

(1)增加了数据长度,在发送长数据时,软件更加简单高效,满足更高的数据吞吐量。

(2)提高了传输速率,使得延迟时间更短,具有更好的实时性,满足更高的带宽。

(3)扩展了CRC场,为数据内容提供了更好的保护,增加了系统安全性。

本章节初步学习使用MM32F0160 FlexCAN-FD接口实现CAN FD通信,相关例程参考灵动官网的LibSamples或在此基础上修改。关于CAN FD协议不再进行详细介绍,感兴趣的小伙伴可以查阅相关资料增进了解。

2CAN FD帧

ISO 11898-1标准指定了符合ISO 11898-1(2003)标准的经典帧格式,并引入了CAN FD(Flexible Data Rate)帧格式。经典帧格式支持高达1Mbps的比特率,以及每帧8字节的有效负载。FD帧格式支持超过1Mbps的比特率,以及每帧超过8字节的有效负载。FlexCAN可以收发CAN FD和经典CAN格式交替的报文。

CAN FD 帧中有三个附加的控制位:

EDL:扩展数据长度位,支持更多的数据负载。

BRS比特率切换位:决定CAN FD帧是否切换比特率。

ESI错误状态指示:错误主动节点发送显性,错误被动节点发送隐性。

CAN FD格式不支持远程帧,远程帧总是以经典CAN格式传输。接收到FD帧并匹配邮箱时,接收报文缓冲区的RTR位将被无效化。

CAN FD报文数据字段可超过8字节,支持12至64字节。CAN FD报文可切换比特率,使CAN帧的控制字段、数据字段和CRC字段比特率高于帧的开始和结束。

CAN FD帧结构(部分)如下图所示:

ba96eca8-9a5c-11ee-8b88-92fbcf53809c.pngba9e1c76-9a5c-11ee-8b88-92fbcf53809c.png

CAN FD帧从SOF(帧起始)到BRS的仲裁段,以标称比特率传输;从BRS到CRC界定符的数据段,以数据比特率传输;从CRC界定符到Intermission位,传输恢复为标称比特率。如果CAN FD帧中BRS为隐性,则位时序在BRS的采样点发生变化。BRS位之前,CAN FD仲裁段的标称位时序由CAN_CBT或CAN_CTRL1寄存器定义;检测到隐性BRS时,数据位时序由CAN_FDCBT 寄存器定义。

3协议时序

FlexCAN具有单独配置CAN FD协议时序的寄存器,CAN FD位时序寄存器(CAN_FDCBT)存储用于控制位时序参数的字段:FPRESDIV、FPROPSEG、FPSEG1、FPSEG2和FRJW。

CAN FD报文数据段的FDPRESDIV定义了串行时钟(Sclock)的预分频,见下列方程。串行时钟的周期定义了用于构成CAN FD波形的时间单位Tq,Tq为CAN引擎所能处理的最小时间单元。

bab129ba-9a5c-11ee-8b88-92fbcf53809c.jpg

比特率定义了接收或传输 CAN FD报文的速率,公式如下:

bac4a7ce-9a5c-11ee-8b88-92fbcf53809c.jpg

位时间可以细分为三个部分:

同步段(SYNC_SEG):1Tq的固定长度;信号边沿出现在该段内。

时间段1:包括传播段和相位段1。FlexCAN 使用 CAN_FDCBT寄存器的FDPROPSEG和FDPSEG1字段,其总和(+1)为2 ~ 39Tq。

时间段 2:包括相位段2。其值(+1)为2 ~ 8Tq。时间段2不能小于信息处理时间2Tq。

当采用CAN FD位作为持续时间的衡量标准时,一个CAN FD位的外设时钟个数NumClkBit为:

bad816a6-9a5c-11ee-8b88-92fbcf53809c.jpg

fCANFDCLK为PE时钟,单位Hz。

fSYS为系统(CHI)时钟频率,单位Hz。

4报文缓冲区

MM32F0160 FlexCAN遵循CAN FD协议规范,该模块已经设计了对应的CAN FD报文缓冲区结构。经典 CAN 帧使用传统型 Rx FIFO,CAN FD帧使用增强型Rx FIFO。下图为FlexCAN所使用的报文缓冲区结构,包括CAN 2.0B的两种帧格式:扩展帧(29位ID)和标准帧(11位ID)。每个报文缓冲区由16、24、40或72字节组成,其中包括8、16、32或64字节的数据。邮箱使用 0x80 ~ 0x27F 的内存区域。

bae85bf6-9a5c-11ee-8b88-92fbcf53809c.png

EDL — 扩展数据长度,EDL位区分CAN帧和CAN FD 帧。

BRS — 比特率切换,定义是否在 CAN FD 帧内切换比特率。

ESI — 错误状态指示,表示发送节点是错误主动还是错误被动。

CODE — 报文缓冲区代码,CODE 字段可以被 CPU 和 FlexCAN 读写,用作报文缓冲区匹配和仲裁过程的一部分。编码详见用户手册。

SRR — 替代远程请求,

1:扩展帧格式传输时,必须使用隐性位。

0:扩展帧格式传输时,显性位无效。

只用于扩展帧格式。传输时(发送缓冲区)该位必须设置为 1,且将会和从 CAN 总线上接收到的值一起存储于接收缓冲区。该位可以被接收为隐性或显性,如果 FlexCAN 以显性位接收,则认为仲裁丢失。

IDE — ID扩展位,

1:扩展帧;

0:标准帧。

RTR — 远程传输请求

1:如果是发送MB,则表示当前MB可能有一个远程帧待发送;如果是接收MB,则接收到的远程帧将会被存储;

0:表示当前的M 中有一个数据帧待传输。在接收MB中,可能会被用于匹配过程。

如果FlexCAN传输1(隐性),接收到0(显性),则认为仲裁丢失。如果 RTR传输0(显性),接收到1(隐性),则认为是位错误。如果接收到的值与发送值相同,则被认为是一次成功的位传输。

注:配置CAN FD帧时RTR位必须为0。

DLC — 数据字节长度

该4位字段为发送/接收数据的长度(以字节为单位),位于偏移地址为0x8到0xF的MB空间。

接收阶段,该字段由FlexCAN写入,从接收帧的DLC字段复制而得;

传输阶段,该字段由CPU写入,且与要传输的帧的DLC字段相对应。

当RTR = 1 时,被传输的帧为远程帧,不包含数据字段(DLC 字段的设置无效,参见表格“有效数据字节”)。

TIME STAMP — 自由运行计时器时间戳

该16位字段为自由运行计时器的复制,当标识符字段开头出现在CAN总线上时进行捕获。

PRIO — 本地优先级

该 3 位字段只有当MCR.LPRIO_EN被置位时才有效,且只针对传输邮箱。用于附加到 ID 来定义传输优先级,不会被传输。

ID — 帧标识符

标准帧格式,只有高 11 位(28 ~ 18)用于识别接收或发送帧,忽略低 18 位。扩展帧格式,所有位都用于识别传输或接收帧。

DATA BYTE0 ~ 63 — 数据字段

数据帧最多可以使用64个字节,取决于为MB选择的有效负载大小。从总线上接收到的帧以该帧被接收时的格式进行存放。只有n小于DLC时,DATA BYTE(n)才有效。

bbbf1330-9a5c-11ee-8b88-92fbcf53809c.png

5MB 内存映射

FlexCAN内存缓冲区的内存映射如下表所示:

bbdda9f8-9a5c-11ee-8b88-92fbcf53809c.png

6FlexCAN-FD API

从灵动官网下载的FLEXCAN固件库中定义了FD相关的API函数如下:

bbf91e22-9a5c-11ee-8b88-92fbcf53809c.jpg

7FlexCAN-FD通信

配置FlexCAN为CAN FD模式,通过中断接收和发送报文。

7.1 FlexCAN配置

voidFlexCAN_Configure(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
NVIC_InitTypeDefNVIC_InitStruct;

flexcan_config_tFlexCAN_ConfigStruct;
flexcan_rx_mb_config_tFlexCAN_RxMB_ConfigStruct;

RCC_ClocksTypeDefRCC_Clocks;

RCC_GetClocksFreq(&RCC_Clocks);

RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1ENR_FLEXCAN,ENABLE);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_3);

GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStruct);

GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);

NVIC_InitStruct.NVIC_IRQChannel=FLEX_CAN_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);

FLEXCAN_GetDefaultConfig(&FlexCAN_ConfigStruct);

FlexCAN_ConfigStruct.baudRate=1000000U;/*1Mbps*/
FlexCAN_ConfigStruct.baudRateFD=2000000U;/*2Mbps*/
FlexCAN_ConfigStruct.clkSrc=Enum_Flexcan_ClkSrc1;
FlexCAN_ConfigStruct.enableLoopBack=false;
FlexCAN_ConfigStruct.disableSelfReception=true;
FlexCAN_ConfigStruct.enableIndividMask=true;
FLEXCAN_Init(FLEX_CAN1,&FlexCAN_ConfigStruct);

FLEXCAN_EnterFreezeMode(FLEX_CAN1);

FLEX_CAN1->MCR|=1<< 13;
    FLEX_CAN1->CTRL1&=(~CAN_CTRL1_SMP(1));

FLEXCAN_ExitFreezeMode(FLEX_CAN1);

/*Baudratecalculatebyautomatically*/
FLEXCAN_FDCalculateImprovedTimingValues(FlexCAN_ConfigStruct.baudRate,FlexCAN_ConfigStruct.baudRateFD,
RCC_Clocks.PCLK1_Frequency,&FlexCAN_ConfigStruct.timingConfig);

FLEXCAN_FDInit(FLEX_CAN1,&FlexCAN_ConfigStruct,FLEXCAN_64BperMB,true);

FLEXCAN_SetFDTxMbConfig(FLEX_CAN1,1,true);
FLEXCAN_SetFDTxMbConfig(FLEX_CAN1,3,true);

FlexCAN_RxMB_ConfigStruct.id=FLEXCAN_ID_STD(0x111);
FlexCAN_RxMB_ConfigStruct.format=Enum_Flexcan_FrameFormatStandard;
FlexCAN_RxMB_ConfigStruct.type=Enum_Flexcan_FrameTypeData;
FLEXCAN_SetFDRxMbConfig(FLEX_CAN1,0,&FlexCAN_RxMB_ConfigStruct,true);

FLEXCAN_SetRxIndividualMask(FLEX_CAN1,0,FLEXCAN_RX_MB_STD_MASK(0xFFF,0,0));

/*EnableMB0Interrupt*/
FLEX_CAN1->IMASK1|=(0x01U<< 0);

    FlexCAN_RxMB_ConfigStruct.id     = FLEXCAN_ID_EXT(0x222);
    FlexCAN_RxMB_ConfigStruct.format = Enum_Flexcan_FrameFormatExtend;
    FlexCAN_RxMB_ConfigStruct.type   = Enum_Flexcan_FrameTypeData;
    FLEXCAN_SetFDRxMbConfig(FLEX_CAN1, 2, &FlexCAN_RxMB_ConfigStruct, true);

    FLEXCAN_SetRxIndividualMask(FLEX_CAN1, 2, FLEXCAN_RX_MB_EXT_MASK(0xFFF, 0, 1));

    /* Enable MB2 Interrupt */
    FLEX_CAN1->IMASK1|=(0x01U<< 2);
}

配置PB8、PB9复用为FlexCAN的RX、TX引脚;

配置CAN1Mbps和CANFD2Mbps、MB选择64字节负载;

配置NVIC中断;

配置MB1、MB3为发送邮箱;

配置MB0、MB2为接收邮箱;

MB0仅接收ID为0x111的标准帧;

MB2仅接收ID为0x222的扩展帧。

7.2 发送标准帧报文

voidFlexCAN_FD_SendStandardFrameMessage(uint32_tID,uint8_t*Buffer,uint8_tLength)
{
flexcan_fd_frame_tFlexCAN_FD_FrameStruct;

FlexCAN_FD_FrameStruct.length=Length;
FlexCAN_FD_FrameStruct.type=(uint8_t)Enum_Flexcan_FrameTypeData;
FlexCAN_FD_FrameStruct.format=(uint8_t)Enum_Flexcan_FrameFormatStandard;
FlexCAN_FD_FrameStruct.brs=1;
FlexCAN_FD_FrameStruct.edl=1;
FlexCAN_FD_FrameStruct.id=ID;

for(uint8_ti=0;i< 16; i++)
    {
        FlexCAN_FD_FrameStruct.dataWord[i] = Buffer[i * 4] << 24 | Buffer[i * 4 + 1] << 16 | Buffer[i * 4 + 2] << 8 | Buffer[i * 4 + 3];
    }

    FLEXCAN_WriteFDTxMb(FLEX_CAN1, 1, &FlexCAN_FD_FrameStruct);
}

flexcan_fd_frame_t是按照FlexCAN MB结构定义的结构体,将要发送的标准帧按照帧结构依次设置结构体的各字段,接着写入MB1发送邮箱。

7.3 发送扩展帧报文

voidFlexCAN_FD_SendExtendFrameMessage(uint32_tID,uint8_t*Buffer,uint8_tLength)
{
flexcan_fd_frame_tFlexCAN_FD_FrameStruct;

FlexCAN_FD_FrameStruct.length=Length;
FlexCAN_FD_FrameStruct.type=(uint8_t)Enum_Flexcan_FrameTypeData;
FlexCAN_FD_FrameStruct.format=(uint8_t)Enum_Flexcan_FrameFormatExtend;
FlexCAN_FD_FrameStruct.brs=1;
FlexCAN_FD_FrameStruct.edl=1;
FlexCAN_FD_FrameStruct.id=ID;

for(uint8_ti=0;i< 16; i++)
    {
        FlexCAN_FD_FrameStruct.dataWord[i] = Buffer[i * 4] << 24 | Buffer[i * 4 + 1] << 16 | Buffer[i * 4 + 2] << 8 | Buffer[i * 4 + 3];
    }

    FLEXCAN_WriteFDTxMb(FLEX_CAN1, 3, &FlexCAN_FD_FrameStruct);
}

同上,将要发送的扩展帧按照帧结构依次设置结构体的各字段,接着写入MB3发送邮箱。

7.4 获取报文并发送

voidFlexCAN_FD_RxMB_Handler(uint8_tIndex)
{
uint8_tBuffer[64];
flexcan_fd_frame_tFlexCAN_FD_FrameStruct;

FLEXCAN_ReadFDRxMb(FLEX_CAN1,Index,&FlexCAN_FD_FrameStruct);

for(uint8_ti=0;i< 16; i++)
    {        
        Buffer[i*4+0] = (FlexCAN_FD_FrameStruct.dataWord[i] >>0x18)&0xFF;
Buffer[i*4+1]=(FlexCAN_FD_FrameStruct.dataWord[i]>>0x10)&0xFF;
Buffer[i*4+2]=(FlexCAN_FD_FrameStruct.dataWord[i]>>0x08)&0xFF;
Buffer[i*4+3]=(FlexCAN_FD_FrameStruct.dataWord[i]>>0x00)&0xFF;
}

if(Index==0)
{
FlexCAN_FD_SendStandardFrameMessage((FlexCAN_FD_FrameStruct.id>>CAN_ID_STD_SHIFT),Buffer,FlexCANFD_TX_64Bytes_DataLen);
}
else
{
FlexCAN_FD_SendExtendFrameMessage((FlexCAN_FD_FrameStruct.id>>CAN_ID_EXT_SHIFT),Buffer,FlexCANFD_TX_64Bytes_DataLen);
}
}

读接收邮箱(Index),获取CAN FD报文中的数据,并发送该报文。

7.5 中断服务子程序

voidFlexCAN_IRQHandler(void)
{
uint32_tu32flag=1;

/*MB0*/
if(FLEXCAN_GetMbStatusFlags(FLEX_CAN1,u32flag<< 0) != 0)
    {
        FlexCAN_FD_RxMB_Handler(0);

        FLEXCAN_ClearMbStatusFlags(FLEX_CAN1, u32flag << 0);
    }

    /* MB1 */
    if (FLEXCAN_GetMbStatusFlags(FLEX_CAN1, u32flag << 1) != 0)
    {
        FLEXCAN_ClearMbStatusFlags(FLEX_CAN1, u32flag << 1);
    }

    /* MB2 */
    if (FLEXCAN_GetMbStatusFlags(FLEX_CAN1, u32flag << 2) != 0)
    {
        FlexCAN_FD_RxMB_Handler(2);

        FLEXCAN_ClearMbStatusFlags(FLEX_CAN1, u32flag << 2);
    }

    /* MB3 */
    if (FLEXCAN_GetMbStatusFlags(FLEX_CAN1, u32flag << 3) != 0)
    {
        FLEXCAN_ClearMbStatusFlags(FLEX_CAN1, u32flag << 3);
    }
}

MB0、MB2完成接收调用MB接收函数,获取报文并通过MB1、MB3发送。MB1、MB3完成传输,清除对应标志。

7.6 FlexCAN_FD中断示例

voidFlexCAN_FD_Interrupt_Sample(void)
{
uint8_tBuffer[64]=
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xAA,
0xAA,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x55,
0x55,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xAA,
0xAA,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x88,
};

printf("
Test%s",__FUNCTION__);

FlexCAN_Configure();

while(1)
{
FlexCAN_FD_SendStandardFrameMessage(0x214,Buffer,FlexCANFD_TX_64Bytes_DataLen);

PLATFORM_LED_Toggle(LED1);
PLATFORM_DelayMS(1000);
}
}

调用FlexCAN_Configure(),在while中间隔1s中发送标准帧报文,帧ID为0x214,数据为定义好的Buffer[64]。

在主函数中调用FlexCAN_FD_Interrupt_Sample()。

8验证

连接CAN调试工具,配置波特率CAN 1Mbps、CAN FD 2Mbps,观测上位机软件:

bc09adaa-9a5c-11ee-8b88-92fbcf53809c.png

接收区间隔1s接收到一次FD报文,ID为0x214。

在发送区发送标准帧FD报文,ID为0x111,发送扩展帧FD报文,ID为0x222,各发送5次:

bc2541d2-9a5c-11ee-8b88-92fbcf53809c.png

每发送1次报文,接收区接收到1次该ID的报文,和程序预期一致。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16016

    浏览量

    343617
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148485
  • CAN
    CAN
    +关注

    关注

    56

    文章

    2467

    浏览量

    459239
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134390
  • 比特率
    +关注

    关注

    1

    文章

    23

    浏览量

    10491

原文标题:灵动微课堂 (第279讲)|MM32F0160 FlexCAN-FD 通信

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何实现CANCAN FD的升级?

    自动驾驶技术迅速发展,车辆中的CAN总线已经无法满足数据吞吐量和传输速度的要求,CAN总线的加速升级版——CAN FD技术正在逐渐替代现有网络。为了进一步了解
    的头像 发表于 09-20 09:31 8629次阅读

    MM32F0160FlexCAN FD位时间采样点如何计算?

    FlexCAN模块是一个通信控制器,扩展了CAN FD功能,遵循ISO 11898-1标准、CAN FD
    的头像 发表于 11-09 17:43 810次阅读
    <b class='flag-5'>MM32F0160</b>的<b class='flag-5'>FlexCAN</b> <b class='flag-5'>FD</b>位时间采样点如何计算?

    CAN接口can_fd的区别是什么

    1.CAN接口can_fd的区别
    发表于 12-10 08:17

    一文浅析汽车CAN-FD总线的通信应用

    ,但随着ADAS 功能水平升级,这些 ADAS 功能的实现对网络通信有着更高性能、低时延、高带宽及ASIL B+的功能安全要求,传统CAN通信已无法满足。一汽红旗在本车型上首次应用
    发表于 02-14 14:22

    S32K344 FlexCAN如何设置Rx MB掩码以接收具有不同ID的CAN FD消息?

    嗨,朋友们,我参考下面的掩码设置演示,但我只收到具有单个 ID 的 CAN FD 消息。基于下面的代码,我只收到 ID 为 0x300 的 CAN FD 消息 64 字节有效负载。其他
    发表于 03-29 07:48

    S32G2 FlexCAN CAN FD使用DMA接收字节顺序错误的原因?怎么解决?

    我在 goldbox 上以 DMA 模式使用 flexcan 时遇到字节字节序错误。因为没有DMA,发送正常。当接收到第一帧CAN FD报文时,报文中的字节顺序没有问题,可以接收到CAN
    发表于 04-27 07:09

    FlexCAN与普通的CAN有区别吗?CAN FDCAN有什么区别?

    FlexCAN与普通的CAN有区别吗,CAN FDCAN有什么区别。
    发表于 11-08 08:30

    灵动股份全新MM32F0160系列MCU发布

    灵动股份发布全新MM32F0160 系列 MCU,其搭载 72MHz Arm Cortex-M0 处理器,内置 128KB Flash,16KB RAM,配备高速 ADC、USB、CAN-FD
    的头像 发表于 12-20 13:55 515次阅读

    MM32F0160 产品手册(中文版)

    MM32F0160 产品手册(中文版)
    发表于 02-22 18:50 0次下载
    <b class='flag-5'>MM32F0160</b> 产品手册(中文版)

    MM32F0160 产品手册(英文版)

    MM32F0160 产品手册(英文版)
    发表于 02-22 18:51 0次下载
    <b class='flag-5'>MM32F0160</b> 产品手册(英文版)

    MM32F0160 用户手册(中文版)

    MM32F0160 用户手册(中文版)
    发表于 02-22 18:51 0次下载
    <b class='flag-5'>MM32F0160</b> 用户手册(中文版)

    MM32F0160 用户手册(英文版)

    MM32F0160 用户手册(英文版)
    发表于 02-22 18:52 0次下载
    <b class='flag-5'>MM32F0160</b> 用户手册(英文版)

    基于MM32F0160微控制器的机械键盘

    最近,为了配合新品推广,灵动的软件与系统工程SE团队,基于带有 USB 外设模块的 MM32F0160 微控制器,实现了一套低成本带RGB灯效的机械键盘。这里将设计机械键盘的全过程开源出来,感兴趣
    的头像 发表于 04-21 09:11 811次阅读

    CAN FD是什么意思 优点有哪些

    日益增加的需求。 什么是CAN FDCAN FD协议是由Bosch以及行业专家预研开发的,并于2012年发布。通过标准化对其进行了改进,现已纳入ISO 11898-1:2015。一
    的头像 发表于 07-18 10:40 1644次阅读

    CAN FD帧结构介绍

    CAN FD帧结构 CAN FD节点可以正常收、发CAN报文,但CAN节点不能正确收、发
    的头像 发表于 07-18 10:42 4493次阅读
    <b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>帧结构介绍