导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[nidetech·][原创]i.MX27上实现串口扩展



No.66311
作者:nidetech·
邮件:sales@nidetech.com
ID:145987
登陆:1次
文章数:3篇
最后登陆IP:119.96.130.33
最后登陆:2011/7/9 21:14:39
注册:2011/7/9 20:40:50
财富:115
发帖时间:2011/7/9 21:04:37
发贴者IP:119.96.130.33
标题:nidetech·:[原创]i.MX27上实现串口扩展
摘要:No.66311[原创]i.MX27上实现串口扩展 摘要:介绍在i.MX27芯片上利用16C652芯片来扩展串口的方案,详细阐述i.MX27芯片与16C652芯片之间的接口设计、CPLD设计、驱动设计。嵌入式平台:成都莱得科技基于i.MX27的FlexG1平台。
关键词: i.MX27; 16C652; 串口扩展; ARM9嵌入式系统;工业控制。
 引 言
在工业控制中需要的大量的现场控制总线,如CAN,Profibus,MODBUS,RS485/RS422,RS232.同时在工业控制,仪器仪表,医疗器械等非消费类领域,嵌入式处理器占到绝大部分,而作为控制中枢的嵌入式处理器串口往往只有三、四个,为了实现对多个外设的控制,需要对串口进行扩展。ARM芯片是目前在嵌入式系统中应用得最多的一种处理器内核,可运行linux、WINCE、VxWORKS等操作系统,拥有包括LCD、串口、网络通讯、存储芯片等大量外围接口。这里介绍成都莱得科技有限公司大量使用的处理器:freescale i.MX27处理器,以及成都莱得科技研发的通用嵌入式工控平台FlexG1,平台详细介绍略,请参阅成都莱得科技有限公司FlexG1工控板.
注:本文章只介绍扩展2个串口的设计,需要扩展4个串口选用 16C654即可,如果需要增加更多的串口,增加16C654即可增加UART扩展个数,设计思路完全相同。
 硬件设计
图1 串口扩展硬件图
 
在图1中,电路图由4部分组成:i.MX27处理器、CPLD、16C652、DB9连接器。其中i.MX27处理器和DB9连接器没有在图中画出来。片选选用i.MX27的CS4,起始地址为:0xD400 0000
,地址信号A0,A1,A2决定了16C652不同的寄存器。
 CPLD设计
CPLD实现如下几个功能:电平转换:由于i.MX27的WEIM总线为1.8V,需要CPLD实现1.8V-3.0V的电平转换;UART片选、读写信号:16C652的两个串口的片选信号由CS4_B和GPIO_CS4产生。GPIO_CS4为0,以及CS4_B为0,UART_CSA片选有效;GPIO_CS4为1,以及CS4_B为0,UART_CSB片选有效;
详细CPLD代码如下:
library ieee;
use ieee.std_logic_1164.all;

entity UART is
    port(
         A:in std_logic_vector(0 to 2);
         UART_A:out std_logic_vector(0 to 2);
         D:inout std_logic_vector(0 to 7);
         UART_D:inout std_logic_vector(0 to 7);
         
         GPIO_CS4:in std_logic;
         CS4_B:in std_logic;
         OE_B:in std_logic;
         RW_B:in std_logic;
         
         UART_CSA_B:out std_logic;
         UART_CSB_B:out std_logic;
         UART_OE_B:out std_logic;
         UART_RW_B:out std_logic
         
);

end;

architecture control of UART is

begin

-- Chip Select Outputs

    UART_CSA_B   <= '0' when (CS4_B = '0' and GPIO_CS4 = '0') else '1';
    UART_CSB_B   <= '0' when (CS4_B = '0' and GPIO_CS4 = '1') else '1';
-- level shift  
    
   UART_A  <=A;
   
   UART_OE_B   <= '0' when (OE_B = '0' and (UART_CSA = '0' or UART_CSB = '0')) else '1';
   UART_RW_B   <= '0' when (RW_B = '0' and (UART_CSA = '0' or UART_CSB = '0')) else '1';

