打印
[ZLG-ARM]

查询方式写的一个I2C测试程序(有问题)

[复制链接]
2161|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeguiyou|  楼主 | 2007-11-5 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用查询方式写的一个I2C测试程序,大家帮我看看
void I2C_init(uint32 I2C_F)
{
    if(I2C_F>400000)
    {
        I2C_F=400000;
    }
    PINSEL0=(PINSEL0&0xffffff0f)|0x50;
    I2C0SCLH=(Fpclk/I2C_F+1)/2;
    I2C0SCLL=(Fpclk/I2C_F)/2;    
}
void write_i2c(uint8 addr_i2c,uint8 data)
{
        
    uint8 i=0;
    I2C0CONCLR=0x28;
    I2C0CONSET=0x40;//初始化为主发送模式
    I2C0CONSET=0x20;//进入主发送模式
    do{
        i=I2C0STAT&0xf8;
    }while(i!=0x08);    
    I2C0DAT=addr_i2c;
    I2C0CONSET=0x04;
    I2C0CONCLR=0x08;
    while((I2C0STAT&0xf8)!=0x18);    
    I2C0DAT=data;
    I2C0CONSET=0x04;
    I2C0CONCLR=0x08;
    while((I2C0STAT&0xf8)!=0x28);    
    I2C0CONSET=0x14;
    I2C0CONCLR=0x08;
}
我在调试的时候在
do{
   i=I2C0STAT&0xf8;
   }while(i!=0x08);    
产生了死循环,i=0x20;
若去掉I2C0CONCLR=0x28;则i=0x30,但是我看了相关的资料,在发送了起始信号后,应该返回0x08才对?
请高手帮帮忙!

相关帖子

沙发
hotpower| | 2007-11-5 21:27 | 只看该作者

写成函数多清晰???

使用特权

评论回复
板凳
yeguiyou|  楼主 | 2007-11-5 21:55 | 只看该作者

不明白?请指教!

不明白?请指教!

使用特权

评论回复
地板
hotpower| | 2007-11-5 22:24 | 只看该作者

自己琢磨~~~

1.Init()退出前最好执行Stop().
2.函数细分为Start()...Stop()等.
3.写法要清晰.
  如:I2C0CONCLR=0x28;很难知道该语句要干什么.
  但:I2C0CONCLR=(1<<STAC) | (1<<SIC);清除起始位和中断标志.
4.主要解码程序用switch()分析I2C状态较好.
  加上状态机将会排除误码.

相关链接:http://www.**/blog/hotpower/18019/message.aspx

使用特权

评论回复
5
boy123| | 2007-11-6 00:32 | 只看该作者

lpc214x at24cxx_demo (I2C演示程序)

读写I2C AT24C16程序(兼容AT24C16~AT24C512读写)
实现方试:非中断方式

http://www.mcu123.net/bbs/dispbbs.asp?BoardID=28&ID=7116&replyID=&skin=1

相关链接:http://www.mcu123.net/bbs/dispbbs.asp?BoardID=28&ID=7116&replyID=&skin=1

使用特权

评论回复
6
yeguiyou|  楼主 | 2007-11-6 10:40 | 只看该作者

谢谢!

受益非浅!谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

14

帖子

1

粉丝