fuzidage
专注嵌入式、linux驱动 、arm裸机研究

导航

 

1.I2c主控与从设备关系

 

对于写操作,主控作为transmitter,从设备作为receiver

对于读操作,主控作为receiver, 从设备作为transmitter

2.I2c控制器

2.1总框图

 

Pclk = 50Mhz, 经过prescaler分频,可以得到SCL。

IICSTAT:发出S(start)信号或者P(stop)信号。

Data Bus可以把数据写入IICDS寄存器,然后会自动产生SCL,并且会将8位数据从SDA同步给slave dev,

在数据发送出去后,在第9个SCL时钟,会受到slave dev的ack应答,可以通过查询IICSTAT来判断是否有ACK回应。

当slave dev回应ACK后,那么又可以继续发送数据,继续写入据到IICDS。

当主控想结束,设置IICSTAT发出P信号。

2.2 寄存器介绍

1.IICCON(用来配置i2c时钟)

 

Bit[7]: 对于发送模式,不需要配置ack信号,ack是接收者发送回来的应答。对于接受模式,设置成1,让它在第9个CLK发出ack讯号(拉低sda)。

Bit[6]:SCL时钟源,pclk分频即可

Bit[5]:中断使能,使用i2c时要去enable

Bit[4]:中断状态标识 表示中断有没有结束,当该bit读出来是1时,SCL被拉低表示busy,也就是i2c中断还在处理中。当i2c中断处理结束后,可以将该bit 清0,释放出SCL。

Bit[3:0]:i2c时钟分频系数配置,SCL时钟 = IICCLK/(IICCON[3:0]+1)

2.IICSTAT(配置模式,S,P信号,查询是否有ack)

 

bit[7:6]:模式选择

Bit[5]:当读的时候,0表示not busy,1表示busy

当写的时候,0表示写入STOP, 1表示写入START

Bit[4] : 数据输出使能,0:表示disable, 1表示enable

Bit[3]:仲裁flag

Bit[0]:表示i2c总线上的第9个时钟周期有没有ack,1表示有ack, 0表示无ack

3.IICADD(配置从机地址)

 

4.IICDS: (保存的是要发送或已经接收的数据)

 

3. 读写操作流程

The following steps must be executed before any IIC Tx/Rx operations.

1. Write own slave address on IICADD register, if needed.

2. Set IICCON register.

a) Enable interrupt

b) Define SCL period

3. Set IICSTAT to enable Serial Output

在操作tx,rx前,要先执行以下几步骤:

1.IICADD写入从设备地址

2.设置IICCON,设置时钟,使能中断

3.设置IICSTAT,使能传输

操作模式:

The S3C2440A IIC-bus interface has four operation modes:

— Master transmitter mode

— Master receive mode

— Slave transmitter mode

— Slave receive mode

①Master/Transmitter Mode

  1. 配置成master tx mode(也就是IICSTAT[7:6]配置成11)
  1. 把从设备地址写入IICDS,(第一次传输地址)
  2. IICSTAT写入0xF0(使能传输,发S信号,使能tx/rx)
  3. IICDS中配置的数据(从设备地址7bit + 读写位1bit)就被发送出去了(每传输完一个数据将产生一个中断)
  4. 判断第9个clk从设备是否有ack
    1. 如果从设备有ack,恢复i2c传输
      1. IICDS = buf
      2. Clear pending bit
      3. 数据被发送出去,继续i2c传输
    1. 如果没有ack, stop,返回错误
      1. IICSTAT = 0xd0
      2. Clear pending bit(IICCON[4])
      3. Delay一会儿等待停止条件生效

②Master/Receiver Mode

 

  1. 配置成master rx mode(也就是IICSTAT[7:6]配置成10)
  1. 把从设备地址写入IICDS,(第一次传输地址)
  2. IICSTAT写入0xB0(使能传输)
  3. IICDS中配置的数据(从设备地址7bit + 读写位1bit)就被发送出去了(每传输完一个数据将产生一个中断)
  4. 判断第9个clk从设备是否有ack
    1. 如果从设备有ack,恢复i2c传输
      1. Buf = IICDS
      2. Clear pending bit
      3. 数据被接受到,继续i2c传输
    1. 如果没有ack, stop,返回错误
      1. IICSTAT = 0x90
      2. Clear pending bit
      3. Delay一会儿

③Slave/Transmitter Mode

④Slave/Receiver Mode

 

posted on 2021-10-09 11:08  fuzidage  阅读(216)  评论(0编辑  收藏  举报