一、从机代码
主要是所有0x1017的时间为1000,默认心跳时间为1s
/* index 0x1017 : Producer Heartbeat Time. */
UNS16 slave_objdict_obj1017 = 1000; /* 0 */
subindex slave_objdict_Index1017[] =
{
{ RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1017, NULL }
};
一、主机代码
变量定义
int main(void)
{
u8 key;
u16 data;
u32 size;
u32 abortCode;
u8 sendData[2];
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) //K0请求节点状态
{
masterRequestNodeState(&master_objdict_Data,0x01);
printf("%x\r\n",master_objdict_Data.NMTable[1]);
}
else if(key==KEY1_PRES)//K1启动节点
{
masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Start_Node);
}
else if(key==KEY2_PRES)//K2读取从机索引0x1017中的心跳值
{
readNetworkDict(&master_objdict_Data,0x01,0x1017,0,sizeof(UNS16),0);
while(getReadResultNetworkDict(&master_objdict_Data,0x01,&data,&size,&abortCode) == SDO_UPLOAD_IN_PROGRESS)
{
}
printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);
}
else if(key==WKUP_PRES) //KUP修改从机心跳帧频率,置为0x07d0也就是2s
{
data=1000;
size=2;
sendData[0]=0xd0;
sendData[1]=0x07;
writeNetworkDict(&master_objdict_Data,0x01,0x1017,0,size,uint16,&sendData,0);
while(getWriteResultNetworkDict(&master_objdict_Data,0x01,&abortCode) == SDO_UPLOAD_IN_PROGRESS)
{
}
printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);
masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Reset_Comunication);
}
}
}