基于双TL16C554和嵌入式linux的串口扩展Word格式文档下载.docx
《基于双TL16C554和嵌入式linux的串口扩展Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于双TL16C554和嵌入式linux的串口扩展Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
另外,作为监控后台的主机所支持的通讯接口种类和数量有限,而现场设备数目众多,所以后台无法同时与现场所有设备直接相连[3];
另一方面,RS485串行总线接口采用二差分平衡方式传输数据,抗共模干扰能力较强,简单易用,可以满足工业恶劣环境的通讯要求。
目前我国水电站监控系统中现场设备广泛提供RS485通讯接口。
通讯管理机具有多个串行总线接口和网络接口,它可以把站内各种设备的数据按照协议分类以总线的方式采集汇总,然后整理以一个标准的格式上传给后台监控计算机,同时接收监控运行命令,解析后准确下传到对应设备。
市场上能满足通讯性能要求的多串口通讯管理机价格较贵,利用单TL16C554实现四通道串口的扩展成功应用方案比较多,但是当需要扩展8个以上的串口时候,按照以往的设计方案难度大大增加,往往会选择较高成本的其它实现方案。
本文介绍一种利用双TL16C554在嵌入式linux系统中实现8通道串口的设计方法。
1.简介
1)、TL16C554芯片介绍
TL16c554是TI公司生产的4通道异步通信集成芯片,它的每个通道都能独立的从外部设备或者MODEN接收数据,进行串行接口到并行接口的转换,同时它也能将处理器的并行数据转化为串行数据转发出去。
外部处理器在读写操作时可以随时查询每个通道的完整性,监视各种命令的执行及任何发生的错误。
主要有如下特点:
集成4个增强型TL16C550异步通讯组件及可控逻辑功能;
在FIFO模式下,每个异步通讯组件的发送器及接收器经16字节的FIFO缓冲,以减少系统处理器的中断次数;
保持寄存器与移位寄存器的存在使得系统处理器与串行数据之间不需要精确的同步;
针对高达1M波特率的工作,时钟频率可高达16MHz,可编程波特率发生器允许对所有输入基准时钟除以1到(216-1)之间的任何数据并且产生一个16倍的内部时钟;
可以对串行数据流增加或者从删除标准异步通讯位(开始位、停止位和奇偶检验位);
独立的发送、接收、线路状态和数据组中断控制;
完全可编程的串行接口特性;
三态输出为双向数据总线和控制总线提供TTL驱动特性;
其它检测和故障分析能力。
TL16C554一共具有12个内部寄存器。
通过这些寄存器的设置来实现通讯参数的设置、线路和MODEM状态的访问,中断的管理和数据的发送,接收。
说明如下表:
表2.1寄存器说明
内部
DLAB位
地址总线A2
地址总线A1
地址总线A0
读操作模式
写操作模式
接收器缓冲寄存器
发送器保持寄存器
1
中断使能寄存器
X
中断辨识寄存器
FIFO控制寄存器
线路控制寄存器
调制解调器控制寄存器
线路状态寄存器
调制解调器状态寄存器
暂存寄存器
LSB除数锁存
MSB除数锁存
2)、设备驱动介绍
Linux的外设可以分为3类:
字符设备、块设备和网络设备。
串口设备是一种终端字符设备,即TTY设备。
在系统中其体系架构如图2.1:
TTY体系分为:
TTY核心、TTY线路规划、TTY驱动三部分。
TTY核心从用户空间获取要发送给TTY设备的数据,然后把数据传递给TTY线路规划,它对数据进行处理后,负责把数据传递到TTY驱动程序,TTY驱动程序负责格式化数据,并通过硬件发送出去;
从硬件接收到的数据向上通过TTY驱动,进入TTY线路规程,再进入TTY核心,最后被用户获取。
Tty驱动与tty核心之间也可以直接传输数据[4]。
图2.1TTY设备体系结构和数据流
设备驱动编写工作主要为完成板级(Low_level)的数据结构和功能函数,以对接上层的函数接口和硬件的直接操作。
Linux2.6引用一套新的驱动管理和注册机制:
platform_device和platform_driver,设备资源用platform_device表示,驱动用platform_driver进行注册。
platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。
通过platform机制开发底层驱动的大致流程如下。
图2.2驱动开发流程
1.软硬件实现
1)、硬件设计
图3.1硬件设计原理图
控制器数据总线MD0~MD7连接TL16C554的8位数据总线。
六位地址总线(MA1~MA3)三位直接与芯片A0~A2连接,用来寻址芯片内部寄存器,MA4~MA6位经过译码器形成8为片选信号,可以用来片选8个独立的通道,WR、RD读写控制信号连接芯片的相应引脚,独立的复位信号C_RST1和C_RST2低电平的可以复位扩展芯片。
四通道的中断信号经过三个或门和触发器合并为一个公共的中断,U1扩展芯片某一个通道的FIFO收到的数据达到了设定值将产生一个高电平中断,当四个独立的通道中断退出时公共中断信号变位低电平,设置外部控制器的高电平产生中断。
2)、驱动设计
选择外部控制器为AT91RM9200为例,按照如下设置platform_device[5]:
1)、声明一个宏PORT,表示一个设备资源
#definePORT(_base,_irq)\
{\
.mapbase=_base,\//通道操作物理地址
.irq=_irq,\//中断号
.uartclk=3686400,\//芯片外部时钟
.iotype=UPIO_MEM,\//定义资源的类型
.regshift=1,\//控制器为8位数据模式,由于地址线连接偏移一位。
.flags=(UPF_BOOT_AUTOCONF|UPF_IOREMAP),\
}
2)、实现八个通道资源资源:
staticstructplat_serial8250_portexar_data[]={
PORT(AT91_CHIPSELECT_5+0x0,AT91RM9200_ID_IRQ0),
PORT(AT91_CHIPSELECT_5+0x10,AT91RM9200_ID_IRQ0),
PORT(AT91_CHIPSELECT_5+0x20,AT91RM9200_ID_IRQ0),
PORT(AT91_CHIPSELECT_5+0x30,AT91RM9200_ID_IRQ0),
PORT(AT91_CHIPSELECT_5+0x40,AT91RM9200_ID_IRQ1),
PORT(AT91_CHIPSELECT_5+0x50,AT91RM9200_ID_IRQ1),
PORT(AT91_CHIPSELECT_5+0x60,AT91RM9200_ID_IRQ1),
PORT(AT91_CHIPSELECT_5+0x70,AT91RM9200_ID_IRQ1),
{},
};
staticstructplatform_deviceexar_device={
.name="
serial8250"
//定义平台设备的名称
.id=PLAT8250_DEV_EXAR_ST16C554,//用于标志该设备的ID。
.dev={
.platform_data=&
exar_data,//定义平台设备的资源。
},
3)、另外模块函数exar_init()设置控制器SMC的bank5区接口属性:
主要有读写时钟周期,数据位数。
中断和复位引脚设置和1ms的低电平复位。
再利用platform_device_register(&
exar_device)注册。
最后利用module_init(exar_init)编译到内核驱动模块中。
选择8250标准串口驱动作为修改模板,模板适用于单TL16C554芯片中断独立的情况,双芯片共中断在数据收发需要做大量的修改才能实现高性能,按照如下设置platform_driver[5]:
1.、创建uart结构体,用于向tty层注册。
staticstructuart_driverserial8250_reg={
.owner=THIS_MODULE,
.driver_name="
tl16c554-serial"
.dev_name="
ttyB"
.major=9,//主设备号静态分配时注意不要与其它设备冲突
.minor=70,//次设备号
.nr=UART_NR,//串口数8
.cons=SERIAL8250_CONSOLE,
在serial8250_init()初始化函数中经过uart_register_driver(&
serial8250_reg)进行注册,serial8250_register_ports(&
serial8250_reg,&
serial8250_isa_devs->
dev)实现和设备资源关联,此关联为旧模式,主要实现了tty核心层和板级驱动层所有操作功能的关联,具体设备资源关联在注册platform_drive的probe中实现。
staticstructuart_opsserial8250_pops={
.tx_empty=serial8250_tx_empty,//发送为空响应函数
.set_mctrl=serial8250_set_mctrl,//设置寄存器值
.get_mctrl=serial8250_get_mctrl,//获取寄存器值
.stop_tx=serial8250_stop_tx,//停止发送数据
.start_tx=serial8250_s