分类: 嵌入式
2012-10-19 20:31:37
I2C初始化主要是配置I2C总线时钟
主要包括复位ICMDR的IRS位,配置时钟ICPSC和ICCLKL,ICCLKH,置位ICMDR的IRS
整体架构查看datasheet的Introduction
EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_I2C1, PSC_ENABLE);
//在PSC中使能I2C1
EVMOMAPL138_pinmuxConfig(PINMUX_I2C1_REG,,PINMUX_I2C1_MASK,PINMUX_I2C1_VAL);
//复用I2C1管脚
i2c->ICMDR = 0;
//重启ICMDR寄存器,配置I2C时钟时,ICMDR寄存器中的IRS位必须处于reset状态。
i2c->ICPSC = 2; //得到MUST为8M
//I2C总线时钟源使用系统提供的AUXCLK,即直接采用板上晶振提供的24M。经过I2C prescaler和两重分频得到I2C总线时钟,ICPSC寄存器中的PSC位控制I2C prescaler而ICCLKL中的ICCL位、ICCLKH中的ICCH位控制I2Cclock dividers。最终得到I2C总线时钟。
i2c->ICCLKL = 5;
i2c->ICCLKH = 5;
//最终配置I2C总线频率为400K
SETBIT(i2c->ICMDR, IRS);
//配置完成,ICMDR的IRS位职位使能I2C,初始化结束。
I2C写命令/数据
先判断总线忙碌状态,配置传送地址和数据量,配置发送模式,开始信号,赋值寄存器,结束信号
while (CHKBIT(i2c->ICSTR, BB)) {}
//判断总线忙碌状态,如果BB位为零,则处于free状态
i2c->ICCNT = in_length;
i2c->ICSAR = in_addr;
//配置传送数据量大小和传送地址,当I2C处于主机模式(在ICMDR寄存器中MST=1和TRX=1/0 ),且重复模式无效(ICMDR寄存器中的RM位为0)
i2c->ICMDR = STT | MST | ICMDR_FREE | TRX | IRS;
//配置ICMDR寄存器,STT置为触发I2C总线的开始信号,MST处于主模式,ICMDR_FREE表示当有I2C中断信号时不触发仍正常运行。TRX处于发送模式,IRS使能I2C总线。
i2c->ICDXR = src_buffer[i];
//把数据赋给发送寄存器
while (!CHKBIT(i2c->ICSTR, ICXRDY));
//检查是否发送完毕
SETBIT(i2c->ICMDR, STP);
//触发I2C总线的结束信号。