canOpen学习八之canOpen应用实现主从机PDO定时同步数据

从机字典文件

/* index 0x1800 :   Transmit PDO 1 Parameter. */
 UNS8 slave_objdict_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
 UNS32 slave_objdict_obj1800_COB_ID_used_by_PDO = 0x180;	/* 384 */
 UNS8 slave_objdict_obj1800_Transmission_Type = 0xFF;	/* 1 */
 UNS16 slave_objdict_obj1800_Inhibit_Time = 0;	/* 0 */
 UNS8 slave_objdict_obj1800_Compatibility_Entry = 0x0;	/* 0 */
 UNS16 slave_objdict_obj1800_Event_Timer = 2000;	/* 0 */
 UNS8 slave_objdict_obj1800_SYNC_start_value = 0x0;	/* 5 */
 subindex slave_objdict_Index1800[] = 
  {
    { RO, uint8, sizeof (UNS8), (void*)&slave_objdict_highestSubIndex_obj1800, NULL },
    { RW, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1800_COB_ID_used_by_PDO, NULL },
    { RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_Transmission_Type, NULL },
    { RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1800_Inhibit_Time, NULL },
    { RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_Compatibility_Entry, NULL },
    { RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1800_Event_Timer, NULL },
    { RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_SYNC_start_value, NULL }
  };

主要设置为slave_objdict_obj1800_Transmission_Typeslave_objdict_obj1800_Event_Timerslave_objdict_obj1800_Event_Timer设置为2000就是2秒同步一次。
主机主程序

int main(void)
{ 
	u8 key; 
	Message msg;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);    //初始化延时函数
	uart_init(115200);	//初始化串口波特率为115200
	LED_Init();					//初始化LED 
	KEY_Init(); 				//按键初始化  
	cantimer_init(10-1,8400-1);	 
	can_init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//CAN初始化环回模式,波特率500Kbps    
	setNodeId(&master_objdict_Data, 0x00);
	setState(&master_objdict_Data, Initialisation);
	setState(&master_objdict_Data, Operational);	
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRES)
		{
			masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Start_Node);
		}
		else if(key==KEY1_PRES)
		{	   
			sendPDOrequest(&master_objdict_Data,0x1400);
		}
		else if(key==KEY2_PRES)
		{	   
			msg.cob_id = (UNS16)0x80;
			msg.len = (UNS8)0x00;
			msg.rtr = (UNS8)0;
			canSend(&master_objdict_Data.canHandle,&msg );	
		}	
		else if(key==WKUP_PRES)
		{	   

		}			
	} 

}

按下K0启动从机点1后从几点每隔两秒就会同步一次数据。

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/105874817