打印

CAN总线影响485通信

[复制链接]
820|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyrl|  楼主 | 2016-2-17 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yyrl 于 2016-2-17 15:35 编辑

各位老师好,这里请教个问题:
我现在做的系统包含有几台机器,这几台机器的电路板都和一块状态检测板通过CAN总线进行通信,芯片为STM32103,状态检测板定时给所有电路板发消息,且一直不断电。此外,机器的电路板也分别通过RS422(USART2)接口和PLC从站通信。现在发现,有的时候上电后会出现一台机器无法通过422串口发送消息的现象。必须重新上电才能解决。经查,一旦上电前将CAN总线和状态检测板断开,就不会出现422串口不发消息的情况。而且通过在初始化中加入延时,即在CAN和USArt2初始化之前加入延时,会发现哪一台初始化延时时间短,那一台就容易出现不发消息的现象。
请问,CAN总线会影响Usart2的消息发送吗?毕竟由于状态检测板的CAN总线设置了重发机制,下面的设备在刚开始上电时CAN波形很密集。谢谢!

相关帖子

沙发
chunyang| | 2016-2-17 18:06 | 只看该作者
这个只能说明设备的程序编制有缺陷,CAN与422只要是物理上各自独立的就不会在硬件上互相影响,但总线上有数据时,软件处理就要当心了。一种概率极小的情况是总线上的电流通过接口芯片泄露进系统,而系统功耗又足够低,导致“未上电而工作”的情况,这可通过测量掉电但连接总线时MCU上的电源电压来获知。

使用特权

评论回复
板凳
yyrl|  楼主 | 2016-2-17 21:12 | 只看该作者
chunyang 发表于 2016-2-17 18:06
这个只能说明设备的程序编制有缺陷,CAN与422只要是物理上各自独立的就不会在硬件上互相影响,但总线上有数 ...

谢谢!
一开始我是把串口发送放在中断中做的,后来我将其放在主循环中做,不过问题依旧!
程序如下:

void Usart2SendProc(void)
{
    if (GetUserTime(TMR_USART2_SEND_INTV) >= USART2_SEND_INTV)
    {
        if (Usart2.TxStart != Usart2.TxEnd)
        {
         //   USART2_TX_EN();
         //   USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
            
           if (USART_GetFlagStatus(USART2, USART_FLAG_TXE) != RESET)      
             {
                if (Usart2.TxBuff[Usart2.TxEnd] == 0x8a)                  
                {
           //  USART_ITConfig(USART2, USART_IT_TXE, DISABLE);            
           //  USART_ITConfig(USART2, USART_IT_TC, ENABLE);               
                    SetUserTime(TMR_USART2_SEND_INTV, 0);               
                }
                USART2->DR = Usart2.TxBuff[Usart2.TxEnd];               
                Usart2.TxEnd++;
                Usart2.TxEnd %= USART2_TX_BUFF_SIZE;
              //  SetUserTime(TMR_USART2_SEND_INTV, 0);                 
            }
        }
     }
}

定时器
TMR_USART2_SEND_INTV是用来把相邻两条消息间隔开的,在systick中做的。我把Usart2.TxStart,Usart2.TxEnd,定时器值通过usart1读出,发现这些值是正常变化的,可是数据没有真正发出。
请您分析一下,另外,有什么情况CAN会影响USART2的发送!

使用特权

评论回复
地板
chunyang| | 2016-2-17 23:55 | 只看该作者
yyrl 发表于 2016-2-17 21:12
谢谢!
一开始我是把串口发送放在中断中做的,后来我将其放在主循环中做,不过问题依旧!
程序如下:

关键是容错处理,具体只能你自己去想,不是几行代码的事,注意程序结构和任务调度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