STM32 用CAN总线时,如果有多个主机向我发送数据,并且他们发送时CAN ID相同,这样会不会有问题?虽然我也能正确收到所有主机数据,如果多主机同时发送数据时,是不是CAN总线仲裁就不起作用了?
// 我自己的过滤器配置如下:
void CAN_Filter_Config(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (((uint32_t)MYID<<3)& 0xFFFF0000)>>16; // 其中MYID = 0001
CAN_FilterInitStructure.CAN_FilterIdLow = (((uint32_t)MYID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; // 其中CAN_ID_EXT = 0x00000004, CAN_RTR_DATA = 0x00000000
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);
}
// 多个主机发送端CAN ID值相同。如下:
void CANTransmitFrame()
TxMessage.ExtId = SendID; // 0x0001
TxMessage.IDE = CAN_ID_EXT; // 0x00000004
TxMessage.RTR = CAN_RTR_DATA; // 0x00000000
TxMessage.DLC = 8;
for(i=0;i<8;i++){
TxMessage.Data[i]=ucFrameBuf[i];
}
transmailbox = CAN_Transmit(CAN1,&TxMessage);
.....................以下省略
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
首先谢谢原子哥的解答,但还有不明啊 :
我的意思是,现在有多个主机用相同 CAN ID (发送时用的ExtId,IDE、 RTR 相同),这样多主机同时发送数据时,总线还能正确仲裁吗?总线仲裁不是根据CAN ID仲裁的吗? 如果CAN ID相同又怎么仲裁呢。我用的是扩展帧CAN ID是29位的
一周热门 更多>