OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5017|回复: 17

串口实现485通讯问题

[复制链接]

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
发表于 2016-6-20 14:59:02 | 显示全部楼层 |阅读模式
1金钱
参考原子例程,串口2实现485通讯,使用的MAX485芯片。操作485的RS485_RE,默认为0为接收,发送时先置一再进行串口发送,发送完成清零RS485_RE。现在发送正常,接收出现问题。示波器测量波形发现,在使能485进行发送的时候,串口的接收端会出现相应的高电平,然后接收端出现低电平。去掉485后发现串口接收端为高电平。485连接串口的RX和TX接了4.7K的上拉电阻,正常都是被拉高的。485为半双工,在串口发送的时候需要在代码里禁止串口的接收吗?

最佳答案

查看完整内容[请看2#楼]

是485芯片的问题,这批次有问题,坑。谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-20 14:59:03 | 显示全部楼层
xuande 发表于 2016-6-20 16:29
如果接收端已经禁止,那么485芯片对CPU的Rx端的输出是高阻态,
这时只有Rx端的上拉电阻起作用,Rx为高电 ...

是485芯片的问题,这批次有问题,坑。谢谢
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-20 16:23:20 | 显示全部楼层
接收时芯片会使串口会产生接收中断,去中断里面拉相应的电平就行,发送时拉相应的电平,或者最好使用485收发自动转换电路,
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-20 16:29:33 | 显示全部楼层

如果接收端已经禁止,那么485芯片对CPU的Rx端的输出是高阻态,
这时只有Rx端的上拉电阻起作用,Rx为高电平才对,怎么会出现低电平呢?



回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 09:01:59 | 显示全部楼层
xyl210xyl 发表于 2016-6-20 16:23
接收时芯片会使串口会产生接收中断,去中断里面拉相应的电平就行,发送时拉相应的电平,或者最好使用485收 ...

现在是串口初始化以后,拉低为接收状态。然后发送的时候先拉高,发送完了再拉低的。不知为啥会出现上面的现象。
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 09:07:23 | 显示全部楼层
xuande 发表于 2016-6-20 16:29
如果接收端已经禁止,那么485芯片对CPU的Rx端的输出是高阻态,
这时只有Rx端的上拉电阻起作用,Rx为高电 ...

QQ截图20160622090419.png

如图,当发送时TX_EN拉高,这个时候485的接收是不是就被禁止了?然后对应的串口UART_RX2的话应该被上拉为高电平吧?

回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-22 09:17:42 | 显示全部楼层
天涯水乡 发表于 2016-6-22 09:01
现在是串口初始化以后,拉低为接收状态。然后发送的时候先拉高,发送完了再拉低的。不知为啥会出现上面的 ...

接受状态不必你自己去拉低,因为啦不低的,只要它产生串口中断后,在中断了拉低一下吧数据取出来就成
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-22 09:25:39 | 显示全部楼层
天涯水乡 发表于 2016-6-22 09:07
如图,当发送时TX_EN拉高,这个时候485的接收是不是就被禁止了?然后对应的串口UART_RX2的话应该被 ...


对,就是这意思。


回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 09:30:25 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 09:17
接受状态不必你自己去拉低,因为啦不低的,只要它产生串口中断后,在中断了拉低一下吧数据取出来就成

485的RE不拉低的话,串口如何收到485的接收的数据啊?
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-22 09:37:10 | 显示全部楼层
天涯水乡 发表于 2016-6-22 09:30
485的RE不拉低的话,串口如何收到485的接收的数据啊?

你跟我刚学的时候遇到了一样的问题,上面很多人没看懂你的问题我看懂了,我就说一句,接收到数据芯片会主动控制单片机一处串口中断的,等溢出中断了再去拉低再去取数据,因为485是差分信号,半双工,只能采用主从模式,不可能由从机来自定义收或者发模式,都是要受控制的,以上没看懂的话建议你要要去好好看一看485总线的文档了
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 10:37:07 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 09:37
你跟我刚学的时候遇到了一样的问题,上面很多人没看懂你的问题我看懂了,我就说一句,接收到数据芯片会主 ...

好,我试一下,在中断处理函数里面拉低试试。谢谢哦
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 14:16:52 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 09:37
你跟我刚学的时候遇到了一样的问题,上面很多人没看懂你的问题我看懂了,我就说一句,接收到数据芯片会主 ...

还有,朋友。我拉低和拉高的不是串口的两根线,而是485芯片控制发送接收的那个使能管脚。
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-22 15:15:26 | 显示全部楼层
天涯水乡 发表于 2016-6-22 14:16
还有,朋友。我拉低和拉高的不是串口的两根线,而是485芯片控制发送接收的那个使能管脚。

???我说的就是那个是能线,两个串口线你能去拉么,啦了不就影响通信了
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-22 15:36:52 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 15:15
???我说的就是那个是能线,两个串口线你能去拉么,啦了不就影响通信了

哥哥,那我直接接地是不是呢?是不是就只能接收数据啦
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-22 15:53:17 | 显示全部楼层
天涯水乡 发表于 2016-6-22 15:36
哥哥,那我直接接地是不是呢?是不是就只能接收数据啦

你只要接收数据吗
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-23 08:54:14 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 15:53
你只要接收数据吗

试了下,IO去控制485的收发使能管脚没啥问题,能拉高拉低的。
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-23 08:55:14 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 15:53
你只要接收数据吗

如果拉高的话,只是发送,串口不会接收到485的数据,也不会产生中断吧
回复

使用道具 举报

34

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2012-1-7
在线时间
157 小时
 楼主| 发表于 2016-6-23 09:19:33 | 显示全部楼层
xyl210xyl 发表于 2016-6-22 15:53
你只要接收数据吗

void USART2_Send(u8 *buf, u8 len)
{
u8 t;
        RS485_TX_EN=1;                        //éèÖÃÎa·¢ËíÄ£ê½
        USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
        for(t = 0; t < len; t++)
        {
                while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);          
                USART_SendData(USART2,buf[t]);
        }
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
        RS485_TX_EN=0;                                //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}               

这是发送函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表