精华内容
下载资源
问答
  • 串口扩展芯片

    千次阅读 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欧姆;
    展开全文
  • SPI扩展4串口芯片

    2018-12-07 15:47:07
    通过SPI扩展串口,简单实用,适合在嵌入式平台中,芯片资源较少但又不想改设计方案时使用
  • 同类方案比较目前比较通用的串口扩展方案有两种,一是用硬件实现,使用多串口单片机或专用串口扩展芯片,可供选择的串口扩展芯片TI等公司开发的16C554系列串口扩展芯片,该系列芯片实现的功能是通过并行口扩展串行...
  • 同类方案比较目前比较通用的串口扩展方案有两种,一是用硬件实现,使用多串口单片机或专用串口扩展芯片,可供选择的串口扩展芯片TI等公司开发的16C554系列串口扩展芯片,该系列芯片实现的功能是通过并行口扩展串行...
  • 德州仪器(TI)宣布推出三款16位可配置I2C和SMBus I/O扩展器,包括PCA9555、PCA9535以及1PCA9539,可为大多数微处理器(MPU)提供通用I/O扩展,帮助设计人员节省微处理器上的GPIO(通用输入/输出)。此外,这三款I2C从...
  • 嵌入式多参数监护仪系统中一般包括多个独立的硬件采集模块,每个硬件采集模块分别完成对人体的心电、呼吸率、体温、血压和...一种通过硬件实现,使用多串口ARM/MCU或专用串口扩展芯片,可供选择的串口扩展芯片TI
  • 嵌入式多参数监护仪系统中一般包括多个独立的硬件采集模块,每个硬件采集模块分别完成对人体的心电、呼吸率、体温、血压和...一种通过硬件实现,使用多串口ARM/MCU或专用串口扩展芯片,可供选择的串口扩展芯片TI
  • 1.micro2440_Linux中如何把串口0改为普通串口使用 2.基于ARM处理器设备的多...4.修改UBOOT和LINUX调试串口TI达芬奇芯片--DM6467) 5.在S3C2410+armlinux开发板上如何使串口1不用于控制台输出? - China Linux Forum
  • 串口扩展方案总结

    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

    展开全文
  • DSP多串口开发的一种方法 TL16C554A是TI公司生产的异步通信芯片, 该芯片可在通信系统中的实时性要求较高时, 用来实现系统的...TMS320LF2407A 多串口扩展的硬件电路以及通过TMS320LF2407A 初始化TL16C554A 的软件编 程。
  • 摘要:介绍了TMS320C32 DSP实现异步...大量文献介绍的应用于电气传动控制的DSP使用的是TI公司的,TMS320系列DSP芯片,这其中又以TMX210C3X和TMS320F24X为主流应用产品。TMS320C32(以下简称为C32)是TMS320C3X系列产品
  • 基于LM2596-5芯片设计的M3控制板采用两层板设计,面积100mm*80mm,支持扩展子板辅助MCU,同时集成串口、CAN、网络,USB、SD卡存储,能够满足各种中低端控制项目的应用。 下面说一下该板卡的电源设计方案。该板卡采用...
  • 51 单片机串口的扩充方法

    千次阅读 2016-01-25 12:05:22
    当接口不够用的时候,大家就会想到,使用什么外接芯片来扩充。但是,各种教材、参考书、网络文章,介绍扩充并行口的花样不少,扩充串行口的方法,几乎无人问津。偶尔见到一个,也是使用 8250、8251 等“巨型”芯片来...

    基本的 51 单片机有四个并行口,其中还包含了一个串行口。


    当接口不够用的时候,大家就会想到,使用什么外接芯片来扩充。


    但是,各种教材、参考书、网络文章,介绍扩充并行口的花样不少,扩充串行口的方法,几乎无人问津。


    偶尔见到一个,也是使用 8250、8251 等“巨型”芯片来扩充的。

    使用这些芯片,就要占用单片机很多的更为紧缺的并行口,基本上就是得不偿失。更别说还要设置复杂的控制字了。


    做而论道使用简单的三态门,即可为单片机扩充串行口,仅仅占用单片机的一、二个引脚作为控制引线而已。


    这个方法,在以前的各种书籍、杂志、网文中,都没有见到过,可以说是做而论道的独创。


    呵呵,小小的自豪一下,请不要拍砖。


    实际上是很简单的,就像使用 74LS373、74LS244 扩充并行口一样,为串行口,配上合适三态门就行了。


    选用 74LS125(低电平开门)、74LS126(高电平开门) 都行。


    使用其它的具有三态输出的芯片也可以,如:74LS244、74LS373 等等。

    只是这些芯片的控制线,是成组的控制,不是单独的一个门、一个门的进行控制,就有些不够方便。


    下面就是做而论道设计的扩充两个串口通道的电路图:


    51 单片机串口的扩充方法 - 非著名博主 - 电子信息角落


    图片链接:http://xiangce.baidu.com/picture/detail/64e03b5b7608f83bacba4eb956749736c1c3430d


    为了控制简单,以及介绍全面一些,在图中使用了两种三态门。用同一种,也是可以的。


    两组三态门,均以 P3.4 作为控制信号。


    当 P3.4 输出高电平时,74LS126 开门,通道1导通,单片机即可对 74LS164 进行串行输出,驱动数码管;


    当 P3.4 输出低电平时,74LS125 开门,通道2导通,单片机即可与其它串口设备进行全双工的通信。


    如果需要,还可以在 125 的右边再接上 TTL-RS232 电平转换芯片(或 RS485 总线芯片),进行远距离通信。

    图中是接上了一个 PROTEUS 软件的虚拟终端,用来代表另一个串口通信设备。


    做而论道用汇编语言写了一小段程序,可以控制这个串口扩展电路进行工作。


    ;=================================================

        ORG   0000H

        SJMP  START

        ORG   0023H

        AJMP  S_INT

    START:

        MOV   TMOD, #20H

        MOV   TH1, #0FDH ;设置波特率9600@11.0592MHz

        MOV   TL1, #0FDH

        SETB  TR1


        MOV   IE, #90H   ;开串口中断


        CLR   P3.4       ;选通74LS125(通道2)

        MOV   SCON, #50H ;串口方式1, 可接收


        SJMP  $

    ;-----------------------------------

    S_INT:               ;串口中断程序

        JNB   RI, S_END

        CLR   RI


        MOV   A, SBUF    ;取出收到的数据

    ;---------------------

        SETB  P3.4       ;选通74LS126(通道1)

        MOV   SCON, #0   ;串口通信方式0


        MOV   B, #16

        DIV   AB

        XCH   A, B

        ADD   A, #(TAB - $ - 3)

        MOVC  A, @A + PC ;取七段码

        MOV   SBUF, A    ;串口输出

        JNB   TI, $      ;等待发送完毕

        CLR   TI

        

        MOV   A, B

        ADD   A, #(TAB - $ - 3)

        MOVC  A, @A + PC

        MOV   SBUF, A

        JNB   TI, $

        CLR   TI

    ;---------------------

        CLR   P3.4       ;选通74LS125(通道2)

        MOV   SCON, #50H ;串口方式1, 可接收


        MOV   SBUF, #'O'

        JNB   TI, $

        CLR   TI

        MOV   SBUF, #'K'

        JNB   TI, $

        CLR   TI

        MOV   SBUF, #13  ;<CR>

        JNB   TI, $

        CLR   TI

        MOV   SBUF, #10  ;<LF>

        JNB   TI, $

        CLR   TI

    ;---------------------

    S_END:

        RETI


    TAB:                 ;共阳段码表

        DB  0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H;0~7

        DB  080H, 090H, 088H, 083H, 0C6H, 0A1H, 086H, 08EH;8~F


    END

    ;=================================================


    程序执行后,屏幕截图如下:


    51 单片机串口的扩充方法 - 非著名博主 - 电子信息角落


    图片链接:http://xiangce.baidu.com/picture/detail/e59dd034244a30296b66430ce57b73137ef91a4d


    在程序控制下,51 单片机随时监听通道2,一旦虚拟终端发来了一个字节的串行数据,单片机都要向虚拟终端回送 'OK'<CR><LF>。


    这时,就是单片机和上位机之间的双工串行通信。


    然后,单片机转向串口通道1,以方式0 输出两组七段码,令外接的 74LS164 显示刚刚收到的数据的高、低四位。


    这时,就是简单的 SPI 通信方式。


    在图中可以看到,数码管显示的是 41,这是在虚拟终端窗口中键入'A'时的现象,41 即字符 A 的 ASCII 码。


    虚拟终端,它并不显示键入的内容,它仅仅显示单片机发出的信息,在图中可以看到显示出来的 OK、回车、换行。




    74LS125 和 74LS126 都是 14 引脚的集成芯片,和 8250、16550A 等 40 引脚的专用串口芯片相比,要小巧的多。


    每片(125 或 126)都含有四个独立工作的三态门。实际上,使用一片 125 或 126,也就可以实现上述的两个通道串口通信了。

    注意:如果使用了一片芯片,那么通道控制的电平信号是相同的,这就需要使用单片机的两个引脚来分别控制两个通道。


    多用几片三态门,为单片机多扩充几个串行口,也是可行的。



    做而论道设计的这种串口扩充方案,硬件电路和软件,都已经在实际电路中做过实验,可以正常通信。



    展开全文
  • 基于STM32的ch438串口扩展芯片使用 似是燕归来 2019-06-22 18:52:25 8796 收藏 22 分类专栏: STM32 文章标签: CH438STM32 串口扩展芯片 版权 CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的...

    基于STM32的ch438串口扩展芯片使用

    似是燕归来 2019-06-22 18:52:25  8796  收藏 22
    分类专栏: STM32 文章标签: CH438  STM32 串口扩展芯片
    版权
    CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的场合比较有用。这个串口芯片事实上并没有占用MCU的串口它实际上是使用了8个IO口做数据的传输。下面我就简单介绍一下怎么使用STM32驱动这个串口扩展芯片。并演示一个用CH438发送一段MODBUS码给电脑,电脑发给STM32的数据数据也回显示到电脑上.

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

    实际的电路是这样的:

    需要注意的几点就是: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博主「似是燕归来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/s2014201506/article/details/93335353

    展开全文
  • 用FPGA实现异步串口与同步串口的转换,李文亮,姚冬苹,TI公司的TMS320C64xx系列DSP芯片的McBSP同步串口不具备与UART异步串口直接通信的能力,为了解决这个问题,扩展DSP芯片的使用范围,本文介��
  • TI公司三大系列DSP内部结构之比较

    万次阅读 2019-01-11 10:18:28
     DSP有两种解释:一种是数字信号处理器(Digital SignalProcessor),也称数字信号芯片;另一种是数字信号处理技术(Digital Signal Processing)。我们所说的DSP所指的就是前者。  DSP是一种特别适合于进行数字信号...
  • Intel8251可编程串行扩展RS232串口

    千次阅读 2020-09-25 15:59:52
    有许多现成的芯片可以实现UART的功能:如常用的Intel8250/8251接口芯片就可以作为RS232、RS422串口的UART控制芯片。 FPGA/CPDL是20世纪90年代发展起来的大规模可编程逻辑器件,随着EDA技术和微电子技术的进步,FPGA...
  • TI-TMS320F28335学习详解(1)::DSP是什么

    千次阅读 2020-07-11 10:19:28
    随着应用的扩展,信号处理、算法复杂度都在不断提高,微处理器较低的处理速度和较低的片上资源集成度渐 渐无法满足各类应用的需求,因此,更快、更高效、集成度更高的信号处理器成了日渐迫切的需求。 也许有人会觉得 ...
  • 串口服务器 介绍RS232+RS485与有线以太网双向透明传输多功能双串口服务器串口服务器 简介 从2012年5月第一款E45系列产品-500/-E的推出,到2013年6月经典的-401开始热卖,E45系列毫无疑问是有人在高性能串口服务器...
  • 串口通信的原理串口通信(SerialCommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现...
  • C51 串口

    2021-07-27 16:51:19
    单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。 51单片机内部自带UART(),可实现单片机的串口通信。 串口硬件电路
  • TL138/1808/6748F-EVM是广州创龙基于SOM-TL138/1808/6748F核心板开发的一款开发板。...CON8由UART1通过MAX3232串口电平转换芯片得到的RS232串口,使用9针DB9接口,同时与RS485复用。
  • 我们后面会以串口通信和485通信的例子来说明其通信的过程,但是在此之前,我们还是好好的知道一下原理 计算机通信 是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 并行...
  • 单片机多串口数据转发模型

    千次阅读 2021-10-11 10:10:13
    单片机多串口数据转发模型51黑电子论坛地址:[http://www.51hei.com/bbs/dpj-213065-1.html]...最近在做一个西门子 Step 200 系列的PLC通讯口扩展项目时,遇到了这样的问题: 224XP ,这个CPU的外部通讯端口只用
  • TI AM335X处理器介绍

    千次阅读 2015-05-21 11:41:18
    AM335X是美国TI(德州仪器)公司基于 ARM Cortex-A8内核的AM335X微处理器,在图像、图形处理、外设方面进行了增强,并全面支持诸如 EtherCAT ...第二:TI 史上公开资料最全的一个芯片。第三:产品定位最清晰的一个,工
  • STC89C52_51单片机_串口配置_UART串口通信 代码及链接 IO口模拟UART串口通信 UART串口传送数据示意图 挖坑:波特率&TH0是怎么算的? #include<reg52.h> sbit PIN_RXD = P3^0; ...
  • 将JP3上的两个跳线帽跳到标有232一端时,单片机的串口与MAX232芯片相连,计算机可以通过RS232串口与单片机的串口进行通信。 在这个实验中,我们主要通过USB口模拟的串口与单片机的串口进行通信。 接下来我们介绍一些...
  • TI DSP型号简述

    2012-07-02 14:42:00
    TI 公司在1982年成功推出其第一代 DSP 芯片 TMS32010及其系列产品TMS32011、TMS320C10/C14/C15/C16/C17等,之后相继推出了第二代DSP芯片TMS32020、TMS320C25/C26/C28,第三代DSP芯片TMS320C30/C31/C32,第四代DSP...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,678
精华内容 671
关键字:

ti串口扩展芯片