Linux I2C设备驱动编写(三)-实例分析AM3359

TI-AM3359 I2C适配器实例分析

I2C Spec简述

特性:
  • 兼容飞利浦I2C 2.1版本规格
  • 支持标准模式(100K bits/s)和快速模式(400K bits/s)
  • 多路接收、发送模式
  • 支持7bit、10bit设备地址模式
  • 32字节FIFO缓冲区
  • 可编程时钟发生器
  • 双DMA通道,一条中断线
  • 三个I2C模块实例I2C0\I2C1\I2C2
  • 时钟信号能够达到最高48MHz,来自PRCM
不支持
  • SCCB协议
  • 高速模式(3.4MBPS)
管脚
管脚 类型 描述
I2Cx_SCL I/OD I2C 串行时钟
I2Cx_SDA I/OD I2C 串行数据
I2C重置
  • 通过系统重置PIRSTNA=0,所有寄存器都会被重置到上电状态
  • 软重置,置位I2C_SYSC寄存器的SRST位。
  • I2C_CON寄存器的I2C_EN位可以让I2C模块重置。当PIRSTNA=1,I2C_EN=0会让I2C模块功能部分重置,所有寄存器数据会被暂存(不会恢复上电状态)
数据有效性
  • SDA在SCL高电平期间必须保持稳定,而只有在SCL低电平期间数据线(SDA)才可以进行高低电平切换
开始位&停止位

当I2C模块被设置为主控制时会产生START和STOP:

  • START开始位是SCL高电平期间SDA HIGH->LOW

SCL   _____         _______
                  \____/
SDA   __
             \____________

  • STOP停止位是SCL高电平期间SDA LOW->HIGH

SCL    _____         _______
                   \____/
SDA         ___________
           __/

  • 在START信号后总线就会被认为是busy忙状态,而在STOP后其会被视为空闲状态
串行数据格式

8位数据格式,每个放在SDA线上的都是1个字节即8位长,总共有多少个字节要发送/接收是需要写在DCOUNT寄存器中的。数据是高位先传输,如果I2C模块处于接收模式中,那么一个应答位后跟着一个字节的数据。I2C模块支持两种数据格式:

  • 7bit/10bit地址格式
  • 带有多个开始位的7bit/10bit地址格式


FIFO控制

I2C模块有两个内部的32字节FIFO,FIFO的深度可以通过控制I2C_IRQSTATUS_RAW.FIFODEPTH寄存器修改。

如何编程I2C

1. 使能模块前先设置
  • 使分频器产生约12MHz的I2C模块时钟(设置I2C_PSC=x,x的值需要根据系统时钟频率进行计算)
  • 使I2C时钟产生100Kpbs(Standard Mode)或400Kbps(Fast Mode)(SCLL = x 及 SCLH = x,这些值也是需要根据系统时钟频率进行计算)
  • 如果是FS模式,则配置自己的地址(I2C_OA = x)
  • 重置I2C模块(I2C_CON:I2C_EN=1)
2. 初始化程序
  • 设置I2C工作模式寄存器(I2C_CON)
  • 若想用传输数据中断则使能中断掩码(I2C_IRQENABLE_SET)
  • 如果在FS模式中,使用DMA传输数据的话,使能DMA(I2C_BUF及I2C_DMA/RX/TX/ENABLE_SET)且配置DMA控制器
3. 设置从地址和数据计数器

在主动模式中,设置从地址(I2C_SA = x),设置传输需要的字节数(I2C_CNT = x)

4. 初始化一次传输

在FS模式中。查询一下I2C状态寄存器(I2C_

  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值