【CANopen】关于STM32中CanFestival的pdo应用

系列文章目录



使用STM32F407单片机

pdo属于过程数据用来传输实时数据,即单向传输,无需接收节点回应。

一、发送

分为同步传输和异步传输。

1、同步传输

分为循环传输(周期)和非循环传输(非周期)

  1. 非循环传输

接收到同步报文:
1、如果映射值改变了就发送;
2、如果没有改变就不发送。

把整个pdox对应的映射值给发出去

参数配置:

UNS8 Master_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
UNS32 Master_obj1800_COB_ID_used_by_PDO = 0x180;	/* 384 */
UNS8 Master_obj1800_Transmission_Type = 0x0;	/* 0设置为非周期传输 */
UNS16 Master_obj1800_Inhibit_Time = 0x0;	/* 0 */
UNS8 Master_obj1800_Compatibility_Entry = 0x0;	/* 0 */
UNS16 Master_obj1800_Event_Timer = 0x0;	/* 0 */
UNS8 Master_obj1800_SYNC_start_value = 0x0;	/* 0 */

在这里插入图片描述
2. 循环传输

/* index 0x1800 :   Transmit PDO 1 Parameter. */
                    UNS8 Msater_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
                    UNS32 Msater_obj1800_COB_ID_used_by_PDO = 0x180;	/* 384 */
                    UNS8 Msater_obj1800_Transmission_Type = 0x2;	/* 2 接收到两个同步报文发送 */
                    UNS16 Msater_obj1800_Inhibit_Time = 0x0;	/* 0 */
                    UNS8 Msater_obj1800_Compatibility_Entry = 0x0;	/* 0 */
                    UNS16 Msater_obj1800_Event_Timer = 0x0;	/* 0 */
                    UNS8 Msater_obj1800_SYNC_start_value = 0x0;	/* 0 */

Msater_obj1800_Transmission_Type = 1 ~ 253表示接收到1~253个同步报文后发送pdo通信,和映射值变化与否没有关系。

2、异步传输

  1. 内部事件触发

1、定时器触发
Msater_obj1800_Transmission_Type设为0xff,Msater_obj1800_Event_Timer设置定时发送的时间间隔
在这里插入图片描述

2、数据改变

Msater_obj1800_Transmission_Type设为0xff

sendPDOevent(&TestMaster_Data);//循环调用这个函数,如果数据改变则会将数据发出

如果同时有两个TPDO数据改变,调用sendPDOevent只能发出靠前的那个TPDO的数据,连续调用两次会发送先改变的那个,两次调用中间加一点延时既可。

还有一种方法是在DS401这些协议中,暂时还没涉及到。

  1. 远程请求

通过发送与PDO的COB-ID相同的远程帧开触发PDO的发送。

二、接收

接收根据各个RPDO的master_obj1400_COB_ID_used_by_PDO确定,COB-ID确认匹配存入对应的RPDO映射地址中。

  1. 接收到的数据直接读

直接就在映射里面,接收到新数据即覆盖旧数据。

  1. 接收到数据触发回调函数
UNS32 index0x2000_0x01_callback(CO_Data* d, const indextable *table, UNS8 bSubindex)//回调函数
{
	return OD_SUCCESSFUL;//一定要加,不然该PDO对象的下一个参数就无法修改
}

void CAN_INit(void)
{
	RegisterSetODentryCallBack(&CAN_master,0x2000, 1, index0x2000_0x01_callback);//注册回调函数
	//0x2000:映射地址
	//1:子索引
	//index0x2000_0x01_callback:需要注册的回调函数
}

关于注册回调函数中的子索引:
设置为1:即接收的数据存放入子索引1这个位置后触发这个回调函数
也就是可以在接收的任意一个位置注册接收回调函数,想完整接收一帧就放在映射的最后一个索引。

相关推荐

  1. 【心得】关于STM32RTC校准方法

    2024-01-03 16:04:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-03 16:04:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-03 16:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-03 16:04:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-03 16:04:04       20 阅读

热门阅读

  1. kafka处理大量消息积压tips —— 筑梦之路

    2024-01-03 16:04:04       37 阅读
  2. vue常见面试题

    2024-01-03 16:04:04       30 阅读
  3. 基于SpringBoot的智慧生活商城系统

    2024-01-03 16:04:04       38 阅读
  4. CSS-5

    2024-01-03 16:04:04       35 阅读
  5. Linux内核--进程管理(七)进程的核心—task_truct

    2024-01-03 16:04:04       31 阅读
  6. IEC 61850 dsAin 和 dsDin的区别

    2024-01-03 16:04:04       37 阅读
  7. 华为鸿蒙应用--文件管理工具(鸿蒙工具)-ArkTs

    2024-01-03 16:04:04       83 阅读
  8. 第三方支付“收单”是什么?

    2024-01-03 16:04:04       62 阅读
  9. MySQL数据库连接超时和自动重连

    2024-01-03 16:04:04       34 阅读
  10. 国企两年,我懂得了这些职场真理!

    2024-01-03 16:04:04       43 阅读