驱动: i2c驱动

1. IIC协议:

<<um_s3c2440a_rev10.pdf>>  p481 Figure 20-3. IIC-Bus Interface Data Format
<<AT24C08_DataSheet.pdf>>  Figure 1-12 Bus Timing and Device operations

iic总线里的角色:
    主机(Master):初始化发送、产生时钟信号和终止发送的器件
    从机(Slave):被主机寻址的器件

I2C的原则是:
    在SCL=1(高电平)时,SDA千万别忽悠!!! 否则,SDA下跳则"判罚"为"起始信号S",SDA上跳则"判罚"为"停止信号P".
    在SCL=0(低电平)时,SDA随便忽悠!!!(可别忽悠过火到SCL跳高)
    一条总线只有一个主机, 其他都是从机.
    
一次iic交互的例子:
    写AT24C08:
    start信号  +  addr + data[N] + stop信号    
    {
        1.   master发送start信号:     [scl高+sda下降沿]
        
        2.1. master发送addr: 7位设备地址 + R/W; 发完立刻把电平拉高,等待slave的ack;
                [sda在scl低电平的时候准备数据, 在scl上升沿时发送数据] * 8次
                MSB---先发最高位数据sda.
        2.2. slave收到master的start信号后,就开始监测master的数据了. 收到addr完毕并且发现addr就是自己的时候,马上拉低sda以表明传输有效(这就是所谓ack).
        
        3.1 主机收到ack后接着发送数据data, 这里是写1个字节,那就和发送addr用同样的方法连续发送8个bit就是了.
        同样,发完立刻把电平拉高,等待slave的ack;
        3.2 slave收到8位data完毕,马上拉低sda以表明传输有效(ack).
        
        4.   master收到ack,马上发送stop信号以关闭通信.
        
        说明:
        iic协议允许一次连接中传输多个字节,具体最多允许多少个字节看器件(AT24C08允许8个字节连续传输), 但是必须以8bit为单位, 接收方要给一个ack才会继续后面的传输.
        明确start和stop是由master发起的.
        
    }

一次iic交互的例子:
    读AT24C08:
    start信号  +  addr + data1 + start信号 + addr + data2[N] + stop信号    
    {
        你没看错, 有两次start, 一次stop.
        两次的addr地址都是同一个slave的, 区别在于它们的第8bit, 第一次是W(因为要写地址),第二次是R(读数据)
        data1指定数据存储在AT24C08中的哪个地址.
        data2[]是要写入的数据.
    }

2. iic驱动
<<韦东山Linux视频第2期_从零写驱动\第32课第1.1节_3.4.2内核下的I2C驱动之框架介绍_P.WMV>>

时间: 2024-10-15 04:55:10

驱动: i2c驱动的相关文章

MSP430G2553 Launchpad 硬件I2C驱动

一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A和USCI_B,其中USCI_A支持UART/IrDA/LIN/SPI通讯,USCI_B支持I2C/SPI通讯.MSP430G2553带有一个USCI_A和一个USCI_B,硬件I2C对应的管脚为P1.6(UCB0SCL)和P1.7(UCB0SDA). 由于Launchpad上P1.6连接到了LED

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

I2C驱动框架之probe方式

基于Linux的I2C驱动,采用probe方式.按照如下这个框架可以写出任何支持I2C总线的器件的Linux驱动. I2C器件连接至cpu的特定的i2c的接口,也就是挂载在cpu的i2c适配器上,i2c器件要和cpu进行信息交换必须要通过cpu操作适配器来交互.cpu上有1个或多个适配器,每个适配器上可以挂载256个设备地址不一样的i2c器件,通过i2c驱动就可以让cpu和适配器上的多个不一样的i2c器件通信而不会产生冲突. 驱动包括两个文件,dev.c和drive.c,其中dev.c是构建I2

I2C驱动框架(四)

参考:I2C子系统之platform_driver初始化--I2C_adap_s3c_init() 在完成platform_device的添加之后,i2c子系统将进行platform_driver的注册过程.platform_driver的注册通过调用初始化函数i2c_adapter_s3c_init函数来完成. static struct platform_device_id s3c24xx_driver_ids[] = { { .name = "s3c2410-i2c", .dri

20150503 imx257下实现I2C驱动的四种方法

20150503 imx257下实现I2C驱动的四种方法 2015-05-3 Lover雪儿 时间过得好快,转眼间五一假期就即将结束了,假期期间,大家都潇洒的去玩了,徒留辛辛苦苦的程序员还是窝在宿舍乖乖的敲着代码... 好啦,开开玩笑,辛酸史每家都有一大本,还是要积极的面对生活!!! 今天我们的任务是简单的入门linux内核下i2c设备驱动分离的四种写法. 一.一个简单的i2c驱动 和以前的驱动程序不同,i2c驱动分为drv驱动和dev设备驱动两个文件,不懂的可以参考我以前写的<20150313

Linux I2C驱动编写要点

继续上一篇博文没讲完的内容“针对 RepStart 型i2c设备的驱动模型”,其中涉及的内容有:i2c_client 的注册.i2c_driver 的注册.驱动程序的编写. 一.i2c 设备的注册分析:在新版本内核的i2c驱动模型中,支持多种方式来注册 i2c 设备,在Documentation/i2c/instantiating-devices文件中有讲到,在内核中对应的抽象数据结构就是 struct i2c_client. (1)Declare the I2C devices by bus

I2C驱动详解

I2C讲解: 在JZ2440开发板上,I2C是由两条数据线构成的SCL,SDA:SCL作为时钟总线,SDA作为数据总线:两条线上可挂载I2C设备,如:AT24C08 两条线连接ARM9 I2C控制器,通过控制来控制I2C设备的识别设备地址.读.写操作:如图所示 从中所知:I2C线上可以挂载很多个I2C设备:挂载简单,只需要一根数据线和一根时钟线就可以挂载上去,通过地址来去别每个设备的区别: I2C操作: 对I2C操作主要思想为:1.找到设备  2.进行读写操作 主要原理为: 1.发送开始信号S

I2C驱动

Linux2.6.30/driver/i2c/ 1.algos: 协议算法相关的东西 2.busses: 各种平台的i2c总线驱动(i2c控制器驱动/i2c适配器驱动) 3.chips: 各种i2c设备驱动(e2prom/某种传感器/触摸屏) 4.i2c-core.c i2c-dev.c: i2c子系统的通用文件(i2c核心层,提供一些通用函数接口) 应用层app: open("设备文件") write read ====================================

Linux的i2c驱动详解

目录(?)[-] 简介 架构 设备注册 I2C关键数据结构和详细注册流程 关键数据结构 详细注册流程 使用I2C子系统资源函数操作I2C设备 Gpio模拟i2c总线的通用传输算法 总结 理清i2c中的个结构体关系 i2c驱动的编写建议 1 简介 I2C 总线仅仅使用 SCL . SDA 两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和 PCB 板布线空间的占用.因此, I2C 总线被非常广泛地应用在 EEPROM .实时钟.小型 LCD 等设备与 CPU 的接口中. Linux I2