Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290711
  • 博文数量: 23
  • 博客积分: 491
  • 博客等级: 下士
  • 技术积分: 612
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-29 19:57
文章分类

全部博文(23)

文章存档

2013年(1)

2012年(22)

我的朋友

分类: 嵌入式

2012-10-19 20:31:37

I2C初始化主要是配置I2C总线时钟

主要包括复位ICMDRIRS位,配置时钟ICPSCICCLKL,ICCLKH,置位ICMDRIRS

整体架构查看datasheetIntroduction

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;     //得到MUST8M

//I2C总线时钟源使用系统提供的AUXCLK,即直接采用板上晶振提供的24M。经过I2C prescaler两重分频得到I2C总线时钟,ICPSC寄存器中的PSC位控制I2C prescalerICCLKL中的ICCL位、ICCLKH中的ICCH位控制I2Cclock dividers。最终得到I2C总线时钟。


i2c->ICCLKL = 5;

i2c->ICCLKH = 5;

//最终配置I2C总线频率为400K

SETBIT(i2c->ICMDR, IRS);

//配置完成,ICMDRIRS位职位使能I2C,初始化结束。

 

I2C写命令/数据

先判断总线忙碌状态,配置传送地址和数据量,配置发送模式,开始信号,赋值寄存器,结束信号

while (CHKBIT(i2c->ICSTR, BB)) {}

//判断总线忙碌状态,如果BB位为零,则处于free状态

i2c->ICCNT = in_length;

i2c->ICSAR = in_addr;

//配置传送数据量大小和传送地址,当I2C处于主机模式(ICMDR寄存器中MST=1TRX=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总线的结束信号。

阅读(3814) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~