PCAN FD

2023-12-25 12:30
文章标签 fd pcan

本文主要是介绍PCAN FD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 CAN FD
1.1 MCU with CAN FD
GD32C103: USART upgrade
STM32G0B1: RM0444, DS13560, AN5096, USART1 (PA9, PA10) and DFU (PA11, PA12)
STM32G431: RM0440, DS12589, AN5093, USART1 (PA9, PA10) and DFU (PA11, PA12)

Refer to AN2606 to get what STM32 devices support DFU bootloader.

NUCLEO-G431RB评估板上的唯一一个USB接口不是连接到STM32G431的,而是给ST-Link用的。
Discovery开发板一般有2个USB接口,一个是ST-Link,另外一个是USB通信口。

1.2 FD Format bit
STM32G0x1 R1.FDF: Receive Register 1, FD Format bit; if this bit is set, a CAN FD frame was received, otherwise, a CAN 2.0 frame was received.

1.3 gcc
github kylesrm / stm32g431-nucleo-makefile
cp lib/HAL/Inc/stm32g4xx_hal_conf_template.h src/stm32g4xx_hal_conf.h

1.4 schematics
github lijinlong21549 / STM32G474_board

1.5 CAN FD bus transceiver
TJA1042

2 PCAN FD
moonglow / pcan_pro_x

USB_EP_MSGOUT:
struct ucan_tx_msg {
  uint16_t  size;
  uint16_t  type;
  uint32_t  tag_low;
  uint32_t  tag_high;
  uint8_t  channel_dlc;
  uint8_t  client;
  uint16_t  flags;
  uint32_t  can_id;
  uint8_t  d[];
}__attribute__((packed));

USB_EP_MSGIN:
struct ucan_rx_msg {
  // size 整个结构体的长度
  uint16_t  size;
  uint16_t  type;
  // unit: us
  uint32_t  ts_low;
  // ts_high = 0
  uint32_t  ts_high;
  // tag_low = 0
  uint32_t  tag_low;
  // tag_high = 0
  uint32_t  tag_high;
  // high 4-bit is DLC,
  // low 4-bit is CAN instance ID, 0 or 1
  uint8_t  channel_dlc;
  uint8_t  client;
  uint16_t  flags;
  uint32_t  can_id;
  uint8_t  d[];
}__attribute__((packed));

struct ucan_command {
  // low 12-bit means opcode
  // high 4-bit means CAN instance ID

  uint16_t  opcode_channel;
  uint16_t  args[3];
}__attribute__((packed));

static const uint8_t pcan_fd_len2dlc[] =
{
  0, 1, 2, 3, 4, 5, 6, 7, 8,  /* 0 - 8 */
  9, 9, 9, 9,     /* 9 - 12 */
  10, 10, 10, 10,         /* 13 - 16 */
  11, 11, 11, 11,         /* 17 - 20 */
  12, 12, 12, 12,         /* 21 - 24 */
  13, 13, 13, 13, 13, 13, 13, 13,     /* 25 - 32 */
  14, 14, 14, 14, 14, 14, 14, 14,     /* 33 - 40 */
  14, 14, 14, 14, 14, 14, 14, 14,     /* 41 - 48 */
  15, 15, 15, 15, 15, 15, 15, 15,     /* 49 - 56 */
  15, 15, 15, 15, 15, 15, 15, 15      /* 57 - 64 */
};

static const uint8_t pcan_fd_dlc2len[] =
{
  0, 1, 2, 3, 4, 5, 6, 7,
  8, 12, 16, 20, 24, 32, 48, 64
};

3 STM32F072 Porting
3.1 Porting
moonglow / pcan_pro_x

Src/pcanpro_fd_protocol.c
Src/pcanpro_timestamp.c
Src/pcanfd_ucan.h
Src/pcanfd_usb_fw.h
Src/pcanpro_can.h
Src/pcan_usbpro_fw.h
Src/pcanpro_protocol.h
Src/pcanpro_timestamp.h

Add include "pcan_fd/pcanpro_fd_protocol.c" to Src/pcan_usb.c.

