上传完整项目文件夹
注:板级说明见目录xiuos/Ubiquitous/XiZi_IIoT/board/stm32g474/README.md EtherCAT相关说明见xiuos/Ubiquitous/XiZi_IIoT/board/stm32g474/third_party_driver/spi/README.md
该项目主控芯片为stm32g474retx。使用到的相关外设有UART, USB CDC, 三个CANFD,SPI, TIMER, GPIO。 项目整体采用HAL库开发。对相应外设进行了基本的配置。 其中USB速率为固定12MHz, CANFD在仲裁域相位 1Mbps 采样80%, 数据域相位5Mbps,采样75%, SPI配置速率为40M
USB外设用于负责串口调试,相关配置文件均由stm32cubemx生成,中断函数UsbSetIsr位于usb/src/usbd_cdc_if.c文件中的回调函数int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len),中断优先级配置位于usbd_conf.c文件中。connect_usb.c中实现了串口设备的打开、关闭、读写操作,支持中断和轮询两种工作模式。(代码均模仿dev_serial.c中相关实现)
Ethercat主站发送共480连续字节数据帧(tcpdump抓包可查看) 前240字节由从站ethercat node 1接收,后240字节由node 2 接收。 后240字节的数据帧在每次DC模式下的SYNC0的中断中被映射处理存储在结构体sDcuMosi中, 每个从站回发240字节数据帧在每次循环中被主站取走, 在ethercat任务循环中的void APPL_Application(void)中被取出被赋给相关变量。 240字节MOSI数据中的第一个是CANFD CHANNEL 0 的控制字,根据8位的具体情况判断执行后续的CANFD CHANNEL 0的数据转发逻辑,转发数据为2-65字节(8*8 = 64 字节)。66字节为CANFD CHANNEL 1的控制字, 67-130字节为CANFD CHANNEL1的转发数据,之后同理。 CANFD的收发逻辑在connect_can.c中实现。
发送CANFD消息时调用封装好的 void CANFD_Transmit(FDCAN_HandleTypeDef *hfdcan)实现规定逻辑的发送消息,接收则使用canfd的中断 具体的逻辑为:
每个DCU带有三路CANFD通道,分别对应 CTRL1、CTRL2、CTRL3。每路通道对应65字节。以CANFD - CTRL1为例,具体定义为:
D0 D1 - D64 Cmd Payload
• Cmd:通道转发控制命令
• Payload:CANFD报文数据段
每一路通道可以控制转发的报文ID和DLC,由Cmd字段决定。
• 当Cmd为0xFF时,为广播模式,报文ID为0,Payload中的64字节数据会全部被转发;
• 当Cmd为0时,数据不转发;
• 当Cmd为其他值时,会从bit0开始依次检查对应的位。如bit0为真时,报文ID为1,payload中的 byte0byte7 会被转发,数据长度8字节;如bit1为真时,报文ID为2,payload中的 byte8byte15 会被转发,数据长度8字节;其他情况以此类推。
CANFD - CTRLx 对应三路通道收到的CANFD报文,并按照ID进行排布,如ID1的报文数据位于 byte8~byte15 字段处,每个节点报文数据长度不超过8字节。
在connect_can.c文件中有一些测试函数用于控制与调试,其中包括:
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
注:板级说明见目录xiuos/Ubiquitous/XiZi_IIoT/board/stm32g474/README.md EtherCAT相关说明见xiuos/Ubiquitous/XiZi_IIoT/board/stm32g474/third_party_driver/spi/README.md
该项目主控芯片为stm32g474retx。使用到的相关外设有UART, USB CDC, 三个CANFD,SPI, TIMER, GPIO。 项目整体采用HAL库开发。对相应外设进行了基本的配置。 其中USB速率为固定12MHz, CANFD在仲裁域相位 1Mbps 采样80%, 数据域相位5Mbps,采样75%, SPI配置速率为40M
USB设备
USB外设用于负责串口调试,相关配置文件均由stm32cubemx生成,中断函数UsbSetIsr位于usb/src/usbd_cdc_if.c文件中的回调函数int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len),中断优先级配置位于usbd_conf.c文件中。connect_usb.c中实现了串口设备的打开、关闭、读写操作,支持中断和轮询两种工作模式。(代码均模仿dev_serial.c中相关实现)
CANFD设备
Ethercat主站发送共480连续字节数据帧(tcpdump抓包可查看) 前240字节由从站ethercat node 1接收,后240字节由node 2 接收。 后240字节的数据帧在每次DC模式下的SYNC0的中断中被映射处理存储在结构体sDcuMosi中, 每个从站回发240字节数据帧在每次循环中被主站取走, 在ethercat任务循环中的void APPL_Application(void)中被取出被赋给相关变量。 240字节MOSI数据中的第一个是CANFD CHANNEL 0 的控制字,根据8位的具体情况判断执行后续的CANFD CHANNEL 0的数据转发逻辑,转发数据为2-65字节(8*8 = 64 字节)。66字节为CANFD CHANNEL 1的控制字, 67-130字节为CANFD CHANNEL1的转发数据,之后同理。 CANFD的收发逻辑在connect_can.c中实现。
发送CANFD消息时调用封装好的 void CANFD_Transmit(FDCAN_HandleTypeDef *hfdcan)实现规定逻辑的发送消息,接收则使用canfd的中断 具体的逻辑为:
每个DCU带有三路CANFD通道,分别对应 CTRL1、CTRL2、CTRL3。每路通道对应65字节。以CANFD - CTRL1为例,具体定义为:
D0 D1 - D64 Cmd Payload
• Cmd:通道转发控制命令
• Payload:CANFD报文数据段
每一路通道可以控制转发的报文ID和DLC,由Cmd字段决定。
• 当Cmd为0xFF时,为广播模式,报文ID为0,Payload中的64字节数据会全部被转发;
• 当Cmd为0时,数据不转发;
• 当Cmd为其他值时,会从bit0开始依次检查对应的位。如bit0为真时,报文ID为1,payload中的 byte0
byte7 会被转发,数据长度8字节;如bit1为真时,报文ID为2,payload中的 byte8byte15 会被转发,数据长度8字节;其他情况以此类推。CANFD - CTRLx 对应三路通道收到的CANFD报文,并按照ID进行排布,如ID1的报文数据位于 byte8~byte15 字段处,每个节点报文数据长度不超过8字节。
connect_can.c中相关测试函数说明
在connect_can.c文件中有一些测试函数用于控制与调试,其中包括: