OpenEdv-开源电子网

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

485通信

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
发表于 2019-1-16 15:57:22 | 显示全部楼层 |阅读模式
1金钱
请问一下,战舰V3的485通信为什么控制端是PD7而不是PA1呢?PA1可以用作485的控制端吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:45:57 | 显示全部楼层
因为我自己搞了块板子,芯片是RCT6,用PA2 PA3做TX和RX PA1做485控制,但是485通信不成功求大神指导问题!
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:47:33 | 显示全部楼层
主函数是:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "rs485.h"



                                        
int main(void)
{         
    u8 key=0;
        u8 t=0;
        u8 rs485buf[5];
         
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200
        LED_Init();                                  //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        LCD_Init();                                   //3õê¼»ˉLCD                           
        RS485_Init(9600);                //3õê¼»ˉRS485
        POINT_COLOR=RED;                //éèÖÃ×ÖìåÎaoìé«
        LCD_ShowString(30,50,200,16,16,"WarShip & Elite STM32");
        LCD_ShowString(30,70,200,16,16,"USB-RS485 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2018/09/11");       
        while(1)
        {
                RS485_Receive_Data(rs485buf,&key);
                delay_ms(10);
                if(key)                                                        //½óêÕμ½óDêy¾Y
                {
                        RS485_Send_Data(rs485buf,5);//·¢Ëí5¸ö×Ö½ú        
                }
                t++;
                delay_ms(40);
                if(t==20)
                {
                        LED0=!LED0;                                        //ìáê¾Ïμí3ÕyÔúÔËDD       
                        t=0;
                }                  
        }
}


当中LCD没用,搬的源码改的,所有没动
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:47:59 | 显示全部楼层
这是485的初始化函数:
#include "sys.h"                    
#include "rs485.h"         
#include "delay.h"

//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEKÕ½½¢STM32¿a·¢°å
//RS485Çy¶ˉ ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2012/9/9
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


#ifdef EN_USART2_RX           //èç1ûê1Äüá˽óêÕ


//½óêÕ»o′æÇø        
u8 RS485_RX_BUF[64];          //½óêÕ»o3å,×î′ó64¸ö×Ö½ú.
//½óêÕμ½μÄêy¾Y3¤¶è
u8 RS485_RX_CNT=0;                     
  
void USART2_IRQHandler(void)
{
        u8 res;            

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //½óêÕμ½êy¾Y
        {         
                                  
                res =USART_ReceiveData(USART2);         //¶á衽óêÕμ½μÄêy¾Y
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                        RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1
                }
        }                                                                                           
}
#endif                                                                                 
//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú2
//pclk1CLK1ê±&#214;ó&#198;μ&#194;ê(Mhz)
//bound:2¨ì&#216;&#194;ê          
void RS485_Init(u32 bound)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ê1&#196;üGPIOA,Dê±&#214;ó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//ê1&#196;üUSART2ê±&#214;ó
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PD7&#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP ;                  //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //PA2
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP ;        //&#184;′ó&#195;í&#198;íì
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //&#184;&#161;&#191;&#213;ê&#228;è&#235;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//&#184;′&#206;&#187;′&#174;&#191;ú2
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//í£&#214;1&#184;′&#206;&#187;

       
#ifdef EN_USART2_RX                          //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;
        USART_InitStructure.USART_BaudRate = bound;//2¨ì&#216;&#194;êéè&#214;&#195;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8&#206;&#187;êy&#190;Y3¤&#182;è
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;///&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//ê&#213;·¢&#196;£ê&#189;

  USART_Init(USART2, &USART_InitStructure); ; //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú
  
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //ê1&#196;ü′&#174;&#191;ú2&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;2&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //′óó&#197;&#207;è&#188;&#182;2&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1&#196;üía2&#191;&#214;D&#182;&#207;í¨μà
        NVIC_Init(&NVIC_InitStructure); //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//&#191;a&#198;&#244;&#214;D&#182;&#207;
   
  USART_Cmd(USART2, ENABLE);                    //ê1&#196;ü′&#174;&#191;ú

#endif

  RS485_TX_EN=0;                        //&#196;&#172;è&#207;&#206;a&#189;óê&#213;&#196;£ê&#189;

}

