打印
[STM32F1]

usart 单线半双工, 一直发不出数据,不知是何原因

[复制链接]
2979|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
m191007|  楼主 | 2014-7-31 16:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 m191007 于 2014-7-31 16:52 编辑

配置为开漏输出 但一直抓不到数据
  float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
    mantissa<<=4;
        mantissa+=fraction;
        RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
        RCC->APB2ENR|=1<<14;  //使能串口时钟
        GPIOA->CRH&=0XFFFFFF0F;//PA9开楼输出
        GPIOA->CRH|=0X000000F0;//PA9开楼输出
//            GPIOA->CRH&=0XFFFFF00F;//IO状态设置
//          GPIOA->CRH|=0X000008B0;//IO状态设置
        RCC->APB2RSTR|=1<<14;   //复位串口1
        RCC->APB2RSTR&=~(1<<14);//停止复位                     
        //波特率设置
        USART1->BRR=mantissa; // 波特率设置         
        USART1->CR1|=0X200C;  //1位停止,无校验位.  禁止RX接收0X2008 使能RX接收0X200C
            USART1->CR3|=1<<3;//HDSEL = 1,选择半双工
            USART1->CR2&=~(1<<14);//LINEN = 0
            USART1->CR2&=~(1<<11);//CLKEN = 0
            USART1->CR3&=~(1<<5);//SCEN = 0
            USART1->CR3&=~(1<<1);//IREN = 0
   
        //使能接收中断
        USART1->CR1|=1<<8;    //PE中断使能
        USART1->CR1|=1<<5;    //接收缓冲区非空中断使能







沙发
m191007|  楼主 | 2014-7-31 16:53 | 只看该作者
上面没有加入 RCC->APB2ENR|=1<<0;  //使能AF时钟
目前已经加入时钟 但数据会产生异常

使用特权

评论回复
板凳
airwill| | 2014-7-31 16:58 | 只看该作者
既然是开漏输出, 那么确认一下外部上拉是否可靠呢?

使用特权

评论回复
地板
m191007|  楼主 | 2014-7-31 17:09 | 只看该作者
airwill 发表于 2014-7-31 16:58
既然是开漏输出, 那么确认一下外部上拉是否可靠呢?

你好 发现只有复用的推挽才能发送数据,通用的推挽 开漏,还有 复用开漏 都无法发送数据成功,但官方例程是吧 数据配制成 复用开漏的
  /* Configure USARTy Tx as alternate function open-drain */
  GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  不能发送数据
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

不知道为何

使用特权

评论回复
5
m191007|  楼主 | 2014-7-31 17:33 | 只看该作者
airwill 发表于 2014-7-31 16:58
既然是开漏输出, 那么确认一下外部上拉是否可靠呢?

是否因为若设置成 开漏模式,但我外部没有配置上啦电阻,导致无输出数据

使用特权

评论回复
6
airwill| | 2014-7-31 17:36 | 只看该作者
很 可能,  可以配置内部上拉来输出高电平, 但是内部上拉的能力太弱, 频率稍高, 稳定性就不好.
建议使用外部上拉电阻.

使用特权

评论回复
7
m191007|  楼主 | 2014-7-31 22:06 | 只看该作者
airwill 发表于 2014-7-31 17:36
很 可能,  可以配置内部上拉来输出高电平, 但是内部上拉的能力太弱, 频率稍高, 稳定性就不好.
建议使用外部 ...

嗯,已经确认是 内部上啦不够强的问题

使用特权

评论回复
8
kevillu| | 2014-8-1 11:25 | 只看该作者
串口输出不是要配置为 复用推挽输出么?

使用特权

评论回复
9
香水城| | 2014-8-1 13:19 | 只看该作者
官方例程里不会把USART-TX配置成“开漏”吧?我看了几个例程都是配置成推挽。

另外,对于STM32F1的各个外设模块应该如何配置对应GPIO引脚,请大家去看参考手册9.1.11章节



使用特权

评论回复
10
yanhaiyuyu| | 2014-8-1 14:54 | 只看该作者
好久没来这个论坛了,发现大家都好牛了

使用特权

评论回复
11
zz2013| | 2016-11-24 14:50 | 只看该作者
香水城 发表于 2014-8-1 13:19
官方例程里不会把USART-TX配置成“开漏”吧?我看了几个例程都是配置成推挽。

另外,对于STM32F1的各个外 ...

但是手册在串口对应的章节讲到单线半双工模式下确实要配置成开漏或者推挽输出。

使用特权

评论回复
12
sonicll| | 2019-9-4 09:21 | 只看该作者
本帖最后由 sonicll 于 2019-9-4 09:22 编辑

虽然有点挖坟了,但我最近正好在调试半双工模式,我来说一下,单线半双工模式,只使用TX引脚,GPIO配置为复用推挽或者复用开漏都是可以的,但是,一定要记得加上拉电阻!!没有上拉电阻是无法正常通信的!!

使用特权

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

本版积分规则

4

主题

23

帖子

1

粉丝