使用STM32F407单片机
pdo属于过程数据用来传输实时数据,即单向传输,无需接收节点回应。
分为同步传输和异步传输。
分为循环传输(周期)和非循环传输(非周期)
接收到同步报文:
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通信
,和映射值变化与否没有关系。
1、定时器触发
Msater_obj1800_Transmission_Type设为0xff,Msater_obj1800_Event_Timer设置定时发送的时间间隔
2、数据改变
Msater_obj1800_Transmission_Type设为0xff
sendPDOevent(&TestMaster_Data);//循环调用这个函数,如果数据改变则会将数据发出
如果同时有两个TPDO数据改变,调用sendPDOevent只能发出靠前的那个TPDO的数据,连续调用两次会发送先改变的那个,两次调用中间加一点延时既可。
还有一种方法是在DS401这些协议中,暂时还没涉及到。
通过发送与PDO的COB-ID相同的远程帧开触发PDO的发送。
接收根据各个RPDO的master_obj1400_COB_ID_used_by_PDO确定,COB-ID确认匹配存入对应的RPDO映射地址中。
直接就在映射里面,接收到新数据即覆盖旧数据。
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这个位置后触发这个回调函数
也就是可以在接收的任意一个位置注册接收回调函数,想完整接收一帧就放在映射的最后一个索引。