本帖最后由 linda_6000 于 2020-8-11 16:35 编辑
STM32三块板组网,每板上带单片机与CAN接口,接口用TJA1051,每个板都接了120欧。
A号板为接收板,收到数据后通过串口传PC机。
if(G_canRec_STDID == 0x000007f0)
{//一号机到时,先发送机号再传数据
USART1->DR='N';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='.';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='1';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='-';
while((USART1->SR&0X40)==0);//等待发送结束
}else{
if(G_canRec_STDID == 0x000007f6)
{//二号机的情况
USART1->DR='N';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='.';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='2';
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR='-';
while((USART1->SR&0X40)==0);//等待发送结束
}
}
for(t=0;t<8;t++)
{
if(Tx20Message[t])
{
USART1->DR=Tx20Message[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
}
USART1->DR=0xd;
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR=0xa;
while((USART1->SR&0X40)==0);//等待发送结束
USART_RX_STA = USART_RX_STA -0x2000;
B板 发送单片机处的设置
CNT = ‘0’;
if(CAN_RECFLAG & 0x8008)
{
TxMessage.Data[0]=CNT++;
if(CNT >= 'z')//这里是为了给数据一个序号,这样接收到同一包数据时会看到
CNT ='0';
TxMessage.StdId=0xfe00>>5;
TxMessage.IDE=CAN_ID_STD;
//数据帧
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC=8;
G__send_pack_deal(&TxMessage.Data[1],G_data); //传感器接收的数据打包到CAN发送数组
//CAN 发送数据
CAN_Transmit(CAN1,&TxMessage);
CAN_RECFLAG =0;
}
C板 是另一路CAN板,除了ID号不一样外,一切都一样,它也是将接收到的传感器数据发送到CAN,因为其ID号大些,所以优先级低一点
TxMessage.StdId=0xfeC0>>5;
单独接一个板如A板只接B板,或是A只接C板,都很可靠,发现数据是从0序号开始一个个上来。但是如果将三个板的CANH接一起,CANL接一起就会出现B板的数据快速上来许多,都是0序号的,然后又都是1序号的。偶尔会
上来一个C号板的数据。说明同时接是可以接到两个板的数据的,只是B号板为什么快速的上来那么多包,是反射吗?电路应做什么调整?
三个板共用电源,用近一米五的线接的。CANH与CANL是先用近一米五的线从A接到B板再接到C板也是近一米五的长。是线太长了吗?
请高手指教!
|