通讯芯片TLC16550B及在51平台初始化介绍

TLC16550B芯片内部包含多个寄存器,这些寄存器用于控制和配置芯片的各种功能。以下是TLC16550B芯片中最常用的几个寄存器:

  1. THR (Transmit Holding Register):用于存储待发送的数据,在发送完成之前需要将数据写入该寄存器。

  1. RBR (Receiver Buffer Register):用于存储接收到的数据,在接收到数据后可以从该寄存器读取数据。

  1. IER (Interrupt Enable Register):用于启用或禁用各种中断。例如,通过设置IER寄存器的位0(ETBEI)可以启用发送缓冲区空中断,当THR寄存器为空时会触发此中断。

  1. FCR (FIFO Control Register):用于控制FIFO缓冲区的工作模式。例如,通过设置FCR寄存器的位0(FIFOE)可以启用FIFO缓冲区;通过设置位1-2(RTxC)可以设置FIFO缓冲区的触发水平。

  1. LCR (Line Control Register):用于配置数据位、校验位、停止位等参数。例如,通过设置LCR寄存器的位0-1(WLSx)可以设置数据位宽;通过设置位3-5(PE,PS,PEN)可以设置校验位和奇偶校验模式;通过设置位2(STB)可以设置停止位数。

  1. MCR (Modem Control Register):用于控制调制解调器信号。例如,通过设置MCR寄存器的位0-1(DTR,RTS)可以控制DTR和RTS信号;通过设置位4(LOOP)可以启用循环模式。

  1. LSR (Line Status Register):用于报告串口状态。例如,通过读取LSR寄存器的位0(DR)可以判断是否有字符可供读取;通过读取位5(THRE)可以判断发送缓冲区是否为空。

  1. MSR (Modem Status Register):用于报告调制解调器状态。例如,通过读取MSR寄存器的位0(CTS)可以判断CTS信号状态;通过读取位4(DCD)可以判断DCD信号状态。

TLC16550B芯片的初始化需要配置多个寄存器,下面是一个简单的示例代码,展示如何对TLC16550B进行基本配置:

voidInit_TLC16550B(void) {
    // 设置波特率
    TH1 = 0xfd;
    TL1 = 0xfd;
    TMOD |= 0x20;
    
    // 禁用中断
    ES = 0;
    
    // 设置数据位、校验位和停止位
    SCON = 0x03;
    
    // 启用FIFO缓冲区,并设置触发水位为14字节
    FCR = 0x87;
    
    // 清除并禁用所有中断
    IER = 0x00;
    EFR = 0x00;
    LSR = 0xff;
    MSR = 0x00;
}

void main() {
    Init_TLC16550B();
    // ...
}

以上代码中,Init_TLC16550B()函数用于初始化TLC16550B芯片。首先通过设置定时器1的重装载值来配置波特率;然后禁用中断,设置数据位、校验位和停止位;接着启用FIFO缓冲区,并设置触发水位为14字节;最后清除并禁用所有中断。

注:以上示例代码仅供参考,并不保证在所有系统上都能正常运行。引脚连接方式、波特率等参数需要根据具体情况进行调整。

TLC16550B芯片的工作需要一个稳定的时钟信号,而波特率是通过时钟信号来计算的。在8051单片机中,可以使用定时器来产生一定频率的时钟信号,进而实现波特率的配置。

具体地说,在TLC16550B芯片中,波特率是通过BAUD = Fosc / (16 * n)来计算得出的,其中Fosc是8051单片机的系统时钟频率,n是预分频系数。为了使波特率配置更加灵活,TLC16550B芯片还提供了一个可编程分频器(即Divisor Latch),可以通过向该分频器写入不同的值来设置不同的分频系数n。

因此,在初始化TLC16550B芯片时,我们需要先根据指定的波特率计算出对应的分频系数n,然后将n的值写入Divisor Latch寄存器。由于Divisor Latch只有8位宽度,因此当需要设置较高的波特率时,可能需要使用比较大的预分频系数,这就需要定时器来辅助实现预分频功能。

例如,在上面示例代码中,我们使用了定时器1来产生一定频率的时钟信号,并计算了对应的重装载值(TH1和TL1)。这样,当TLC16550B芯片接收到数据并开始发送时,定时器1会自动启动,每隔一定时间(即TH1和TL1所设置的时间)产生一个时钟脉冲,用于驱动TLC16550B芯片发送数据。

TLC16550B芯片需要一个稳定的时钟信号来实现波特率配置,并在发送和接收数据时产生正确的波特率。如果不使用定时器1,需要找到其他可靠的时钟源来代替。

在一些特殊应用场景中,可能已经有了稳定的外部时钟信号,可以直接将该信号输入到TLC16550B芯片的XTAL1引脚上。这样,TLC16550B芯片就可以根据外部时钟信号来生成波特率时钟,并不再需要定时器。

另外,对于一些高性能单片机,也可能提供一些硬件模块来实现波特率配置,从而无需使用定时器。例如,在某些ARM Cortex-M系列的微控制器中,内置有一个专门用于串口通信的硬件模块(USART),通过向该模块的寄存器写入相应的值即可实现波特率的配置,无需使用定时器。

外接晶振

外接晶振可以用作TLC16550B芯片的时钟源。

TLC16550B芯片的XTAL1和XTAL2引脚用于连接外部晶振。晶振的频率应该与TLC16550B芯片需要的波特率相匹配,即:

波特率 = 晶振频率 / (16 * n)

其中,n为Divisor Latch寄存器的值,可通过软件编程来设置。

需要注意的是,在使用外部晶振时,需要将TLC16550B芯片的MCR寄存器中的位5(UCLK)设置为0,以使芯片工作在外部时钟模式下。同时,还需要根据具体情况调整Divisor Latch的值,以匹配实际使用的晶振频率。

TL16C550B是一个串口通信芯片,它具有多种控制和状态寄存器。以下是一些常见的寄存器地址:

  • RBR (Receive Buffer Register):0x00

  • THR (Transmit Holding Register):0x00

  • IER (Interrupt Enable Register):0x01

  • IIR (Interrupt Identification Register):0x02

  • FCR (FIFO Control Register):0x02

  • LCR (Line Control Register):0x03

  • MCR (Modem Control Register):0x04

  • LSR (Line Status Register):0x05

  • MSR (Modem Status Register):0x06

  • SCR (Scratchpad Register):0x07

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值