OpenEdv-开源电子网

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

usart多机通信 地址标记检测 静默模式

[复制链接]

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-12-25 12:26:08 | 显示全部楼层 |阅读模式
参考官方例程做usart多机通信,它是怎么样发送地址的?

只看到 USART_SendData(USARTy, 0x33);那地址怎么发送了的?



int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
       
  /* System Clocks Configuration */
  RCC_Configuration();
      
  /* Configure the GPIO ports */
  GPIO_Configuration();

  /* Initialize Leds, Wakeup and Key Buttons mounted on STM3210X-EVAL board */
  STM_EVAL_LEDInit(LED1);
  STM_EVAL_LEDInit(LED2);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);
  STM_EVAL_PBInit(BUTTON_WAKEUP, BUTTON_MODE_EXTI);         
  STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI); 

/* USARTy and USARTz configuration -------------------------------------------*/
  /* USARTy and USARTz configured as follow:
        - BaudRate = 9600 baud 
        - Word Length = 9 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
  /* Configure USARTy */
  USART_Init(USARTy, &USART_InitStructure);
  /* Configure USARTz */
  USART_Init(USARTz, &USART_InitStructure);
 
  /* Enable the USARTy */
  USART_Cmd(USARTy, ENABLE);
  /* Enable the USARTz */
  USART_Cmd(USARTz, ENABLE);

  /* Set the USARTy Address */
  USART_SetAddress(USARTy, 0x1);
  /* Set the USARTz Address */
  USART_SetAddress(USARTz, 0x2);

  /* Select the USARTz WakeUp Method */
  USART_WakeUpConfig(USARTz, USART_WakeUp_AddressMark);    //被地址标记唤醒
 
  while (1)
  {
    /* Send one byte from USARTy to USARTz */
    USART_SendData(USARTy, 0x33);
    /* Wait while USART1 TXE = 0 */
    while(USART_GetFlagStatus(USARTz, USART_FLAG_TXE) == RESET)
    {
    }
   
    if(USART_GetFlagStatus(USARTz, USART_FLAG_RXNE) != RESET)
    {
      if(USART_ReceiveData(USARTz) == 0x33)
      {
        STM_EVAL_LEDToggle(LED1);
        Delay(0x5FFFF);
        STM_EVAL_LEDToggle(LED2);
        Delay(0x5FFFF);
        STM_EVAL_LEDToggle(LED3);
        Delay(0x5FFFF);
        STM_EVAL_LEDToggle(LED4);
        Delay(0x5FFFF);
      }
    }
  }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-6-21
在线时间
31 小时
发表于 2018-3-29 21:08:50 | 显示全部楼层
qiuxuanbin 发表于 2018-3-16 20:06
你好,这是从哪知道的?固件库上的注释有吗,我没找到!还是说只有手册上有写?

USART 的控制寄存器中有一个叫做WAKE的bit位,当这个位被置位时,数据的最高位为1,说明这个数据是个地址数据,地址被存在低四位中。接受方会将这个低四位数据与自身的数据进行对比,若是相符合的话,就会退出所谓的静默模式,可以接受数据。注意这里的最高位是指你设定的数据格式的最高位 设定为9位的话,就是第九位,是这个意思
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-25 21:14:29 | 显示全部楼层
没用过这个功能,直接做协议吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2013-12-26 08:38:34 | 显示全部楼层
回复【2楼】正点原子:

没用过这个功能,直接做协议吧。

---------------------------------

昨天查了一些 资料 算是调通了。

请问原子哥,你说的是什么协议,有例程吗?谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-26 10:53:13 | 显示全部楼层
回复【3楼】sunday151640:
---------------------------------
参见:modbus
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2013-12-26 11:38:01 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------


谢谢 原子哥。。
回复 支持 反对

使用道具 举报

57

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-2-20
在线时间
1 小时
发表于 2013-12-27 00:14:42 | 显示全部楼层

我看了下,最近准备用STM32做主控,STM8做从机,发送的地址在寄存器里面,他不像51,自己还得定义一个变量来存地址,然后自己写程序识别,STM32是硬件自己帮你识别的。。。详见ADD设置。。。

创新超越梦想,拼搏创造奇迹....
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2013-12-27 08:57:05 | 显示全部楼层
回复【6楼】废墟崛起之厦:
---------------------------------


en。谢谢。。现在能够分别发送不同数据给多个从机了。

