引 言 IC总线(InterIC Bus)是一种通用的串行总线是用于IC器件之间连接的二线制总线他通过串行数据线(Serial Data LinesSDL)及串行时钟线(Serial ClockLineSCL)两线在连接到总线上的器件之间传送信息并根据地址识别每个器件一个或多个微控制器以及外围器件可以通过IC总线接口非常方便的连接在一起构成系统这种总线结构的连线和连接引脚少器件间总线简单结构紧凑因此其构成系统的成本较低并且在总线上增加器件不会影响系统的正常工作所有的IC器件共用一套总线因此其系统修改和可扩展性好即使有不同时钟速度的器件连接到总线上时间同步机制也能够很方便地确定总线时钟因此在嵌入式系统中得到了广泛的应用 IC总线原理 . IC工作原理 IC总线是由数据线SDA和时钟线SCL构成的串行总线可发送和接收数据每个连接到总线的器件都可以通过惟一的地址与主机通讯主机可以作为主机发送器或主机接收器他是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过沖突检测和仲裁防止数据被破坏串行的位双向数据传输位速率在标准模式下可达 kb/s快速模式下可达 kb/s高速模式下可达 Mb/s连接到相同总线的IC数量只受到总线的最大电容 pF限制 IC总线在传送数据过程中共有种特殊的电平变换情况他们分别是起始(start)停止(stop)和响应(aek) 当SCL为高电平时SDA由高电平向低电平跳变这个表示起始条件当SCL是高电平时SDA线由低电平向高电平跳变表示停止条件起始和停止条件一般由主机产生总线在起始条件后被认为处于忙的状态在停止条件的某段时间后总线被认为再次处于空闲状态 响应信号是指从机在接收到b数据后向主机发出特定的低电平脉沖表示已收到数据在响应的时钟脉沖期间从机必须将SDA线拉低使他在这个时钟脉沖的高电平期间保持稳定的低电平主机收到应答信号后根据实际情况做出是否继续传递信号的判断若未收到应答信号则判断为从机出现故障 操作时序 IC总线运用主/从双向通讯主机和从机都可以工作于接收和发送状态总线必须由主机(通常为微控制器)控制主机产生串行时钟(SCL)控制总线的传输方向并产生起始和停止条件SDA线上的数据状态仅在SCL为低电平的期间才能改变SCL为高电平的期间SDA状态的改变被用来表示起始和停止条件具体时序见图 嵌入式系统中的IC驱动的两种实现 系统自带IC寄存器的实现 下面以arm SCB为例给出基于寄存器方式的IC驱动实现SCB内含一个IC总线主控器可方便地与各种带有IC接口的器件相连IC总线控制器有个特殊功能寄存器一个控制状态寄存器(ICON)一个预分频寄存器(ICPS)和一个移位缓沖寄存器(ICBUF)通过配置这些寄存器可实现正确的IC数据传输时序下面分别给出读写实现的实例读操作 通过对控制状态寄存器(ICC()N)写入OxlO发送启动码初始化串行IC总线然后总线控制器发送位的从设备地址并通过移位缓沖寄存器发送读/写控制位接收器则在主控器的SCL脉沖期间通过将SDA线从高电平下拉到低电平作为应答信号 写数据的操作 先设置控制状态寄存器的BF位(x)然后写入数据到移位缓沖寄存器移位缓沖寄存器无论是被读还是写BF位均会自动清零若要进行连续的读/写操作必须设置控制状态寄存器的ACK位(x) 读数据的操作 在设置控制状态寄存器的BF位以后可以进行读数据的操作当读/写完最后一个字节时可对ACK位进行复位通知发送器/接收器读数据操作结束 在读/写操作完成以后可通过对ICCON写入x生成结束码 以GPIO端口模拟IC实现 此方法是直接用arm SC的GPIO(GeneralPurpose Input/Output)引脚模拟IC总线的时序来实现数据传输SCB提供了个可编程的通用I/O端口用户可将每个端口配置为输入模式输出模式或特殊功能模式由片内的特殊功能寄存器IOPMOD和IOPCON控制 控制I/O口的特殊功能寄存器一共有个IOPMODIPCON和IOPDATAI/O口模式寄存器(IOPMOD)用于配置P~P的输入输出状态I/O口控制寄存器IOPCON用于配置端口P~P的特殊功能当这些端口用作特殊功能(如外部中断请求外部中断请求应答外部DMA请求或应答定时器溢出)时其工作模式由PCON寄存器控制而不再由IOPMOD寄存器I/O口数据寄存器(IOPDATA)当配置为输入模式时读取I/O口数据寄存器IOPDATA的每一位对应输入状态当配置为输出模式时写每一位对应输出状态位[O]对应于个I/引脚P~P 下面用GPIO的pin[O][]脚进行IC模拟其中低位为SDA高位为SCL首先给出一些便于操作的宏定义 应用实例 为arm外挂PCF实现实时时钟控制PCF是PHILIPS公司生产的具有IC接口的低功耗CM()S实时时钟/日历芯片其最大总线速度为kb/s每次读写数据后其内嵌的字地址寄存器器会自动产生增量下面用模拟实现PCF的IC实时时钟芯片的操作有字节写/读两种状态程序中从地址的读地址为AH写地址为AH 首先使能IC总线然后对IC总线进行开始操作就绪之后依次写人器件地址(即xA)写入寄存器地址再写人所设寄存器值控制/状态寄存器为控制/状态寄存器为秒寄存器为分钟寄存器小时寄存器为日寄存器为星期寄存器为月/世纪寄存器为年寄存器为(即年月日点分秒)当程序运行一段时间(分钟)后依次读取寄存器得到时间为年月日点OO分秒 总 结 本文给出了两种IC驱动的实现方法前者直接利用主机端自带的IC总线控制器通过配置一系列特殊寄存器实现IC总线传输这种方式适用于一些本身包含IC总线控制器的芯片实现起来简单方便后者则适用于主机端没有IC控制器的情况此时主机端只要有GPIO端口就可利用其实现同样的功能在基于arm加μClinux的嵌入式视频监控产品中同时将这两种方法做了具体的运用其一的示例就是通过模拟的IC总线挂接PCF实时时钟芯片并取得很好的实时效果 |