[求助] lpc1768的i2c控制器写24c02失败,各位高手帮忙看看。

arm新手   2012-5-30 18:24 楼主

void i2c0_wr_byte(uint8_t da,uint8_t add)
{

 LPC_I2C0->I2CONCLR=0x2c; 
 LPC_I2C0->I2CONSET|=0x60;     //使能i2c控制器并发送起始位
 while(!(LPC_I2C0->I2STAT==0x08));  //等待发送完起始位
 LPC_I2C0->I2DAT=0xa0;     //写入24c02从机地址+w位
 LPC_I2C0->I2CONCLR|=0x28;    //清零起始位和中断标志位  
 while(!(LPC_I2C0->I2STAT==0x18));   //等待发送完从机地址+w位和接收ack位
 LPC_I2C0->I2DAT=add;    //写入数据地址到I2DAT
 LPC_I2C0->I2CONCLR|=0x08;   //清零中断标志位
 while(!(LPC_I2C0->I2STAT==0x28)); //等待发送完数据地址和接收ack位
 LPC_I2C0->I2DAT=da;      //写入数据到I2DAT
 LPC_I2C0->I2CONCLR|=0x08;    //清零标志位
 while(!(LPC_I2C0->I2STAT==0x28)); //等待发送完数据和接收ack位
 LPC_I2C0->I2CONSET|=0x10;   //发送sto位
}

 

写一个数据到24c02的函数,i2c速率设定在100k,调试发现程序停在 (while(!(LPC_I2C0->I2STAT==0x18));   //等待发送完从机地址+w位和接收ack位)这里,状态寄存器i2cstat为0xf8,请高手帮忙看看,本人新手,请勿见笑。

回复评论 (8)

回复 楼主 arm新手 的帖子

这样很难看出问题,你最好对照I2C协议来看。。。
我的博客
点赞  2012-5-30 19:31
i2c速率设定在100k, ===10k
www.ctdisk.com/u/1283024 个人书库,持续更新中。
点赞  2012-5-30 19:55

回复 沙发 zhaojun_xf 的帖子

对着周立功翻译的手册i2c这章看了好多遍了,还是没找到是哪里的问题,发送完起始位i2cstat为0x08状态,把从地址+w为写到i2cdat后i2cstat还是为0x08状态,问题就出在清零sta位和si位后,i2cstat就跳到0xf8这个无有用信息的状态了,难道有个发送的操作?,手册上没提啊。
点赞  2012-5-31 14:20

回复 板凳 osoon2008 的帖子

速率跳到10k,1k都试了,还是一样。
点赞  2012-5-31 14:22
找到问题了,把对CONSET和CONCLR的操作指令从 LPC_I2C0->I2CONSET|=0x60;形式改成LPC_I2C0->I2CONSET=0x60;就行了。
新问题是读出来的数据总是存储单元的地址,比如读0x03单元的数据,结果读出的数据是0x03,立即地址读出的数据也是当前地址,读一次就加1,不知问题在哪啊,求指点。
点赞  2012-6-2 14:55
你这么调真的太麻烦了,给你一个最终的方法,买个便宜点的逻辑分析仪。
www.ctdisk.com/u/1283024 个人书库,持续更新中。
点赞  2012-6-5 20:53
谢谢各位,已经ok,原来存储的数据就是地址的值,我晕,写之前没擦出,数据没写进去。
点赞  2012-6-6 19:49
楼主可不可以把代码贡献出来研究下,我的方案是中断里面根据状态寄存器设置的。以前我调成功过,这次移植的时候出现问题了,头大头大!
点赞  2012-8-1 20:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复