3.2 Debug
1) Windows PCAN-View
When PCAN-View starts, it will send the below commands.
01: UCAN_CMD_RESET_MODE
80: UCAN_USB_CMD_CLK_SET - PCAN-View Clock Frequency, 20 MHz
04: UCAN_CMD_TIMING_SLOW - PCAN-View Nominal Bit rate, 500 kBit/s, STM32G4 FDCAN_NBTP
05: UCAN_CMD_TIMING_FAST - PCAN-View Data Bit rate, 2 MBit/s, STM32G4 FDCAN_DBTP
02: UCAN_CMD_NORMAL_MODE - bus active
0c: UCAN_CMD_CLR_DIS_OPTION
0b: UCAN_CMD_SET_EN_OPTION
3ff: UCAN_CMD_END_OF_COLLECTION

每一个High-speed USB_EP_CMDOUT MPL(Max Packet Length)可以包含多个8字节命令(Aggregation mode),但是实际上只有第一个8字节是命令,跟在8个字节后面的是8个FF,表示命令集合结束。8个FF后面的数据是无效数据,是Windows PCAN FD驱动没有清零导致的传给PCAN FD下位机的误导数据。下一个High-speed MPL报文重复该模式。

2) Busload packet
PCAN FD sends 16-byte UCAN_MSG_BUSLOAD (10 00 04 00) to Windows PC periodically through USB_EP_MSGIN when PCAN-View starts. We can append debug messages to UCAN_MSG_BUSLOAD (10 00 ff ff 00 00 00 00 00 00 00 00 xx xx xx xx). Then use Bus Hound to catch the packets.

3) Full-speed USB
PCAN-USB: VID_0C72&PID_000C
PCAN-USB FD: VID_0C72&PID_0012
需要修改bRequest = USB_VENDOR_REQUEST_INFO的返回值,否则Windows会发送wValue = 0的SET_CONFIG,进而导致Windows PCAN-View不工作。修改点是pcan_device.device_nr = 0,pcan_device.can[0].channel_nr = 0。
USB_EP_CMDOUT buffer size: 128-byte, otherwise STM32 Full-speed USB cannot receive UCAN_CMD_NORMAL_MODE.
USB_EP_MSGOUT buffer size: 256-byte
USB_EP_MSGIN_CH1: UCAN_USB_MSG_CALIBRATION = 0x100

当USB是Full-speed时,此时Max Packet Length是64字节,Windows PCAN-View USB_EP_MSGIN的buffer size是4096字节,因为函数pcan_protocol_poll中每次都发送64字节,没有Zero Length Packet或者Short Packet,这个导致Windows的URB无法退出,一直等待设备发送了4096字节才退出URB。需要修改该处的代码,使每次发送字节数不要是Max Packet Length的整数倍。

4) Bit timing
STM32F072 CANbps = APB_clock / BRP / (tseg1 + tseg2 + 1)
需要调用函数_get_precalculated_bitrate将PCAN-View要设置的低速500 kBit/s换算成STM32F072的寄存器值,寄存器名字是CAN_BTR,地址是0x4000_641C,每个写进去的字段需要减去1。
从函数SystemClock_Config中找出APB1 bxCAN的时钟信息,APB1的时钟是48 MHz。

5) Timer
使用2个16-bit定时器实现us定时,TIM3.CNT存储us的低16-bit,TIM9.CNT存储us的高16-bit,设置TIM3的PSC到(48 - 1),即是对48 MHz APB1进行48分频,所以每一个bit即是1us,设置TIM9的PSC到(1 - 1),即是对TIM3.CNT的溢出计数不分频,故而TIM9.CNT存储的是us的高16-bit。

可以直接使用32-bit TIM2,将PSC设置为(48-1),并且时钟分频的值为0后,每个bit就代表1uS。

6) LED
PCAN FD双通道需要5个LED。

这篇关于PCAN FD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/535505

相关文章

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Android中使用eBPF跟踪 FD打开与关闭

我们知道在Android系统中 fd 泄露,可以通过 google 开发的 fdtrack来进行排查,但是有些情况下我们想在外发release版本去监控fd泄露情况,fdtrack就不能很好的满足需求了。可以用eBPF去监控fd泄露。 Android中使用eBPF跟踪 FD打开与关闭

