S5P6818内部集成了3个独立的I2C控制器
问题:mma8653芯片挂在了哪个I2C控制器上?
答:根据mma8653芯片连接的cpu管脚来推断 对应了CPU内部的I2C 2控制器
1 I2C总线定义
飞利浦开放的两线式串行同步总线
SCL: CLOCK 时钟线
SDA: DATA 数据线
2 I2C总线的特点
1)通信时只需要两条线 硬件互联成本低
2)I2C总线上可以存在多个主设备 多个从设备
3)总线上的通信的发起和终止都由主设备控制
4)每个从设备都有一个唯一的从设备地址(一般为7bit)
5) 支持总线冲突仲裁
I2C控制器通信的速率100Kb/s
空闲状态时 SCL SDA默认为高电平
通信开始时 首先是主设备发送一个start信号
start信号,当SCL为高电平是 SDA出现一个下降沿
从高bit开始发送数据 发送数据时“低送高取”
低送高取, 当SCL为低电平是 SDA根据要发送的是0还是1 进行跳变,跳变位低电平或者高电平
接收方收到8bit数据后,要给发送方回应答信号(ACK)
ACK, 在第九个周期 SCL为高电平时, SDA为低电平(一定是被接收方拉低)
如果还有下一个字节数据要发送 从高bit开始发送数据, 发送数据时 “低送高取”
接收方接收方收到8bit数据后,要给发送方回应答信号(ACK)
。。。
发送方无数据发送是,主设备需要产生一个stop信号
stop, 当SCL为高电平时 SDA出现一个上升沿
问题:软件如何控制GPIOD6 GPIOD7形成相应的I2C通信时序?
有两种方式
1)软件模拟的方式 (STM32)
软件直接操作GPIO管脚 形成时序
2) 软硬件结合的方式 (集成了I2C控制器的SOC)
软件控制I2C控制器
I2C控制器控制GPIO管脚 形成时序
电路管脚
MCU_SCL_2 ----》GPIOD6
MCU_SDA_2 ----> GPIOD7
P70 管脚配置
GPIOD6 选择可选功能1 (SCL)
GPIOD7 选择可选功能1 (SDA)
GPIODALTFN0 0XC001D020
[13:12] 01, 将GPIOD6管脚配置为可选功能1
[15:14] 01, 将GPIOD7管脚配置为可选功能1
时钟频率设置及中断设置
I2CCON2 0XC00A6000
[3:0] 1111,
TX CLOCK = I2C CLOCK/(15+1) //越慢越好
[4] 读操作
0/1 没有/有中断未决情况的出现
写操作
0, 该bit会被清0
1, 不允许
[5] 0/1 禁止/使能中断
[6] 0, I2C CLK = Fpclk/16
1, I2C CLK = Fpclk/256 越慢越好
[7] 0/1 禁止/使能主设备收到数据后自动给从设备回ACK信号
发送设置
I2CSTAT2 0XC00A6004
[0] 0/1 收到/未收到对方回的ACK信号
[4] 0/1 禁止/使能数据发送
[5] 读操作
0/1 总线空闲/忙状态
写操作
0/1 产生stop/start信号
[7:6] 10, 主设备接收模式
11,主设备发送模式
I2CDS2 0XC00A600C
[7:0] 收发数据
I2CLC2 0XC00A6010
[1:0] 01, SCL为低电平后 间隔5个PCLK周期SDA再跳变
[2] 0/1 禁止/使能滤波
P302 使能时钟信号
I2CCLKENB2 0XC00B0000
[3] 1, 使能给到I2C 2控制器的时钟信号
P294 复位
IPRESETREG0 0XC0012000
[22] 0, I2C 2控制器执行复位操作