//RS485·¢&#203;ílen&#184;&#246;×&#214;&#189;ú.
//buf:·¢&#203;í&#199;&#248;ê×μ&#216;&#214;·
//len:·¢&#203;íμ&#196;×&#214;&#189;úêy(&#206;aá&#203;oí±&#190;′ú&#194;&#235;μ&#196;&#189;óê&#213;&#198;¥&#197;&#228;,&#213;aà&#239;&#189;¨òé2&#187;òa3&#172;1y64&#184;&#246;×&#214;&#189;ú)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {                  
                while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);          
                USART_SendData(USART2,buf[t]);
        }         

        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);               
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
}
//RS4852é&#209;ˉ&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
//buf:&#189;óê&#213;&#187;o′&#230;ê×μ&#216;&#214;·
//len:&#182;áμ&#189;μ&#196;êy&#190;Y3¤&#182;è
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //&#196;&#172;è&#207;&#206;a0
        delay_ms(10);                //μè′y10ms,á&#172;D&#248;3&#172;1y10ms&#195;&#187;óD&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;êy&#190;Y,&#212;òè&#207;&#206;a&#189;óê&#213;&#189;áê&#248;
        if(rxlen==RS485_RX_CNT&&rxlen)//&#189;óê&#213;μ&#189;á&#203;êy&#190;Y,&#199;ò&#189;óê&#213;íê3éá&#203;
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //&#188;&#199;&#194;&#188;±&#190;′&#206;êy&#190;Y3¤&#182;è
                RS485_RX_CNT=0;                //&#199;&#229;á&#227;
        }
}

回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:48:22 | 显示全部楼层
求大神指出问题所在,万分感谢
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-1-16 16:51:07 | 显示全部楼层
鱿鱼 发表于 2019-1-16 16:48
求大神指出问题所在,万分感谢

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PD7&#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP ;                  //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_Mode_AF_PP ----GPIO_Mode_Out_PP
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:53:19 | 显示全部楼层
nashui_sx 发表于 2019-1-16 16:51
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PD7&#182;&#203;&#191; ...

额。。这个原来就是GPIO_Mode_Out_PP。我看了手册改成的AF_PP两个都不行- -
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-1-16 16:56:18 | 显示全部楼层
鱿鱼 发表于 2019-1-16 16:53
额。。这个原来就是GPIO_Mode_Out_PP。我看了手册改成的AF_PP两个都不行- -

#include "rs485.h"   看看RS485_TX_EN有没有改
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 16:59:41 | 显示全部楼层
本帖最后由 鱿鱼 于 2019-1-16 17:00 编辑
nashui_sx 发表于 2019-1-16 16:56
#include "rs485.h"   看看RS485_TX_EN有没有改

#ifndef __RS485_H
#define __RS485_H                        
#include "sys.h"                                                                           

                                    
extern u8 RS485_RX_BUF[64];                 //&#189;óê&#213;&#187;o3&#229;,×&#238;′ó64&#184;&#246;×&#214;&#189;ú
extern u8 RS485_RX_CNT;                           //&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y3¤&#182;è

//&#196;£ê&#189;&#191;&#216;&#214;&#198;
#define RS485_TX_EN                PDout(7)        
//è&#231;1&#251;&#207;&#235;′&#174;&#191;ú&#214;D&#182;&#207;&#189;óê&#213;£&#172;&#199;&#235;2&#187;òa×¢êíò&#212;&#207;&#194;oê&#182;¨ò&#229;
#define EN_USART2_RX         1                        //0,2&#187;&#189;óê&#213;;1,&#189;óê&#213;.




void RS485_Init(u32 bound);
void RS485_Send_Data(u8 *buf,u8 len);
void RS485_Receive_Data(u8 *buf,u8 *len);


#endif           
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 17:01:20 | 显示全部楼层
鱿鱼 发表于 2019-1-16 16:59
#ifndef __RS485_H
#define __RS485_H                        
#include "sys.h"                    ...

是吧PD7改成PA1吗?我改了好像也没用- -
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-1-16 17:25:31 | 显示全部楼层
鱿鱼 发表于 2019-1-16 17:01
是吧PD7改成PA1吗?我改了好像也没用- -

你要是这样写代码,那你就继续慢慢查
水平觉得差点,就直接用可用的代码,一点一点的改,直到改到自己想要的,
你这样给你说一个改一个,啥时候能改完,自己都不知道改的哪里有问题
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-12-24
在线时间
11 小时
 楼主| 发表于 2019-1-16 17:27:57 | 显示全部楼层
nashui_sx 发表于 2019-1-16 17:25
你要是这样写代码,那你就继续慢慢查
水平觉得差点,就直接用可用的代码,一点一点的改,直到改到自己想 ...

谢谢!。。也是因为刚接触,属于小白阶段。都不知道问题在哪。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-16 18:33:11 | 显示全部楼层
nashui_sx 发表于 2019-1-16 17:25
你要是这样写代码,那你就继续慢慢查
水平觉得差点,就直接用可用的代码,一点一点的改,直到改到自己想 ...

大佬,说得对
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-1-17 08:41:32 | 显示全部楼层
小白一个啊!!!!
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2019-1-17 09:09:42 | 显示全部楼层
如果控制端有问题,那就只能发或者只能收,最简单的就是焊一根跳线,直接把控制端焊到3.3V电源上强制拉高或者焊到GND上强制拉低
如果USART配置有问题,那就收发都不行
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2019-1-17 10:45:58 | 显示全部楼层
控制端就可以是任何io,硬件上也可以实现不用控制的,硬件自己切换
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 04:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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