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

2024-01-03 12:42:23

系列文章目录



使用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这个位置后触发这个回调函数
也就是可以在接收的任意一个位置注册接收回调函数,想完整接收一帧就放在映射的最后一个索引。

文章来源:https://blog.csdn.net/qq_41214093/article/details/135342647
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。