拿到LPC55S16的板卡好几天了,本来目标是测试CANFD和USB转换通信的,发现板卡上接的外设还挺多,话说可以玩一段时间了。在测试CANFD通信之前,先测试一下Classical CAN。,关于这两者的不同,网上说的比较详细。主要的就是通信速率,数据比特率提高到了8Mbps和最大数据帧提高到了64个字节。当前只在应用层面来考虑。官方的SDK提供了MCAN例程,考虑到NXP的IDE还在熟悉当中,还是移植到keil里调试比较方便,如图1所示。

这次测试的目的就是完成Classical CAN每隔2s完成8字节发送,中断接收。
连接图如图2所示:

官方原理图如如3所示:
将demo移植到keil后,就是读程序,然后为目的修改程序测试。
2S延时使用的是SYSTick,如下:
/* Set systick reload value to generate 1ms interrupt */
if (SysTick_Config(SystemCoreClock / 1000U))
{
while (1)
{
}
}
SysTick_DelayTicks(2000U);
按照以往的定义,初始化时钟,引脚,CAN定义,主要是字节数,ID和波特率。
整个过程的思路是先测试CAN的发送,如果没问题,再测试CAN的接收,最后整合一下。
波特率的使用:
if (MCAN_CalculateImprovedTimingValues(mcanConfig.baudRateA, MCAN_CLK_FREQ, &timing_config))
{
/* Update the improved timing configuration*/
memcpy(&(mcanConfig.timingConfig), &timing_config, sizeof(mcan_timing_config_t));
}
可以追到波特率的定义上,demo使用的baudRateA 500Kbps,当然也可以选1Mbps.
发送配置:
/* TX buffer config. */
memset(&txBuffer, 0, sizeof(txBuffer));
txBuffer.address = TX_BUFFER_OFS;
txBuffer.dedicatedSize = 1U;
txBuffer.fqSize = 0;
txBuffer.datafieldSize = kMCAN_8ByteDatafield;
MCAN_SetTxBufferConfig(EXAMPLE_MCAN, &txBuffer);
模式选择:
/* Finish software initialization and enter normal mode, synchronizes to
CAN bus, ready for communication */
MCAN_EnterNormalMode(EXAMPLE_MCAN);
接收配置:
/* STD filter config. */
rxFilter.address = STD_FILTER_OFS;
rxFilter.idFormat = kMCAN_FrameIDStandard;
rxFilter.listSize = 1U;
rxFilter.nmFrame = kMCAN_reject0;
rxFilter.remFrame = kMCAN_rejectFrame;
MCAN_SetFilterConfig(EXAMPLE_MCAN, &rxFilter);
stdFilter.sfec = kMCAN_storeinFifo0;
/* Classic filter mode, only filter matching ID. */
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = rxIdentifier;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 0);
/* RX fifo0 config. */
rxFifo0.address = RX_FIFO0_OFS;
rxFifo0.elementSize = 1U;
rxFifo0.watermark = 0;
rxFifo0.opmode = kMCAN_FifoBlocking;
rxFifo0.datafieldSize = kMCAN_8ByteDatafield;
发送帧格式并完成发送:
txIdentifier = 0x123U;
txFrame.xtd = kMCAN_FrameIDStandard;
txFrame.rtr = kMCAN_FrameTypeData;
txFrame.fdf = 0;
txFrame.brs = 0;
txFrame.dlc = 8U;
txFrame.id = txIdentifier << STDID_OFFSET;
txFrame.data = tx_datac;
txFrame.size = CAN_DATASIZE;
txXfer.frame = &txFrame;
txXfer.bufferIdx = 0;
MCAN_TransferSendNonBlocking(EXAMPLE_MCAN, &mcanHandle, &txXfer);
接收帧格式并完成数据接收:
rxIdentifier = 0x321U;
在测试的时候demo上有这么一段:
while (!rxComplete)
{
}
rxComplete = false;
就是用了一个while语句,接收完才会继续发送,屏蔽到就不影响按时发送了。
发送和接收数据如图4和图5所示:


在《How to Use CAN-FD to Transfer Data on LPC5500 Series 》文档中也有对Timing config的解释,在深入学习中还需要继续理解。测试完CAN,就是继续CANFD。
顺便吐个槽,官方文档很多明面上没有,需要找,这会多花费一些时间。
上一篇:LPC553X MCU 体系结构概述
下一篇:ok6410的madplay配置
推荐阅读最新更新时间:2026-03-24 19:46
- 支持 BLE 连接、由 4mA 至 20mA 电流回路供电的现场发送器参考设计
- AM2DM-0515DH60-NZ ±15 Vout、2W 双路输出 DC-DC 转换器的典型应用
- LTC6261IDC 音频耳机桥式驱动器运算放大器的典型应用
- LTC1775CS 2.5V/5A 可调输出降压稳压器的典型应用电路
- AD8601ARTZ-REEL7 符合 PC100 标准的线路输出放大器的典型应用
- 一种基于分立的 315MHz 振荡器解决方案,用于使用 BFR182 射频双极晶体管的远程无钥匙进入系统
- 使用 ROHM Semiconductor 的 BD49E39G-TR 的参考设计
- AM30EW-2405SZ 5V 三路输出 DC/DC 转换器的典型应用
- LTC3564 的电池在 1.2A 应用中达到 1.2V
- AL1676EV2,基于 AP1676 高亮度降压 LED 驱动控制器的评估板

DC-DC 转换器 测试概述
TYPE C3.0测试标准
stm32驱动屏IC rm68042
非常经典的关于LLC的杨波博士论文
XC6406PP60DL






京公网安备 11010802033920号