广州致远电子有限公司文库资料©2017GuangzhouZHIYUANElectronicsStockCo.,Ltd.文章源自广州致远电子有限公司,转载或引用请注明出处1嵌入式-ARM工控机第1章SC16IS752芯片和电路原理1.1.1SC16IS752芯片介绍SC16IS752是I2C总线/SPI总线接口,双通道高性能的UART扩展芯片,串口数据传输速率高达5Mbit/s,每路串口有64Bytes的读写FIFO和一个可编程的波特率发生器,具备省电模式和睡眠模式,还提供了8个额外可编程的I/O脚,并且支持传输速率高达1.1152Mbit/s的IrDA,可实现自动硬件和软件流控,自动的RS-485读写切换和软件复位等功能。1.通用特性64字节FIFO(发送器和接收器)与工业标准16C450完全兼容并等效在16×时钟模式下波特率高达5Mbit/s使用RTS/CTS的自动硬件流控制带有可编程Xon/Xoff字符的自动软件流控制一个或两个Xon/Xoff字符自动的RS-485支持(自动的从地址检测)多达8个可编程的I/O脚经过RTS信号的RS-485驱动器方向控制RS-485驱动器方向控制翻转内置IrDA编码器和译码器接口支持的IrDA速率高达115.2kbit/s软件复位发送器和接收器可相互独立使能/禁能接收和发送FIFO电平可编程的特殊字符检测完全可编程的字符格式:5,6,7或8位字符偶、奇或无奇偶格式1,1.5或2个停止位Linebreak的产生和检测内部回送模式3.3V时的睡眠电流低于30μA工业和商业温度范围5V容限输入HVQFN32和TSSOP28封装广州致远电子有限公司文库资料©2017GuangzhouZHIYUANElectronicsStockCo.,Ltd.文章源自广州致远电子有限公司,转载或引用请注明出处2嵌入式-ARM工控机2.I2C总线特性SCL/SDA输入上的噪声滤波器400kbit/s(最大速率)遵循I2C总线高速仅为从机模式3.SPI特性最高速率为4Mbit/s仅为从机模式SPI模式01.1.2电路原理本章的驱动实现基于SC16IS752芯片,通过I2C实现两路串口扩展。与SC16IS752相关电路原理图如图1.1所示。图1.1SC16IS752原理图对应的主控制器为AM3352处理器,I2C和INT这3个信号没有在原理图中体现出来,I2C接到处理器的I2C2上,中断INT接到处理器的GPIO上。1.1.3驱动移植思路由于采用I2C接口,通过I2C实现UART扩展,在驱动方面也会涉及两方面内容:I2C和UART两个驱动体系。首先需要按照普通I2C器件驱动添加方式,将该芯片接入I2C子系统,成功后才能通过I2C总线操作芯片内部的寄存器。能通过I2C进行芯片寄存器操作后,遵照UART器件驱动编写规则,将该芯片驱动接入Serial子系统,最终实现I2C到UART的扩展。另外还涉及到中断,这些内容在前面的驱动中已经多次用到。本章虽然基于AM3352处理器,但很容易推广到其它平台,过程也非常简单,仅需对I2C和中断部分驱动进行简单移植即可。广州致远电子有限公司文库资料©2017GuangzhouZHIYUANElectronicsStockCo.,Ltd.文章源自广州致远电子有限公司,转载或引用请注明出处3嵌入式-ARM工控机1.2I2C接口驱动实现1.2.1定义i2c_device_id首先为SC16IS752芯片定义i2c_device_id,用于I2C驱动进行匹配。实现如程序清单1.1所示。程序清单1.1sc16is752_ids定义staticconststructi2c_device_idsc16is752_ids[]={{sc16is752,0},{},};芯片名称可以任意定义,在这里定义为“sc16is752”,保持与芯片名称一致,这是通常做法。1.2.2添加注册I2C设备这部分代码与平台相关,在不同平台上的实现可能会稍有不同。对于本章所采用的平台,AM3352,Linux内核版本为3.2.0。添加I2C设备注册建议在平台主板文件中实现。本章修改arch/arm/mach-omap2/board_m3352.c文件,在其中通过i2c_board_info添加一个新的I2C设备描述:staticstructi2c_board_infoam335x_i2c2_boardinfo[]={{I2C_BOARD_INFO(sc16is752,0x48),},/*设备名称和从机地址*/};说明,设备名要与定义的i2c_device_id中的某一个相匹配。编写i2c2_init函数,在其中通过omap_register_i2c_bus()完成设备注册。由于SC16IS752接在AM3352的I2C2上,根据BSP的I2C定义,对应的I2C总线序号为3;另外为了保证UART能实现较高波特率,在此设置I2C总线速率为400kbps。i2c2_init()函数实现代码如程序清单1.2所示。程序清单1.2i2c2_init函数实现staticvoidi2c2_init(intevm_id,intprofile){setup_pin_mux(i2c2_pin_mux);omap_register_i2c_bus(3,400,am335x_i2c2_boardinfo,ARRAY_SIZE(am335x_i2c2_boardinfo));return;}为了便于理解,这里给出omap_register_i2c_bus()函数原型,如下:int__initomap_register_i2c_bus(intbus_id,u32clkrate,structi2c_board_infoconst*info,unsignedlen);最后,将i2c2_init函数加入zy_m3352_dev_cfg初始化列表即可。广州致远电子有限公司文库资料©2017GuangzhouZHIYUANElectronicsStockCo.,Ltd.文章源自广州致远电子有限公司,转载或引用请注明出处4嵌入式-ARM工控机1.2.3I2C驱动实现1.定义I2C驱动为SC16IS752定义一个i2c_driversc16is752_drv,主要完成probe和id_table的初始化,实现代码如程序清单1.3所示。程序清单1.3sc16is752定义staticstructi2c_driversc16is752_drv={.driver={.name=SC16IS752_NAME,.owner=THIS_MODULE,},.probe=sc16is752_probe,/*probe函数*/.id_table=sc16is752_ids,/*制定自己的设备列表*/};probe的实现函数定义为sc16is752_probe(),该函数的实现在下文进行说明;id_table初始化为前面定义的sc16is752_ids。2.注册I2C驱动编写sc16is752_init()函数,先通过i2c_get_adapter()函数获取I2C总线,然后通过i2c_add_driver()函数完成驱动注册。实现代码如程序清单1.4所示。程序清单1.4sc16is752_init函数实现staticint__initsc16is752_init(void){i2c2uart_adater=i2c_get_adapter(3);returni2c_add_driver(&sc16is752_drv);}系统起来后通过sc16is752_init()函数完成sc16is752_drv的注册,当i2c_device_id中的名字与i2c_board_info中的名字相匹配时,将调用此驱动的probe函数,完成更多与UART子系统相关的初始化。