精华内容
下载资源
问答
  • 摘要:SP2338DP是一种新颖的串口扩展器,可将一个高波特率的UART扩展为3个,解决了普通单片机UART串口太少的问题。文中给出该器件的主要特性、引脚说明及应用说明,并以AT89C52单片机为例给出多串口扩展应用电路及...
  • ARM9串口扩展器

    2013-03-08 17:06:54
    基于ARM9的串口扩展的设计,应用于物联网中
  • 基于单片机的串口扩展器设计和应用、电子技术,开发板制作交流
  • 介绍了一种基于单片机P89LPC931的SPI总线扩展异步串行接口UART的装置,讲述了P89LPC931单片机的开发使用,重点详细阐明了扩展芯片GM8142的开发使用。用户可以根据不同的应用环境灵活配置参数。本装置成本低,可靠性...
  • 双DSP系统串口扩展

    2020-10-21 20:38:04
    双DSP系统串口扩展,在研制无线分组网络路由控制时,采用了双DSP结构进行数据处理,另外还需扩展8个串口,很显然这是DSP本身所无法解决的,故必须进行串口扩展。常用串口扩展方法:从本质上讲,所有的串口扩展接口...
  • TOP-COM8串口扩展器编程手册
  • Arduino的端口连接到扩展器,之后信号被路由到外围设备连接的八个端口。为简单起见,我们将使用三个端口,但只需几个步骤,您就可以使扩展使用全部八个端口。 通过UART模式进行通信,结果显示在Arduino串行监视器上...
  • 一种应用于微处理器的串口扩展器设计.pdf
  • 基于LPC系列单片机的串口扩展器设计.pdf
  • 行业制造-电动装置-一种串口扩展器电路.zip
  • 介绍了关于Proface人机界面和yaskawa变频器扩展串口通讯连接说明的详细说明,提供Pro-face的技术资料的下载。
  • 详述了多串口扩展通信子板设计方案,选用PC/104并口总线通过并/串转换TL16C554实现4个串口的扩展设计,介绍了TL16C554的内部结构及外部特性,给出了扩展模块并进行了分析说明。
  • 串口扩展芯片

    千次阅读 2020-06-24 14:50:51
    串口扩展芯片 WK2124 实现SPI桥接/扩展4个增强功能串口(UART)功能。扩展的子通道具备以下功能特点: 每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps的通道速率; 每个子通道可以独立...

    串口扩展芯片

    WK2124

    实现SPI桥接/扩展4个增强功能串口(UART)功能。扩展的子通道具备以下功能特点:

    1. 每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps的通道速率;
    2. 每个子通道可以独立设置工作在IrDA红外通信;
    3. 每个子通道具备收/发独立的256 BYTE FIFO,FIFO的中断可按用户需求进行编程触发点;

    封装:SSOP20
    工作电压:2.5~5.0V
    具备自动休眠/唤醒功能

    原理框图

    在这里插入图片描述

    封装引脚图

    在这里插入图片描述

    与控制器接口

    在这里插入图片描述

    1. SPI总线:WK2124通过SPI和MCU进行数据通信。SPI会传输命令字节和数据字节。
    2. 中断:WK2124的IRQ连接到MCU的外部中断输入引脚。这个连接非必须,未连接时只能通过查询的编程方式实现对子串口的数据收发,效率较低;
    3. 复位控制:低电平有效,时间长度为10ms。复位以后,所有寄存器值恢复到默认值,SPI总线上的命令解析同时复位;
    4. 时钟电路:采用无源晶振,晶振大小和子串口波特率相关;晶振必须并联的匹配电阻是1M欧姆;
    展开全文
  • 摘要:CP2101及其升级产品CP...该电路的集成度高,内置USB2.0全速功能控制、USB收发、晶体振荡、EEPROM及异步串行数据总线(UART),支持调制解调全功能信号,无需任何外部的USB器件。功能强大,采用MLP-28封
  • 德州仪器(TI)宣布推出三款16位可配置I2C和SMBus I/O扩展器,包括PCA9555、PCA9535以及1PCA9539,可为大多数微处理器(MPU)提供通用I/O扩展,帮助设计人员节省微处理器上的GPIO(通用输入/输出)。此外,这三款I2C从...
  • 在研制无线分组网络路由控制时,采用了双DSP结构进行数据处理,另外还需扩展8个串口,很显然这是DSP本身所无法解决的,故必须进行串口扩展。 常用串口扩展方法 从本质上讲,所有的串口扩展接口电路都是以并行...
  • 嵌入式多参数监护仪系统中一般包括多个独立的硬件采集模块,每个硬件采集模块分别完成对人体的心电、呼吸率、体温、血压和...一种通过硬件实现,使用多串口ARM/MCU或专用串口扩展芯片,可供选择的串口扩展芯片TI公
  • 本课题针对该系统中的串口数目不足的问题,设计了基于STM32F103RCT6微控制和uc/os ii操作系统的串口扩展系统。采用上海大潮电子技术有限公司设计的一款基于STM32RCT6的串口扩展板DC10进行串口扩展,实现车载智能...
  • 嵌入式多参数监护仪系统中一般包括多个独立的硬件采集模块,每个硬件采集模块分别完成对人体的心电、呼吸率、体温、血压和...一种通过硬件实现,使用多串口ARM/MCU或专用串口扩展芯片,可供选择的串口扩展芯片TI公
  • 在研制无线分组网络路由控制时,采用了双DSP结构进行数据处理,另外还需扩展8个串口,很显然这是DSP本身所无法解决的,故必须进行串口扩展。 常用串口扩展方法 从本质上讲,所有的串口扩展接口电路都是以...
  • 介绍UART多串口扩展器SP2337,该器件可将现有的单串口单片机扩展为全新的具有3个串口的单片机。给出该器件的性能、引脚功能及应用,并给出将AT89C51单片机的单串口扩展为三个UART串口的硬件电路及相应程序。
  • webBrowser扩展浏览器通过JS代码与串口通讯,还有JS代码操作upd,tcp通讯,截图等相关操作本地电脑功能.
  • 串口扩展方案总结

    2017-01-18 23:39:00
    在这里给大家介绍一下串口扩展的常用方法,希望会对需要的朋友提供一点价值的参考信息。 串行接口设备凭借其控制灵活、接口简单、占用系统资源少等优点,被广泛应用于工业控制、家庭安防、GPS卫星定位导航以及水...

    转载于: http://bource.blog.163.com/blog/static/684392642006102695700/

     

    在这里给大家介绍一下串口扩展的常用方法,希望会对有需要的朋友提供一点有价值的参考信息。
          串行接口设备凭借其控制灵活、接口简单、占用系统资源少等优点,被广泛应用于工业控制、家庭安防、GPS卫星定位导航以及水、电、气表的抄表等领域。在这些嵌入式系统中,可能会有很多从设备都通过串行接口与主机进行通信,如GPRS MODEM、红外发送和接收模块、RS485总线接口等。这使得开发人员常常面临嵌入式系统中主机串行通信接口不足的问题,针对此问题,本文介绍了几种常见的解决方法。
       
    软件模拟法
      软件模拟法可根据串行通讯的传送格式,利用定时器和主机的I/O口来模拟串行通讯的时序,以达到扩展串口的目的。接收过程中需要检测起始位,这可以使用查询方式,或者,在端口具有中断功能的主机中也可以使用端口的中断进行处理。接收和发送过程中,对定时的处理既可以使用查询方式也可以使用定时器中断方式。为了确保数据的正确性,在接收过程中可以在检测异步传输的起始信号处加上一些防干扰处理,如果是无线传输系统,在接收每个位时可以采用多次采样。对于有线系统来说,1次采样就够了,你看IIC,SPI等,谁去进行了多次采样。
          如今软件模拟以其价格低廉,使用方便,已经成为一种潮流.但是不是所有的单片机都适合用来进行串口的软件模拟的.软件模拟的方法一般有两种,一种是读写I/O,另外一种是读写端口.很容易想到采用读写端口的方式模拟的方式,各串口的波特率必须保持一致.而且当各路数据的输入时间差只有那么几十微秒时,很容易造成数据丢失,虽然看上去这种方式也可以承受输入数据端短路的高数据量压力测试,但这种测试方法是刚好落在了该方案的最佳输入点上.所以真正的使用中是有几率出错的.而采用我们PDK80CXX系列在进行8路以下(4路全双工通讯)的串口模拟时,完全可以采用读写I/O口方式来完成,这样,我们可以非常轻松完成个子口的波特率不等的设置.而且可以达到非常高的速率,当外接8MHz的晶体时,3路子口的最高速度可以达到38400以上.我想就是38400的波特率一般的单片机也就足够了.俗话说,\"打铁还需墩子硬\",而我们PDK80CXX都是工业规格设计,超强的抗干扰性,超宽的高低温工作范围.不知道各位看官目前有没有用过可以在-40~+120摄氏度工作的单片机.所以采用PDK80CXX模拟串口扩展无疑是目前性价比最高的一种解决方案.

      
    利用并口转串口扩展串行口 
    基于Intel8251的串行口扩展
      Intel8251是一种通用的同步/异步发送器(USART),它的工作方式可以通过编程设置,并具有独立的接收/发送器。能以同步或异步串行通信方式工作,自动完成帧格式,具有奇、偶校验和错误检测电路。

    基于TL16C554的串行口扩展
      TL16C554是TI公司生产的4通道异步收发器集成芯片。对TL16C554串行通道的控制,是通过对控制寄存器LCR、IER、DLL、DLM、MCR和FCR编程来实现的。这些控制字决定字符长度、停止位的个数、奇偶校验、波特率以及调制解调器接口。控制寄存器可以任意顺序写入,但是IER必须最后一个写入,因为它控制中断使能。串行通道内的波特率发生器(BRG)允许时钟除以1至65535之间的任意数,BRG根据其不同的三种通用频率中的一种来决定标准波特率。
    16C55x系列芯片还包括16C550、16C552,分别可以扩展1个和2个串行口。

    利用串行口扩展串行口
    基于GM8123/25系列芯片的串行口扩展
      GM8123/25系列串口扩展芯片可以全硬件实现串口扩展,通讯格式可设置,并与标准串口通讯格式兼容。

      GM8125可扩展5个标准串口,通过外部引脚选择串口扩展模式:单通道工作模式和多通道工作模式。单通道模式下,无需设置芯片的通讯格式,子串口和母串口以相同的波特率工作,同一时刻只允许一组子串口和母串口通讯,工作子串口由地址线选择。单通道工作模式适用于所有从机不需要同时通讯,并且通讯过程完全由主机控制的系统。多通道模式下,各子串口波特率相同,允许所有子串口同时与母串口通讯,母串口以子串口波特率的6倍工作。发送时由地址线选择用来发送数据的子串口;接收时子串口能主动响应从机发送的数据,再由母串口发送给主机,同时由地址线返回接收到数据的子串口地址,主机在接收到子串口送来的数据后,可以根据地址线的状态判断数据是由哪一个从机发送的。

      多通道工作模式下,在进行数据通讯前要对芯片进行工作方式设置,包括串口帧格式设置和通讯波特率设置。

      通过串行口和控制引脚相互配合可对芯片进行工作方式设置,引脚MS为0、且STADD2~STADD0为000时写命令字,引脚MS为1、STADD2~STADD0为000时读命令字。进行工作方式设置时,芯片的帧格式和母串口工作波特率与上一次进行数据通讯时一致;而复位后的帧格式为11bit,母串口波特率为7200bps。   

    基于SP2338的串行口扩展
       SP2338是采用低功耗CMOS 工艺设计的通用异步串行口扩展芯片,它可轻松将主机原有的1个串行口扩展成3 个全新的全双工串行口。

      SP2338适用于1个起始位、8个数据位、1个停止位的多串口系统,也就是说其帧格式是不可编程的。主机通过改变ADRI1、ADRI0地址线状态的方式选择3个子串口中的任意一个,3个子串口的地址分别为00、01、10。地址11用于执行SP2338 芯片本身的复位指令0x35 或0xB5、睡眠指令0x55或0xD5、延时指令0x00。向RX0~RX3中的任意一个接收端口写任意数据即可将SP2338唤醒,但由于SP2338的唤醒时间需要25ms左右,故用于芯片唤醒的数据将不会被主机接收。因此,可以先发送一个字节数据用于唤醒芯片,延时25ms后即可进行正常的数据传输。

      未使用的输入端口,如RX0、RX1、RX2等必须连接到VCC;未使用的输出端口,如TX0、TX1、TX2等必须悬空;未使用的ADRI0、ADRI1必须连接到GND。

      主机收发数据时序为:主机TX3接收到一个字节后应立即读取SP2338的输出地址ADRO0、ADRO1的状态,判断接收到的数据来自哪个子串口;主机发送数据时,首先通过ADRI0、ADRI1选择某一个子串口,再向TX3写将发送的数据。

       
    还有分时复用的扩展方法
      在电路设计的过程中,本文设计出一种适合自己系统需要、将1个串口扩展为3个串口的方案,如图1所示。

      其中,4001是四2输入端或非门,40106是六施密特触发器。4001的4脚和9脚分别为主机的RXD和TXD,40106的2脚和9脚为子串口的TXD0和RXD0,6脚和11脚为子串口的TXD1和RXD1,4脚和13脚为子串口的TXD2和RXD2。

      根据图的连接方式和逻辑代数的推导可得:RXD的状态等于40106的9脚、11脚、13脚的状态相与。当40106的9脚、11脚、13脚中的任意一个有数据信号时,由于在异步串行通讯中,无数据传输时的引脚状态为高,因此RXD上就能接收到有数据信号的那个引脚上的数据状态。40106的2脚、4脚、6脚的状态等于TXD的状态,所以可以利用40106的2脚、4脚、6脚做为子串口的TXD。

      这种设计方案适用于主机同时向多个串行设备发送数据,而从设备不同时向主机发送数据的情况。再增加几个信号线,就可以区分出向哪一个从设备发送数据以及接收到的数据是来自哪一个从设备。在本文的系统中,主机是通信的发起者,接收到的数据来自哪个从设备是可以预知的,因此,只需再增加3个控制从设备使能的信号线即可。

    几种方法的比较
      在需要扩展系统的串行口时,使用多串行口单片机的方法是最容易想到的。由于串口集成在单片机内部,因此设备体积较小,抗干扰能力较高,但多串口单片机通常价格较高,而且,如果是开发人员所不熟悉的型号,还需要开发人员重新学习并购买与之配套的开发工具,这延长了产品的开发周期,也增加了产品的开发成本。

      软件模拟法占用的系统资源少、成本低、易于实现。已经被越来越多的人所采用。特别是基于PDK80CXX系列模拟的串口应用,以其适中的价格,超强的抗干扰性和超宽的工作温度,肯定会被更多的工业数据采集者所采用。


      并行口扩展串口方法的功能比较强大,能提供MODEM控制信号、通讯速度高,但控制复杂,占用MCU的端口资源较多,同时价格也较高。

      利用串行口扩展串行口,控制简单,能最大限度地减少控制线,不需要占用太多的主机系统资源,而且通用性强,性能稳定,可保证数据的正确性。GM812x的不足之处在于:不满足超低功耗应用要求;多通道模式下,所有子串口工作波特率只能设置成统一值,不适用于各从机工作波特率不一致、又要求同时工作的系统。SP2338虽然能满足低功耗的要求,但其子串口波特率也需要设置为统一值,并且不能对数据帧格式编程,最高波特率也只有9600bps。

      本文提出的方法中,各个子串口的串行特性和母串口相同,使用简单,占用系统资源少,易于控制(最少2个控制信号扩展3个串口),稳定性好。其功耗取决于4001和40106,它们的功耗都在mA级。其最高波特率取决于4001和40106的响应速度,4001和40106的最大响应延迟是250ns,所以理论上最高波特率可达4Mbps。此方法已经成功地应用于三表远传系统。该方法的缺点是,它不能用于从机工作波特率不一致、又要求同时工作的系统。

    转载于:https://www.cnblogs.com/tureno/articles/6298534.html

    展开全文
  • 嵌入式系统中串口扩展的需求:  而在嵌入式领域,由于UART具有操作简单,工作可靠,抗干扰强,传输距离远(组成485网络可以传输1200米以上),设计人员普遍认为UART是从CPU或微控制向系统的其他部分传输数据的...
  • 基于STM32的ch438串口扩展芯片使用

    万次阅读 热门讨论 2019-06-22 18:52:25
    CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的场合比较有用。这个串口芯片事实上并没有占用MCU的串口它实际上是使用了8个IO口做数据的传输。下面我就简单介绍一下怎么使用STM32驱动这个串口...

    CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的场合比较有用。这个串口芯片事实上并没有占用MCU的串口它实际上是使用了8个IO口做数据的传输。下面我就简单介绍一下怎么使用STM32驱动这个串口扩展芯片。并演示一个用CH438发送一段MODBUS码给电脑,电脑发给STM32的数据数据也回显示到电脑上.

    CH438我用的是44管脚的LQFP44封装。

    54。还有

    实际的电路是这样的:

     

    需要注意的几点就是:RXT代表的是复位应该接上拉电阻到电源,我用的是STM32的复位电路共用。这里不能悬空。

    晶振使用的是22.1184MHz晶振频率很高注意起振电容的选择。我采用的是20pf。

    D0~D7与STM32 的PC0~7连接,这八位是数据传输位,其他的几位都是控制位。本次接收数据使用到了本芯片和STM32的中断,INT叫对应的就是中断线。注意这个管脚不能连接到PC口上因为PC口已经当做数据口用了,如果连接到PC口高八位上,在芯片读写数据的时候出异常。

    下面这些是芯片内部的寄存器:主要就是配置他们。

    #ifndef _CH438_H
    #define _CH438_H
    #include "sys.h"
    #include "delay.h"
    #define REG_RBR_ADDR        0x00      /* 串口0接收缓冲寄存器地址 */
    #define REG_THR_ADDR        0x00      /* 串口0发送保持寄存器地址 */
    #define REG_IER_ADDR        0x01      /* 串口0中断使能寄存器地址 */
    #define REG_IIR_ADDR        0x02      /* 串口0中断识别寄存器地址 */
    #define REG_FCR_ADDR        0x02      /* 串口0FIFO控制寄存器地址 */
    #define REG_LCR_ADDR        0x03      /* 串口0线路控制寄存器地址 */
    #define REG_MCR_ADDR        0x04      /* 串口0MODEM控制寄存器地址 */
    #define REG_LSR_ADDR        0x05      /* 串口0线路状态寄存器地址 */
    #define REG_MSR_ADDR        0x06      /* 串口0MODEM状态寄存器地址 */
    #define REG_SCR_ADDR        0x07      /* 串口0用户可定义寄存器地址 */
    #define REG_DLL_ADDR        0x00      /* 波特率除数锁存器低8位字节地址 */
    #define REG_DLM_ADDR        0x01      /* 波特率除数锁存器高8位字节地址 */
    
    /* CH438内部串口0~7 专用状态寄存器 */
    
    #define REG_SSR_ADDR        0x4F       /* 专用状态寄存器地址 */
    
    
    /* IER寄存器的位 */
    
    #define BIT_IER_RESET       0x80      /* 该位置1则软复位该串口 */
    #define BIT_IER_LOWPOWER    0x40      /* 该位为1则关闭该串口的内部基准时钟 */
    #define BIT_IER_SLP         0x20      /* 串口0是SLP,为1则关闭时钟震荡器 */
    #define BIT_IER1_CK2X       0x20      /* 串口1是CK2X,为1则强制将外部时钟信号2倍频后作为内部基准时钟 */
    #define BIT_IER_IEMODEM     0x08      /* 该位为1允许MODEM输入状态变化中断 */
    #define BIT_IER_IELINES     0x04      /* 该位为1允许接收线路状态中断 */
    #define BIT_IER_IETHRE      0x02      /* 该位为1允许发送保持寄存器空中断 */
    #define BIT_IER_IERECV      0x01      /* 该位为1允许接收到数据中断 */
    
    /* IIR寄存器的位 */
    
    #define BIT_IIR_FIFOENS1    0x80
    #define BIT_IIR_FIFOENS0    0x40      /* 该2位为1表示起用FIFO */
    
    /* 中断类型:0001没有中断,0110接收线路状态中断,0100接收数据可用中断,1100接收数据超时中断,0010THR寄存器空中断,0000MODEM输入变化中断 */
    #define BIT_IIR_IID3        0x08
    #define BIT_IIR_IID2        0x04	//接受数据可用
    #define BIT_IIR_IID1        0x02	//THR寄存器空中断
    #define BIT_IIR_NOINT       0x01
    
    /* FCR寄存器的位 */
    
    /* 触发点: 00对应1个字节,01对应16个字节,10对应64个字节,11对应112个字节 */
    #define BIT_FCR_RECVTG1     0x80      /* 设置FIFO的中断和自动硬件流控制的触发点 */
    #define BIT_FCR_RECVTG0     0x40      /* 设置FIFO的中断和自动硬件流控制的触发点 */
    
    #define BIT_FCR_TFIFORST    0x04      /* 该位置1则清空发送FIFO中的数据 */
    #define BIT_FCR_RFIFORST    0x02      /* 该位置1则清空接收FIFO中的数据 */
    #define BIT_FCR_FIFOEN      0x01      /* 该位置1则起用FIFO,为0则禁用FIFO */
    
    /* LCR寄存器的位 */
    
    #define BIT_LCR_DLAB        0x80      /* 为1才能存取DLL,DLM,为0才能存取RBR/THR/IER */
    #define BIT_LCR_BREAKEN     0x40      /* 为1则强制产生BREAK线路间隔*/
    
    /* 设置校验格式:当PAREN为1时,00奇校验,01偶校验,10标志位(MARK,置1),11空白位(SPACE,清0) */
    #define BIT_LCR_PARMODE1    0x20      /* 设置奇偶校验位格式 */
    #define BIT_LCR_PARMODE0    0x10      /* 设置奇偶校验位格式 */
    
    #define BIT_LCR_PAREN       0x08      /* 为1则允许发送时产生和接收校验奇偶校验位 */
    #define BIT_LCR_STOPBIT     0x04      /* 为1则两个停止位,为0一个停止位 */
    
    /* 设置字长度:00则5个数据位,01则6个数据位,10则7个数据位,11则8个数据位 */
    #define BIT_LCR_WORDSZ1     0x02      /* 设置字长长度 */
    #define BIT_LCR_WORDSZ0     0x01
    
    /* MCR寄存器的位 */
    
    #define BIT_MCR_AFE         0x20      /* 为1允许CTS和RTS硬件自动流控制 */
    #define BIT_MCR_LOOP        0x10      /* 为1使能内部回路的测试模式 */
    #define BIT_MCR_OUT2        0x08      /* 为1允许该串口的中断请求输出 */
    #define BIT_MCR_OUT1        0x04      /* 为用户定义的MODEM控制位 */
    #define BIT_MCR_RTS         0x02      /* 该位为1则RTS引脚输出有效 */
    #define BIT_MCR_DTR         0x01      /* 该位为1则DTR引脚输出有效 */
    
    /* LSR寄存器的位 */
    
    #define BIT_LSR_RFIFOERR    0x80      /* 为1表示在接收FIFO中存在至少一个错误 */
    #define BIT_LSR_TEMT        0x40      /* 为1表示THR和TSR全空 */
    #define BIT_LSR_THRE        0x20      /* 为1表示THR空*/
    #define BIT_LSR_BREAKINT    0x10      /* 该位为1表示检测到BREAK线路间隔 */
    #define BIT_LSR_FRAMEERR    0x08      /* 该位为1表示读取数据帧错误 */
    #define BIT_LSR_PARERR      0x04      /* 该位为1表示奇偶校验错误 */
    #define BIT_LSR_OVERR       0x02      /* 为1表示接收FIFO缓冲区溢出 */
    #define BIT_LSR_DATARDY     0x01      /* 该位为1表示接收FIFO中有接收到的数据 */
    
    /* MSR寄存器的位 */
    
    #define BIT_MSR_DCD         0x80      /* 该位为1表示DCD引脚有效 */
    #define BIT_MSR_RI          0x40      /* 该位为1表示RI引脚有效 */
    #define BIT_MSR_DSR         0x20      /* 该位为1表示DSR引脚有效 */
    #define BIT_MSR_CTS         0x10      /* 该位为1表示CTS引脚有效 */
    #define BIT_MSR_DDCD        0x08      /* 该位为1表示DCD引脚输入状态发生变化过 */
    #define BIT_MSR_TERI        0x04      /* 该位为1表示RI引脚输入状态发生变化过 */
    #define BIT_MSR_DDSR        0x02      /* 该位为1表示DSR引脚输入状态发生变化过 */
    #define BIT_MSR_DCTS        0x01      /* 该位为1表示CTS引脚输入状态发生变化过 */
    
    /* 中断状态码 */
    
    #define INT_NOINT           0x01      /* 没有中断 */
    #define INT_THR_EMPTY       0x02      /* THR空中断 */
    #define INT_RCV_OVERTIME    0x0C      /* 接收超时中断 */
    #define INT_RCV_SUCCESS     0x04      /* 接收数据可用中断 */
    #define INT_RCV_LINES       0x06      /* 接收线路状态中断 */
    #define INT_MODEM_CHANGE    0x00      /* MODEM输入变化中断 */
    
    #define CH438_IIR_FIFOS_ENABLED 0xC0  /* 起用FIFO */
    
    
    #define WR   PDout(3)
    #define ALE  PDout(7)
    #define RD   PDout(4)
    #define CS   PDout(5)
    #define AMOD PDout(6)
    #define INT  PDout(1)
    void SetOutPut(void);
    void SetInPut(void);
    void CH438_Init(void);
    void CH438WriteReg(u8 add,u8 data);
    u8 CH438ReadReg(u8 add);
    unsigned char CH438_CheckIIR(unsigned char num);
    void CH438_CloseSeril(unsigned char num);
    void CH438_CloseALLSeril(void);
    void CH438_ResetSeril(unsigned char num);
    void CH438_SetBandrate(unsigned char num, unsigned long value);
    void CH438_UARTInit(unsigned char num);
    void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len);
    unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff);
    void CH438_TranConfig(unsigned char num);
    void CH438_INTConfig(unsigned char num);
    void CH438_AutoHFCtrl(unsigned char num);
    void CH438_RegTEST(unsigned char num);
    void CH438_Uart_Init(unsigned char num,unsigned long value);
    #endif
    

    上面就是CH438.h头文件,以下就是main函数,本程序只打开了串口2

    
    int  main()
    {
    	u8 ssr =0 ;
            u8 AddCom[8] =	  {01,05,01,17,255,00,221,195};   	//增压
    
    	delay_init();	    	 
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2	  	
    	uart_init(9600);
    	LCD_Init();
    	CH438_Init();  
    	
    	CH438_ResetSeril(2);  //软件复位串口2
    	CH438_Uart_Init(2,9600); //串口2打开 波特率9600
    	delay_ms(100);
    	
    	while(1)
    	{
    		CH438_SendDatas(2,AddCom,8);
    		CH438_SendDatas(2,(u8*)"\r\n",2);
    		delay_ms(1000);	
    	}
    }

    下面是主要的函数

    #include "ch438.h"
    #include "delay.h"
    #include "usart.h"
    #include "lcd.h"
    #define Fpclk    	  1843200         /* 定义内部时钟频率,默认外部晶振的12分频    */
    #define MaxRecvLen    50         	  /* 接收缓冲区大小    */
    
    const unsigned char offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,};		/* 串口号的偏移地址 */
    const unsigned char Interruptnum[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};	/* SSR寄存器中断号对应值 */
    
    unsigned char Revbuff[MaxRecvLen];		/* 接收缓存区 */
    unsigned char RevLen;					/* 接收计数 */
    
    
    
    
    void SetOutPut()  //IO输出模式
    {
    	GPIOC->CRL &=0;
    	GPIOC->CRL = 0X33333333;
    
    }
    void SetInPut()//IO输入模式
    {
    	GPIOC->CRL &=0;
    	GPIOC->CRL = 0X88888888;
    }
    void CH438_Init() //IO口中断等初始化
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	EXTI_InitTypeDef EXTI_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin  = 0X00FF;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC,&GPIO_InitStructure);
    	
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    	GPIO_Init(GPIOD,&GPIO_InitStructure);
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;
    	GPIO_Init(GPIOD,&GPIO_InitStructure);
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource1);
    	EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);
    	
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	EXTI_ClearITPendingBit(EXTI_Line1);
    	AMOD = 1;
    
    }
    
    void CH438WriteReg(u8 add,u8 data)  //写一个字节到寄存器
    {
    	u16  value ;
    	CS = 1;
    	WR = 1;
    	RD = 1;
    	SetOutPut();
    	GPIOC->ODR = (GPIOC->ODR&0XFF00)|add; //低八位十数据位确保高八位数据不变  写寄存器地址 
    	CS = 0;
    	ALE =1;
    	delay_us(1);
    	ALE = 0;
    	
    	GPIOC->ODR = (GPIOC->ODR&0XFF00)|data; //写数据
    	WR =0 ;
    	delay_us(1);
    	WR =1;
    	CS =1;
    }
    
    
    u8 CH438ReadReg(u8 add) //读取一个字节
    {
    	u8 value;
    	u8 value1;
    	CS = 1;
    	WR =1;
    	RD =1;
    	SetOutPut();   //
    	CS = 0;
    	ALE =1;
    	GPIOC->ODR = (GPIOC->ODR&0XFF00)|add;
    	ALE = 0;
    	SetInPut();
    	RD = 0;
    	value = GPIO_ReadInputData(GPIOC);
    	
    
    	RD =1;
    	CS =1;
    	
    	return value;
    }
    
    unsigned char CH438_CheckIIR(unsigned char num)
    {
    	unsigned char value;
    	
    	value = CH438ReadReg( offsetadd[num] | REG_IIR_ADDR );
    	return value;
    }
    void CH438_CloseSeril(unsigned char num) //关闭某位串口
    {
    	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_LOWPOWER);
    }
    
    void CH438_CloseALLSeril(void) //关闭所有串口
    {
    	CH438WriteReg(offsetadd[0]|REG_IER_ADDR, BIT_IER_LOWPOWER|BIT_IER_SLP);
    }
    void CH438_ResetSeril(unsigned char num) //复位串口
    {
    	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_RESET);
    }
    void CH438_SetBandrate(unsigned char num, unsigned long value)//设置波特率 未使用此函数
    {
    	uint8_t dlab=0;
    	uint16_t bandspeed;
    	
    	
    	bandspeed = Fpclk/16/value;
            CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_DLAB );  
    	CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed);
    	CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8));
    	
    
    	printf("bandrate: %d\n", bandspeed);
    	printf("DLM: %d\n", CH438ReadReg(offsetadd[num]|REG_DLM_ADDR));
    	printf("DLL: %d\n", CH438ReadReg(offsetadd[num]|REG_DLL_ADDR));
    
    }
    void CH438_UARTInit(unsigned char num)//初始化  未使用到
    {
    	CH438_SetBandrate(num, 9600);	/* CH438串口1波特率设置 */
    	CH438_TranConfig(num); 			/* CH438串口1数据格式配置及FIFO大小 */	
    }
    //发送数据
    
    void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len)
    {
    	
    	do
    	{
    		while((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_THRE)==0);    //LSR->THRE==1  保持寄存器空
    		
    			CH438WriteReg(offsetadd[num]|REG_THR_ADDR,*sendbuff++);	
    	}while(--len);
    	
    }
    //接收数据
    
    unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff)
    {
    	uint8_t len=0;
    	uint8_t *p_rev;
    	
    	p_rev = revbuff;
    
    	while( ( CH438ReadReg( offsetadd[num]|REG_LSR_ADDR ) & BIT_LSR_DATARDY ) == 0 );    /*等待数据准备好 */
    	while((CH438ReadReg(offsetadd[num]|REG_LSR_ADDR)&BIT_LSR_DATARDY))	//LSR->DATARDY==1
    	{
    		*p_rev = CH438ReadReg(offsetadd[num]|REG_RBR_ADDR);
    		p_rev++;
    		len++;
    	}
    	return len;
    }
    void CH438_TranConfig(unsigned char num)
    {	
    	/* 发送数据格式:8位数据,无校验,1个停止位  */
    	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0);
    	/* 设置FIFO模式,触发点为112字节 */
    	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN);	
    	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST);
    }
    
    void CH438_INTConfig(unsigned char num)
    {	
    	/* 注意: CH438打开BIT_IER_IETHRE中断(0->1),会产生一个发生空中断 */	
    	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV );
    	CH438_CheckIIR(num);
    	CH438WriteReg(offsetadd[num]|REG_MCR_ADDR, BIT_MCR_OUT2    | BIT_MCR_RTS     | BIT_MCR_DTR);//可以产生一个实际的中断	
    }
    
    void CH438_AutoHFCtrl(unsigned char num)
    {
        CH438WriteReg( offsetadd[num]|REG_MCR_ADDR, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS );/* 设置MCR寄存器的AFE和RTS为1 */
    }
    //中断处理函数
    
    void EXTI1_IRQHandler()
    {
    	u8 gInterruptStatus;
    	u8 InterruptStatus;
    	u8 i;
    	static u8 j ;
    	if(EXTI_GetITStatus(EXTI_Line1)!= RESET)
    	{
    			gInterruptStatus = CH438ReadReg( REG_SSR_ADDR );
    			
    			if(!gInterruptStatus)
    			{ 
    				EXTI_ClearITPendingBit(EXTI_Line1);
    				return ;
    			}
    			
    			
    				for(i=0; i<8; i++)
    			{
    				if( gInterruptStatus & Interruptnum[i] )    /* 检测哪个串口发生中断 */
    				{
    					InterruptStatus = CH438ReadReg( offsetadd[i] | REG_IIR_ADDR ) & 0x0f;    /* 读串口的中断状态 */	
    					
    					switch( InterruptStatus )
    					{
    						case INT_NOINT:			/* 没有中断 */					
    							break;
    						case INT_THR_EMPTY:		/* THR空中断 */						
    							break;
    						case INT_RCV_OVERTIME:	/* 接收超时中断 */
    							RevLen = CH438_RecvDatas(i, Revbuff);					
    							CH438_SendDatas(i, Revbuff, RevLen);
    							break;
    						case INT_RCV_SUCCESS:	/* 接收数据可用中断 */
    							RevLen = CH438_RecvDatas(i, Revbuff);
    							CH438_SendDatas(i, Revbuff, RevLen);
    							break;
    						case INT_RCV_LINES:		/* 接收线路状态中断 */
    							CH438ReadReg( offsetadd[i] | REG_LSR_ADDR );
    							break;
    						case INT_MODEM_CHANGE:	/* MODEM输入变化中断 */
    							CH438ReadReg( offsetadd[i] | REG_MSR_ADDR );
    							break;
    						default:
    							break;
    
    					}
    				}
    			}
    	
    		EXTI_ClearITPendingBit(EXTI_Line1);
    	}
    }
    void CH438_RegTEST(unsigned char num)//测试使用的函数
    {
    
    	printf("current test serilnum: %d \r\n",(unsigned short)offsetadd[num]);
    	printf("IER: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IER_ADDR));//?IER
    	printf("IIR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_IIR_ADDR));//?IIR
    	printf("LCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LCR_ADDR));//?LCR
    	printf("MCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MCR_ADDR));//?MCR
    	printf("LSR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_LSR_ADDR));//?LSR
    	printf("MSR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_MSR_ADDR));//?MSR
    	//CH438WriteReg(offsetadd[num] | REG_SCR_ADDR, 0x78);
    	printf("SCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_SCR_ADDR));//?SCR
    	printf("FCR: %02x\r\n",(unsigned short)CH438ReadReg(offsetadd[num] | REG_FCR_ADDR));//?SCR
    
    }
    //串口初始化函数 输入参数 串口号和波特率
    void CH438_Uart_Init(unsigned char num,unsigned long value)
    {
    
    	uint8_t dlab=0;
    	uint16_t bandspeed;
    	dlab = CH438ReadReg(offsetadd[num]|REG_IER_ADDR);
    	dlab &= 0xDF;
    	CH438WriteReg(offsetadd[num]|REG_IER_ADDR, dlab);
    	
    	dlab = CH438ReadReg(offsetadd[num]|REG_LCR_ADDR);
    	dlab |= 0x80;		//置LCR寄存器DLAB位为1
    	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab);
    	
    	bandspeed = Fpclk/16/value;
    	CH438WriteReg(offsetadd[num]|REG_DLL_ADDR, (uint8_t)bandspeed);
    	CH438WriteReg(offsetadd[num]|REG_DLM_ADDR, (uint8_t)(bandspeed>>8));
    	dlab &= 0x7F;		//置IIR寄存器DLAB位为0
    	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR, dlab);
    	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN );
    	CH438WriteReg(offsetadd[num]|REG_LCR_ADDR,BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0 );
    	CH438WriteReg(offsetadd[num]|REG_IER_ADDR,BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV);
    	CH438WriteReg(offsetadd[num]|REG_MCR_ADDR,BIT_MCR_OUT2    | BIT_MCR_RTS     | BIT_MCR_DTR);
    	CH438WriteReg(offsetadd[num]|REG_FCR_ADDR,CH438ReadReg(offsetadd[num]|REG_FCR_ADDR)| BIT_FCR_TFIFORST|BIT_FCR_RFIFORST);
    
    
    }
    

     

    实验结果如下:

     

    垃圾CSDN

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 基于FPGA和SC16C2552实现微处理串口扩展.pdf
  • 基于一款 wk2168芯片的串口扩展

    千次阅读 2019-06-21 14:15:00
    串口扩展芯片应用介绍 一、 概述 随着嵌入式系统的功能越来越强大,搭载的外围设备也不断的增加,为了方便系统的集成,现在的外围设备通常都提供了标准的通信接口。在这些标准接口当中最常用的就是我们比较熟悉的...

    串口扩展芯片应用介绍
    一、 概述
    随着嵌入式系统的功能越来越强大,搭载的外围设备也不断的增加,为了方便系统的集成,现在的外围设备通常都提供了标准的通信接口。在这些标准接口当中最常用的就是我们比较熟悉的串口。串口作为一种工业标准接口有他的先天优势所在,通信速率较高,通信距离也比较远,集成也很方面。目前通常的嵌入式系统的cpu通常只有2个串口最多也就4个左右,如果外围需要搭载的串口设备超过4个,这个时候,我们就不得不增加进行串口扩展。日前我了解到的一个功能强大的串口扩展芯片WK2168,他是成都为开微电子的最新串口扩展芯片,他们的官方网站提供了驱动源代码、电路设计原理图、封装库等,开发十分方便,下面我们就简单介绍一下wk2168的特性。
    1、总体特性概述
    支持多种主机接口:可以选择 UART,SPI,IIC或8位并口
    低功耗设计,可以配置自动休眠,自动唤醒模式(uS 级唤醒)
    宽工作电压设计,工作电压为2.5V~5V
    精简的配置寄存器和控制字,操作简单可靠
    提供工业级和商业级产品
    高速CMOS工艺

    2、主接口特性
    2.1 UART主接口特性
    主接口为标准的三线UART串口(RX,TX,GND),无需其它地址信号、控制信号线
    波特率自适应技术
    可选择的奇校验,偶校验和无校验模式
    业界首创的不需地址线控制的串口扩展方式,通过芯片内置的协议处理器实现多串口扩展
    UART主接口可以通过引脚设置为红外模式
    2.2 SPI主接口特性
    最高速度5M bit/s
    仅支持SPI从模式
    SPI模式0
    2.3 IIC并口主接口特性
    兼容IIC总线接口
    最高速度400kbit/s
    仅支持IIC从模式

    2.4 8位并口主接口特性
    标准8位MCU总线接口
    命令和数据共用8位地址总线,通过A0(数据/控制)信号进行切换
    子通道选择通过命令字控制和指示,无需额外的通道指示信号线
    仅占用2个地址空间

    3、子串口特性说明
    子通道串口独立配置,高速、灵活:
    每个子串口为全双工,每个子串口可以通过软件开启/关闭
    波特率可以独立配置,波特率可以设置任意大小,子串口最高可以达到2M bps
    每个子串口字符格式包括数据长度、停止位数、奇偶校验模式可以独立设置
    完善的子串口状态查询功能
    FIFO功能:
    每个子串口具备独立的256级发送FIFO,发送FIFO触发点可按用户需求进行编程,设置任意大小的触点。
    每个子串口具备独立的256接收FIFO,接收FIFO触发点可按用户需求进行编程,设置任意大小的触点。
    软件FIFO使能和清空
    FIFO状态和计数器输出
    流量控制:
    支持RTS、CTS的硬件自动流量控制
    支持XON/XOFF的软件自动流量控制,XON/XOFF可编程字符自动发送/识别
    RS-485功能:
    RTS控制的自动RS-485收发控制。RTS信号可以实现默认电平设置。
    RS-485网络地址自动识别功能
    错误检测:
    支持奇偶校验错误、数据帧错误、break错误及溢出错误检测
    支持对接收FIFO每个字节的状态进行检测
    每个子串口可以独立软件复位
    内置符合SIR标准的IrDA红外收发编解码器,传输速度可达115.2K bit/s
    4、丰富的中断系统
    接收FIFO触点中断
    接收FIFO超时中断
    发送FIFO触点中断
    发送FIFO空中断
    CTS中断
    RTS中断
    XOFF中断
    数据错误中断

    5、应用方案
    5.1 wk21在车载综合信息平台上的应用
    功能:车载综合信息平台是现代汽车通讯与导航产品的发展走势,这种平台将整合汽车通信和导航功能,成为一个可提供各种动态路况交通信息、汽车行驶信息,交通娱乐服务的综合汽车信息系统,可播放DVD/CD/MP3、接收电视、倒车监控、车载电话等
    系统构成

    在这里插入图片描述

    车载导航产品嵌入式系统的硬件平台一般是以一颗通用的cpu为主,辅以图形加速芯片,存储芯片,外围接口芯片等,再接众多的外设模块构成,可选择的嵌入式操作系统有Wince,linux,VxWorks等,再加上导航引擎,电子地图和用户操作界面等组成。
    Wk2xxx主接口可以是uart\spi.嵌入式平台通过uart或者spi同wk2xxx相连,wk2xxx可以扩展4个子串口分别连接GPS模块,倒车雷达模块,蓝牙模块,显示器。

    5.2 wk2xxx在工业PDA设计中的应用
    功能:
    工业PDA不同于普通的PDA,需要大量整合外部设备。最新的工业PDA需要内置读卡器(RFID/RFIC读卡器)、打印机以及条码扫描仪等,新的走势还需要在工艺PDA中加入无线通信的功能,如WLAN、CDMA/GPRS、蓝牙等移动通信功能。诸多的外设都是标准的异步串口通信接口,PDA一般选用ARM芯片作为主控CPU,ARM芯片自带的2到3个串口是远远不能满足连接众多外设的需求,采用WK2XXX系列uart可以方便的实现串口的扩展。
    系统架构:
    在这里插入图片描述

    该方案中,选用ARM9作为主CPU:
    ARM9自带3个串口,串口钱用于初始程序的下载,以及PDA与PC等设备的通信接口。
    串口2设计成PDA的红外接口。串口3用于连接触摸屏的输入。那么选用spi接口的wk2xxx扩展4个串口。扩展出来的串口分别连接蓝牙模块,条码扫描/RFID读卡器,GSM/CDMA,串口打印头等

    展开全文
  • XR16L78x相对于传统4通道串口扩展芯片具有硬件、软件及性能等方面的优势。为了分析基于XR16L78x进行串口扩展方案的优势,绘出了分别基于XR16L784,ST16C554对CPU进行串口扩展的硬件接口图,给出了典型的中断处理程序...
  • 在某些项目中我们会遇到一些设备需要很多串口通信的情况,而单片机的串口数量有限,我们通过138译码设计一个8选一选择,很好的解决了这一问题。 优点:降低成本,降低电路复杂度,降低程序设计复杂度。 缺点:分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,783
精华内容 10,713
关键字:

串口扩展器有什么用