就是从机收到数据之后还想要返回数据,没有调通。

请问在从机静默模式下,从机能发送吗?

没有看到文档中静默模式对发送的描述
回复 支持 反对

使用道具 举报

57

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-2-20
在线时间
1 小时
发表于 2013-12-27 09:47:23 | 显示全部楼层

当然可以,如果是485的话,由于485的局限性,只能一主多从,总线只能有一个处于活动状态...顺便问下,你在做什么呢?

创新超越梦想,拼搏创造奇迹....
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2013-12-27 09:58:02 | 显示全部楼层
回复【8楼】废墟崛起之厦:
---------------------------------
那我再试试,可能哪儿弄错了。。自己做着玩的,练习使用串口。

我之前把 接收到的 地址数据后面的那个数作为从机的发送条件,从机接收是正常,但是就是判断之后不执行发送,我还在里面加了个点亮led,也没有量。

以为是从机又进入静默了。。。
回复 支持 反对

使用道具 举报

27

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
852
金钱
852
注册时间
2013-12-25
在线时间
103 小时
发表于 2014-1-15 14:33:54 | 显示全部楼层
回复【3楼】sunday151640:
---------------------------------
你怎么调通这个多机通信的啊??我也是和你同样的问题,给我发一下你写的程序吧。。。谢谢
海到无边天作岸?
山登绝顶我为峰
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2014-1-15 16:49:58 | 显示全部楼层
回复【10楼】为你分心:
---------------------------------
以前的调试 笔记

读懂例程需要做的事情
  通过flags进行两个串口之间半双工通信
  (1、usart_y用TEXflag通过TxBuffer1发送data给USARTz
  用存储在RxBuffer2中的RXNE flag与接收到的数据进行比较
  "TransferStatus1" 由返回一个比较值 
  (2、USARTz发送TXE flag 通过  TxBuffer2 发送data 给USARTy  
  数据接收:用存储在RxBuffer1 中的RXNEflag与数据进行比较
  比较结果存储在"TransferStatus2" 
  

罗列出例程需要调用有用资源
  发送一个数组
Usart 发送 接收 静默模式

调用相应资源
  1)写程序rb发送8字节 c8接收并且显示在nokia上面
  2)rb能够分别发送不同的数据到两个c8上面
  3)c8接收到指定命令,发送数据给rb 在tft上面进行显示(调用tft、调试回传)
调试通过,一定要注意,定义变量的范围,u16,不然9位数据只能读取u8



STM32从机配置如下
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_9b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART1,USART_IT_TC,ENABLE);
        USART_Init(USART1, &USART_InitStructure); 
    USART_Cmd(USART1, ENABLE);
        USART_WakeUpConfig(USART1,USART_WakeUp_AddressMark);//静默模式设置 1、USART_WakeUp_IdleLine 空闲总线唤醒//2、USART_WakeUp_AddressMark  地址标记唤醒
        USART_SetAddress(USART1, 0x1);           //设置地址  从机1
        USART_ReceiverWakeUpCmd(USART1,ENABLE);          //使能接收唤醒

。。。。。。同样配置
USART_SetAddress(USART1, 0x3);           //设置地址  从机2