Detection简记2-DAFE-FD: Density Aware Feature Enrichment for Face Detection

创新点 1.使用密度估计模型增强检测中的特征图 总结 整个流程还是很清晰的。 conv1-3的特征图经过密度估计模块由检测器D1进行检测。 D2-4分别是四个检测器。 FFM是特征融合模块,将不同层不同大小的特征融合。 FFM网络结构如下: 首先使用1X1的卷积减少两组特征的厚度到128,然后使用双线性插值统一两组特征图的尺寸,然后相加。类似于cvpr2017的SSH。 多尺度检测器的网

文件 fd

目录 1. 建立共识原理2. 回忆 C 文件接口2.1 当前工作路径2.2 w / a 方式写入2.3 默认打开的三个文件流 3. 认识文件系统调用3.1 O_WRONLY|O_CREAT 写时创建3.2 O_TRUNC 截断长度(也即全覆盖式写入)3.3 O_APPEND 追加 4. 浅谈文件访问的本质4.1 简证 1. 建立共识原理 文件 = 内容 + 属性文件分为两种:打

虹科技术|全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!

全新8.17.0版本的PCAN-Linux驱动程序正式发布,专为CAN和CAN FD接口量身打造。无论是CAN 2.0 a/b还是CAN FD的PCAN硬件产品,都能在我们的新驱动下“驰骋自如”。想要体验字符模式设备驱动接口(chardev)的便捷,还是SocketCAN设备驱动接口(netdev)的高效?都由您说了算! 新版本驱动包概览 1、设备驱动程序模块源代码及Makefil

Linux | 文件描述符fd详解及重定向技术的应用

多谢梅花,伴我微吟。 - 《高阳台·除夜》(韩疁) 2024.8.23 目录 1、文件描述符fd 文件操作符概念(简单带过) 重点:如何理解文件操作符使得系统实现了设备无关性?(使得操作系统无需关心具体的硬件细节) 示例代码:标准输入、标准输出和标准错误 文件描述符的分配规则 注意 2、重定向 重定向的简单例子 思考 重点:使用dup2函数进行重定向 重定向的重要应用 文件描述符,一个看似

Linux文件操作:文件描述符fd

文章目录 前言:回顾一下文件提炼一下关于文件的理解: 理解文件:通过系统调用操作文件:理解标志位传参:打开文件 open写入信息 write 理解文件描述符:对于open的返回值:==文件描述fd的本质是什么呢?== 如何理解Linux中一切皆文件?打通系统调用和C语言函数 前言: ​ 现在我们对进程的总体概念也有了了解,下面我们进入新的模块学习。关于Linux如何操作文件。其关

【Linux】系统文件IO·文件描述符fd

前言  C语言文件接口  C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd: 文件描述符分配规则: 文件描述符fd: 前言 我们早在C语言中学习关于如何用代码来管理文件,比如文件的输入和文件的输出,一些文件的接口,如何深入学习文件的知识,在Linux下一切皆文件,今天我们探讨Linux的基础I/

【车载测试】CAN协议、CAN- FD协议和FlexRay协议 区别

【上半场电动化,下半场智能化】 一、CAN协议 和 CAN- FD协议的区别 CAN(Controller Area Network)协议是一种广泛用于汽车和工业控制系统等领域的现场总线协议。CAN- FD(Flexible Data Rate)协议是对CAN协议的扩展,旨在提高CAN总线的数据传输速率和数据量。 1.数据速率不同 CAN协议是基于ISO 11898标准,通常支持最高1Mbps的

【每日一库】fd - 文件搜索神器

find 命令,是我们 Linuxer 经常会用到的命令行工具之一,频率可能会比昨天介绍的 grep/ripgrep 工具稍微低一点。它的作用是在文件系统目录中搜索符合指定文件名模式的文件。这里介绍的 fd 是 find 的 Rust 替代实现。目前在 github 上 star 数量接近 10000。 fd 的语法与 find 有一些不同,这是这个工具的取舍。 先来看看这个工具的效果。