1、 管脚复用
在gel文件中可以找到控制管脚复用的寄存器,一般为PINMUX寄存器,例如I2C时钟线连接GPIO20管脚,查手册知此管脚的控制位为PINMUX3寄存器的21与22位,两位都为一时为gpio口,为1和0时为I2C口。设为I2C时可写为
PINMUX3 |= 0x0400000;
PINMUX3 &= ~0x0200000;
2、时钟频率设置
I2C的初始化函数为
Int16 EVMDM365_I2C_init()
{
I2C-ICMDR = 0; //reset I2C
I2C-ICPSC = 2; //config prescaler for 8Mhz
I2C-ICCLKL = 35; //config clk LOW for 100kHz
I2C-ICCLKH = 35; //config clk HIGH for 100kHz
I2C-ICMDR |= ICMDR-IRS; //release I2C from reset
}
计算公式为:
prescaler = 输入时钟/(I2C-ICPSC +1),且要求prescaler大于5Mhz小于16Mhz
I2C时钟线频率=prescaler/(I2C-ICCLKL+I2C-ICCLKH+10)
输入时钟为24MHz,经过上述计算得I2C时钟为100kHz
3、I2C时序
正确的I2C时序可如下表示:
时序问题是I2C的关键,需要注意的是:
1) 设备地址:一般为7位地址和1位读写位,实际地址左移一位,例如设备读地址为0xD0,实际为0x68
2) 寄存器地址:寄存器地址为1字节还是2字节?寄存器是只读还是可读写?寄存器的某几位是否已经写死?
3) 读时序:读时序需要先写再读,且写后不能有stop,这就需要写完改写某些寄存器位的值