每次分别发送u16 send_data[8]={0x101,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
                  u16 send_data4[8]={0x103,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
可以找到从机且接收准确,现在有这种现象:第一次从机接收到0x101(或0x103)唤醒后接收数据正常,然后过5s我直接发送u16 send_data3[8]={0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};从机不能接收数据,但发送u16 send_data4[8]={0x103,0x04,0x05,0x06,0x07,0x08,0x09,0x10};从机可以正常接收数据
回复 支持 反对

使用道具 举报

27

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
852
金钱
852
注册时间
2013-12-25
在线时间
103 小时
发表于 2014-1-16 09:07:23 | 显示全部楼层
回复【11楼】sunday151640:
---------------------------------
十分感谢,已经调通了。。。
海到无边天作岸?
山登绝顶我为峰
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2014-1-16 10:05:56 | 显示全部楼层
回复【12楼】为你分心:
---------------------------------
共同进步。。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-2-27
在线时间
10 小时
发表于 2017-2-10 14:54:30 | 显示全部楼层
怎么联系两位调过串口一主多从的朋友,我QQ531950811 急请教
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2022-7-22
在线时间
0 小时
发表于 2017-3-8 15:29:29 | 显示全部楼层
sunday151640 发表于 2014-1-15 16:49
回复【10楼】为你分心:
---------------------------------
以前的调试&nbsp;笔记

读懂例程需要做的事情
...

您好
正在做32的一主多从串口通讯
一头雾水,没有头绪
大神能指点我一下么
谢谢了
QQ:1151205928
再次谢谢
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2017-3-11 15:44:23 | 显示全部楼层
junfrom1989 发表于 2017-3-8 15:29
您好
正在做32的一主多从串口通讯
一头雾水,没有头绪

用modbus协议。 很方便。。
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-5-9
在线时间
7 小时
发表于 2017-4-10 22:58:58 | 显示全部楼层
lengruobing 发表于 2017-2-10 14:54
怎么联系两位调过串口一主多从的朋友,我QQ531950811 急请教

请问调同了吗?我也有这个问题想请教一下
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-5-9
在线时间
7 小时
发表于 2017-4-10 22:59:13 | 显示全部楼层
junfrom1989 发表于 2017-3-8 15:29
您好
正在做32的一主多从串口通讯
一头雾水,没有头绪

请问调同了吗?我也有这个问题想请教一下
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-5-9
在线时间
7 小时
发表于 2017-4-10 22:59:50 | 显示全部楼层
sunday151640 发表于 2017-3-11 15:44
用modbus协议。 很方便。。

数据寄存器必须得16位的吗?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-7-12
在线时间
2 小时
发表于 2017-7-12 18:37:17 | 显示全部楼层
为何从旧地址设定为01 和03 而寻址的时候主机你发的是0x101 0x103?
回复 支持 反对

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-6-21
在线时间
31 小时
发表于 2017-8-6 10:23:55 | 显示全部楼层
Ailoop 发表于 2017-7-12 18:37
为何从旧地址设定为01 和03 而寻址的时候主机你发的是0x101 0x103?

发送的数据最高位为1 说明是地址,发送的数据最高位为0,说明是数据
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-7-12
在线时间
2 小时
发表于 2017-8-8 16:21:34 | 显示全部楼层
MDZZYUE 发表于 2017-8-6 10:23
发送的数据最高位为1 说明是地址,发送的数据最高位为0,说明是数据

0x101 这是一个16位数据了, 二进制是 0000 0001  0000 0001 最高位不是1啊
如果最高位是1不应该是0x81吗?  1000 0001
这相关的介绍,好像都没讲太明白
回复 支持 反对

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-6-21
在线时间
31 小时
发表于 2017-8-10 15:05:20 | 显示全部楼层
Ailoop 发表于 2017-8-8 16:21
0x101 这是一个16位数据了, 二进制是 0000 0001  0000 0001 最高位不是1啊
如果最高位是1不应该是0x81 ...

USART_WordLength_9b,他配置的数据长度是九位的,所以最高位是bit8位的,你看看你换算的bit8位是不是1
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-1-13
在线时间
3 小时
发表于 2018-3-16 20:06:18 | 显示全部楼层
MDZZYUE 发表于 2017-8-6 10:23
发送的数据最高位为1 说明是地址,发送的数据最高位为0,说明是数据

你好,这是从哪知道的?固件库上的注释有吗,我没找到!还是说只有手册上有写?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-2-23
在线时间
25 小时
发表于 2018-3-21 10:26:36 | 显示全部楼层
我在做485一主多从,遇见从机关断后的干扰问题,一直没有解决,一头雾水,请高手指点···
回复 支持 反对

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-6-21
在线时间
31 小时
发表于 2018-3-29 20:54:59 | 显示全部楼层
qiuxuanbin 发表于 2018-3-16 20:06
你好,这是从哪知道的?固件库上的注释有吗,我没找到!还是说只有手册上有写?

你看技术手册啊,上面有说过,不是固件库
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-10-25
在线时间
0 小时
发表于 2018-10-25 22:43:20 | 显示全部楼层
sunday151640 发表于 2014-1-15 16:49
回复【10楼】为你分心:
---------------------------------
以前的调试&nbsp;笔记

读懂例程需要做的事情
...

为什么我从机接收到的第一个数据总是所发数据和所发地址的集合,比如我发地址0x01,发数据hello,结果收到的是这两个的叠加,接下来都正常,就是发完地址后的第一个数据异常
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 15:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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