process(D,UART_D,UART_OE_B,UART_RW_B,UART_OE_B) 
  begin
    if (UART_OE_B = '0') and (UART_RW_B = '1') then
       D   <=  UART_D;
    elsif (UART_OE_B = '1') and (UART_RW_B = '0') then
       UART_D   <= D;
    
    else
          D  <="ZZZZZZZZ";
    end if;   
end process; 
   
end control;
 软件的设计
    sc16c652是一款集成了2路标准异步串行收发器的串口扩展芯片,也就是通常所说的8250兼容串口。它的操作方法和寄存器功能与8250完全兼容,因此我们可以用基于linux内经典的8250驱动来驱动sc16c652,只需要根据硬件的设计,稍微修改一下标准的8250驱动,下面我们就在8250驱动的基础上根据硬件的设计来实现sc16c652的驱动程序

    首先来看看硬件上是如何来实现双串口的收发流程的。根据cpld程序的逻辑,当驱动访问 0xD400_0000----0xD5FF_FFFF 这32M地址空间的时候,CS4_B引脚会自动变为低电平。然后可以通过控制GPIO_CS4来选择串口号,当GPIO_CS4为高电平的时候,CPLD的输出为低的时候UART_CSB_B为低,选中串口A,当GPIO_CS4为低电平的时候,CPLD输出UART_CSA_B为低,选择串口B,这样就实现了串口号的逻辑选择,然后数据接收采用中断方式,我们硬件设计如下
MX27_PIN_SSI1_FS:      gpio 输出 做串口芯片的复位引脚,下降沿复位100us
MX27_PIN_SSI1_TXDAT:  gpio 输入 禁止上拉 上升沿触发 串口1的接收中断引脚
MX27_PIN_SSI1_RXDAT:  gpio 输入 禁止上拉 上升沿触发 串口2的接收中断引脚
由以下两个引脚来决定选中那个串口号
MX27_PIN_SSI1_CLK :   gpio 输出 也就是GPIO_CS4 可以用来选择串口号 [0--->  串口1 1-->  串口2]
CS4_B: 输出,当我们0xD400_0000----0xD5FF_FFFF这段地址的时候,始终保持为低电平

硬件设计清楚后,然后,我们来设计软件部分,首先需要在板级初始化文件 arch/arm/mach-mx27/mx27mdk27v0.c中,做如下初始化
1.根据硬件设计来分配串口的资源数据

/*!
 * The serial port definition structure. The fields contain:
 * {UART, CLK, PORT, IRQ, FLAGS}
 */
static struct plat_serial8250_port serial_platform_data[] = {
 {
  .membase = (void __iomem *)(CS4_BASE_ADDR_VIRT), //驱动中必须用内核虚拟地址来访问寄存器
  .mapbase = (unsigned long)(CS4_BASE_ADDR), //寄存器实际的物理地址
  .irq = IOMUX_TO_IRQ(MX27_PIN_SSI1_TXDAT), //获得该GPIO引脚所对应的中断编号,mx27的每个GPIO口都可以配置为中断模式
  .uartclk = 14745600,   //根据实际外接的晶振来设置
  .regshift = 1, //根据硬件设计和WEIM口数据总线位数来决定
  .iotype = UPIO_MEM, //按字节方式读写寄存器
  .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
  /*.pm = serial_platform_pm, */
  },
  {
  .membase = (void __iomem *)(CS4_BASE_ADDR_VIRT + 0x10),
  .mapbase = (unsigned long)(CS4_BASE_ADDR + 0x10),
  .irq = IOMUX_TO_IRQ(MX27_PIN_SSI1_RXDAT),
  .uartclk = 14745600,
  .regshift = 1,
  .iotype = UPIO_MEM,
  .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
  /*.pm = serial_platform_pm, */
  },
 {},
};

/*!
 * REVISIT: document me
 */
static struct plat ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:78531毫秒 查询6次