S5PV210的I2C控制器有三个主要的寄存器,分别是I2CCON、I2CSTAT、I2CDS,以下为具体的控制位描述:
#define I2CCON0 (*(volatile INT32U *)0xE1800000)
#define ENACK (1<<7)
#define CLKSEL(x) ((x)<<6) //0-I2CCLK = fPCLK/16 1-I2CCLK = fPCLK/512
#define ENINT (1<<5)
#define INTPEND (1<<4) //write 0 to clear pending condition, write 1 means N/A
#define CLKVAL(x) ((x)<<0) //clock = I2CCLK/(x + 1)
#define I2CSTAT0 (*(volatile INT32U *)0xE1800004)
#define MODESEL(x) ((x)<<6) //00-slave receive 01-slave transmit 10-master receive 11-master transmit
#define BUSYIND (1<<5)
#define SSSIG (1<<5) //1-START 0-STOP
#define DATAOUT (1<<4) //DATA OUT enable
#define LASTBIT (1<<0) //0-last received bit is 0,ACK 1-last received bit is 1,NoACK
#define I2CADD0 (*(volatile INT8U *)0xE1800008) //s5pv210 used as slave, generally not use
#define I2CDS0 (*(volatile INT8U *)0xE180000C)
I2CDS是串行移位寄存器,它存放需要发送的8位数据,以及接收到的8位串行数据。
I2CCON[7] 设置为1时,当S5PV210接收到一个字节之后,将发送ACK信号,如果此位为0,则发送NoACK信号。
I2CCON[6]和I2CCON[3:0] 用来配置SCL线的时钟频率,最大不应超过100KHz
I2CCON[5] 使能I2C产生中断,I2CCON[4] 中断标志位,如果产生了中断,此位为1,将此位清0将清除中断,I2C控制器才能继续工作。
注意: 就算将I2CCON[5]置为1,使能中断,只要中断控制器里的VICxINTENABLE没有将I2C中断打开,就不会产生I2C中断,也就不需要写中断服务程序。
另外,I2CCON[5]如果没有设置为1,I2CCON[4]中断标志位的状态就不是正确值。所以一般初始化时,都会将I2CCON[5]置为1。