打印
[51单片机]

大家进来帮我答答i2c的疑。

[复制链接]
2012|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
309368|  楼主 | 2013-8-14 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 309368 于 2013-8-14 17:31 编辑


这是两个i2c读写程序的主函数部分,r_add()读一个地址的数,w_add()在一个地址写入数据。但是只有第一张图所示的函数可以正常显示,为111112,第二张图的程序不能正常工作,前面11111正常显示,最后一位没有任何东西(没有一个管子亮(数码管))。i2c的读写都要这么像第一个那样安排么?为什么呢?

AT24C08.zip (43.51 KB)
附件里面的程序是想实现对某一页进行多个字节读写的功能(处于调试阶段,地址的高二位还没进行完善,测试正确后再修改),字节的读写用的是上述程序中测试成功的源码。但是这个程序还是不能工作,各路大神帮我看看呗。


最后想问一下,i2c难度到底算怎么样啊?看英文的pdf自己写的程序怎么都没调对。。。。。。之前写的18b20,和ds1302的程序都只改了一点就对了。新手,就接触了这几个,各位给给看法

相关帖子

沙发
309368|  楼主 | 2013-8-15 10:36 | 只看该作者
自顶一把

使用特权

评论回复
板凳
ayb_ice| | 2013-8-15 10:56 | 只看该作者
I2C驱动不行,不稳定吧,
带病工件,不发作OK,发作就不行了

使用特权

评论回复
地板
ayb_ice| | 2013-8-15 11:02 | 只看该作者
看了一下程序
你那I2C协议都没有搞明白,

应答机制都不对

使用特权

评论回复
5
outstanding| | 2013-8-15 12:11 | 只看该作者
IIC总线没有搞清楚吧,呵呵  如果正常应该是会保存111111吧

使用特权

评论回复
6
林志财| | 2013-8-15 12:54 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^1;
sbit scl=P2^0;
void delay()
{
   ;;;
}
void delay1(uint z)
{  
    uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
void start()
{
   
    sda=1;
    scl=1;
    delay();
    sda=0;
    delay();
}
void stop()
{
   
   sda=0;
   scl=1;
   delay();
   sda=1;
   delay();
}
void answer()
{
   scl=1;
   delay();
   while(sda==1);   
   scl=0;
   delay();
}
void write_dat(uchar dat)
{
   uchar i;
   for(i=0;i<8;i++)
    {
      
       dat=dat<<1;
       scl=0;
      
       delay();
       sda=CY;
       delay();
       scl=1;
       delay();      
    }
       scl=0;
       delay();
       sda=1;
       delay();  
}
uchar read_dat()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();       
                k=(k<<1)|sda;
                scl=0;
                delay();       
        }
        return k;
}
void main()
{   
     
     start();
     write_dat(0xa0);
     answer();
     write_dat(22);
     answer();
     write_dat(0xa8);
     answer();
     stop();
     delay1(10);
     
     start();
     write_dat(0xa0);
     answer();
     write_dat(22);
     answer();
     start();
     write_dat(0xa1);
     answer();
     P0=read_dat();   
     stop();         
     while(1);

使用特权

评论回复
7
ayb_ice| | 2013-8-15 14:53 | 只看该作者
    P0=read_dat();   
     stop();      

难道读数据就不要应答吗

使用特权

评论回复
8
309368|  楼主 | 2013-8-16 15:48 | 只看该作者
outstanding 发表于 2013-8-15 12:11
IIC总线没有搞清楚吧,呵呵  如果正常应该是会保存111111吧

对IIC总线确实没咋搞明白,不过这个程序只是在地址0上保存2,然后读出来赋值到数组的最低位,之所以弄一个六位数组,只不过是为了利用那个led显示函数,是写1302的一个显示函数

使用特权

评论回复
9
309368|  楼主 | 2013-8-16 15:55 | 只看该作者
本帖最后由 309368 于 2013-8-16 16:12 编辑
ayb_ice 发表于 2013-8-15 11:02
看了一下程序
你那I2C协议都没有搞明白,

确实感到很混乱

使用特权

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

本版积分规则

2

主题

45

帖子

0

粉丝