查看: 7592|回复: 12

[求助] lpc1768的串口发送完成标志

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
    发表于 2021-1-1 16:30:36 | 显示全部楼层 |阅读模式
    微信截图_20210101162813.png
    请问,这个就是和stm32的TC标志类似吧,就是把移位寄存器的数据全都发送到tx引脚上了?
    如果是的话,就可以根据此标志位来判断串口是否发送到从机的串口中,我可以切换主机485的方向引脚。

    最佳答案

    是的,可以通过这个寄存器判断“把移位寄存器的数据全都发送到tx引脚上了’。 而已查看一下用户手册中UART 内部结构图: [attach]493893[/attach]
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1503 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4691

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10088
    最后登录
    2025-7-29
    发表于 2021-1-1 18:14:34 | 显示全部楼层
    极可能不是的——我没有仔细查阅datasheet
    LPC的MCU有FIFO,而STM32系列没有FIFO。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
     楼主| 发表于 2021-1-2 10:47:51 | 显示全部楼层
    jobszheng5 发表于 2021-1-1 18:14
    极可能不是的——我没有仔细查阅datasheet
    LPC的MCU有FIFO,而STM32系列没有FIFO。
    ...

    我lpc1768设置了fifo=1,那就和stm32的tc一样了吧?如果不是,那有办法判断最后一字节都发送出去吗??不然都无法判断发送完成的时刻啊??
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-6-30 17:11
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    5

    主题

    439

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1139
    最后登录
    2025-5-16
    发表于 2021-1-4 09:39:23 | 显示全部楼层
    我都是直接把485在电路上做成自动收发的,不存在这种切换引脚。
    加油
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    713

    主题

    6372

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25023
    最后登录
    2025-7-31
    发表于 2021-1-4 10:32:58 | 显示全部楼层
    是的,可以通过这个寄存器判断“把移位寄存器的数据全都发送到tx引脚上了’。
    而已查看一下用户手册中UART 内部结构图:
    2121.jpg

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-25 11:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    0

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    53
    最后登录
    2021-8-27
    发表于 2021-1-4 10:55:24 | 显示全部楼层
    本帖最后由 helloomryang 于 2021-1-4 11:47 编辑
    wdliming-222461 发表于 2021-1-2 10:47
    我lpc1768设置了fifo=1,那就和stm32的tc一样了吧?如果不是,那有办法判断最后一字节都发送出去吗??不 ...

    参考手册以下章节
    14.4.8  
    UARTn Line Status Register

    这个寄存器的 bit 6,可以用它来判断一个字节是否发送完成

    Transmitter Empty(TEMT)
        TEMT is set when both UnTHR and UnTSR are empty; TEMT is cleared when
        either the UnTSR or the UnTHR contain valid data.

        0     UnTHR and/or the UnTSR contains valid data.
        1     UnTHR and the UnTSR are empty.




    我就是这样用的,前提是fifo设置为1个字节

    /*********************************************************************//**
    * Macro defines for Macro defines for UART line status register
    **********************************************************************/
    /** Line status register: Receive data ready*/
    #define UART_LSR_RDR        ((uint8_t)(1<<0))
    /** Line status register: Overrun error*/
    #define UART_LSR_OE         ((uint8_t)(1<<1))
    /** Line status register: Parity error*/
    #define UART_LSR_PE         ((uint8_t)(1<<2))
    /** Line status register: Framing error*/
    #define UART_LSR_FE         ((uint8_t)(1<<3))
    /** Line status register: Break interrupt*/
    #define UART_LSR_BI         ((uint8_t)(1<<4))
    /** Line status register: Transmit holding register empty*/
    #define UART_LSR_THRE       ((uint8_t)(1<<5))
    /** Line status register: Transmitter empty*/
    #define UART_LSR_TEMT       ((uint8_t)(1<<6))
    /** Error in RX FIFO*/
    #define UART_LSR_RXFE       ((uint8_t)(1<<7))
    /** UART Line status bit mask */
    #define UART_LSR_BITMASK    ((uint8_t)(0xFF))


    /*********************************************************************//**
    * @brief       Check whether if UART is busy or not
    * @param[in]   UARTx   UART peripheral selected, should be:
    *              - LPC_UART0: UART0 peripheral
    *              - LPC_UART1: UART1 peripheral
    *              - LPC_UART2: UART2 peripheral
    *              - LPC_UART3: UART3 peripheral
    * @return      RESET if UART is not busy, otherwise return SET.
    **********************************************************************/
    FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx)
    {
        if (UARTx->LSR & UART_LSR_TEMT)
        {
            return RESET;
        }
        else
        {
            return SET;
        }
    }

    以上两个是库里面的东西
    下面这个是自己写的

    void sys_uart2_send_byte(uint8_t tmep_data)
    {
        UART_SendByte(LPC_UART2,tmep_data);
        while(SET == UART_CheckBusy(LPC_UART2));//wait busy
    }











    LPC1768_UM10360.pdf

    4.36 MB, 下载次数: 5, 下载积分: 威望 1

    LPC1768_参考手册

    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
     楼主| 发表于 2021-1-4 21:26:26 | 显示全部楼层
    多谢多谢~~~~~
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
     楼主| 发表于 2021-1-4 21:32:51 | 显示全部楼层
    helloomryang 发表于 2021-1-4 10:55
    参考手册以下章节
    14.4.8  UARTn Line Status Register

    谢谢分享
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
     楼主| 发表于 2021-1-4 22:14:16 | 显示全部楼层
    Q向涵Q 发表于 2021-1-4 09:39
    我都是直接把485在电路上做成自动收发的,不存在这种切换引脚。

    硬件已经做好了,没办法啊
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    987
    最后登录
    2025-4-2
     楼主| 发表于 2021-1-5 09:57:45 | 显示全部楼层
    小恩GG 发表于 2021-1-4 10:32
    是的,可以通过这个寄存器判断“把移位寄存器的数据全都发送到tx引脚上了’。
    而已查看一下用户手册中UART  ...

    网上我看了一篇文章,感觉仅仅通过tsr还不代表数据发送到 对端了,因为电路上有延时的,

    摘录:
    在发送完最后一个字节的发送完成中断中,直接将控制IO口使能485芯片的接收。殊不知,由于电容导致的信号延时,串口数据还没有完全发送到总线,485芯片就被置为接收状态,导致最后几个bit的数据误码;

    没有正确理解发送完成中断以及发送缓存器空中断之间的差别;

    发送完成中断一般是指串口数据已经从移位寄存器从端口送出。但是并不说明已经被送到RS485总线。从MCU的IO口到RS485总线还需要考虑隔离光耦、电容、RS485芯片的延时;

    发送缓存器空中断是指腾出了缓存的位置,可以缓存数据。此时,上一个数据可能还在移位寄存器中被紧张有序地按位移出到IO口,此时把RS485芯片置为接收。还正在移位的数据就嗝屁了。

    因此
    一定要搞清楚选用的中断是发送完成中断还是缓存器空的中断;

    在发送中断中,不能立即切为接收,应当延时一段时间,我现在的做法是不管三七二十一,在发送中断中,如果判断为最后一个byte,则延时1.7ms将RS485设置为接收;

    不应该启动定时器进行延时,定时器资源很宝贵,应该在100us左右的定时器中断中,通过变量计数来进行1.7ms左右的延时;
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-2 14:50 , Processed in 0.267532 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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