[PIC®/AVR®/dsPIC®产品] pic16硬件i2c主机读取从机的的问题,加急!!加急!!

[复制链接]
3437|8
 楼主| 涵潇舒雅 发表于 2013-10-24 12:04 | 显示全部楼层 |阅读模式
本帖最后由 涵潇舒雅 于 2013-10-24 15:16 编辑

主机发送数据到从机的程序已经调试成功
  1. void read_iic(uchar add)
  2. {
  3.         uchar temp;
  4.         SSPIF=0;
  5.         SEN=1;
  6.         while(!SSPIF);
  7.         SSPIF=0;
  8.         SSPBUF=add|0x01;
  9.         while(!SSPIF);
  10.         SSPIF=0;
  11.         temp=SSPBUF;
  12.         RCEN=1;
  13.         while(!BF);
  14.         SSPIF=0;         //等待接受数据完成
  15.         read_data=SSPBUF;
  16.         ACKDT=1;
  17.         ACKEN=1;
  18.         while(!SSPIF);
  19.         SSPIF=0;
  20.         PEN=1;
  21.         while(!SSPIF);
  22.         SSPIF=0;
  23. }
  1. void interrupt isr()
  2. {
  3.         unsigned char temp,i;
  4.         if(SSPIF==1&&SSPIE==1)
  5.         {
  6.                         SSPIF=0;
  7.                         if(R_nW==0 && D_nA==1)  //接受的是数据
  8.                         {
  9.                                 if(BF==1)
  10.                                 {
  11.                                         receive_data=SSPBUF;
  12.                                         write_flag=1;
  13.                                 }
  14.                         }
  15.                         else if(D_nA==0)  //接受的是地址
  16.                         {
  17.                                 
  18.                                 if(BF==1)
  19.                                 {
  20.                                         master_add=SSPBUF;
  21.                                 }
  22.                                 count_isr++;
  23.                         }
  24.                         else if(R_nW==1&&D_nA==1&&BF==0)//发送数据
  25.                         {
  26.                                 CKP=0;
  27.                                 SSPBUF=0xaa;
  28.                                 if(BF==0)              //判断SSPBUF是否为空
  29.     read_flag=1;                        
  30.                         }
  31.                         
  32.                 }
  33.                 CKP=1;
  34.                 SSPOV=0;
  35. }
经测试read_flag=1;read_data=66;不管从机发送的数据怎么改变,SDA的波形图都不发送变化,read_data=66!!!
这是SCL
这是SDA波形图,读出的数据就是66,与显示的数据正常,但是为啥就是不能改变呢??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 涵潇舒雅 发表于 2013-10-24 14:30 | 显示全部楼层
由此可见,就是从机的SSPBUF没有写进数据去,有没有遇到这种情况的???求指点啊
NE5532 发表于 2013-10-24 19:28 | 显示全部楼层
看不懂,你来做填空题好了

1.用示波器观察总线上的数据___(能/不能)随着从机发送寄存器内的数据改变而正确发送?

2.主机收到的数据跟上述用示波器看到的数据____(一致/不一致)?
 楼主| 涵潇舒雅 发表于 2013-10-25 07:55 | 显示全部楼层
NE5532 发表于 2013-10-24 19:28
看不懂,你来做填空题好了

1.用示波器观察总线上的数据___(能/不能)随着从机发送寄存器内的数据改变而正 ...

第一题 不能随着从机发送数据改变而改变
第二题  读取的数据和示波器的数据 一致
非常奇怪!!!
 楼主| 涵潇舒雅 发表于 2013-10-25 09:27 | 显示全部楼层
NE5532 发表于 2013-10-24 19:28
看不懂,你来做填空题好了

1.用示波器观察总线上的数据___(能/不能)随着从机发送寄存器内的数据改变而正 ...

老大,我找到原因了,读取的数据66应该是属于一个帧头,类似于告诉主机已经准备好了,在读取一次,就能正常读取数据了。
  1. void read_iic(uchar add)
  2. {
  3.         uchar temp;
  4.         SSPIF=0;
  5.         SEN=1;
  6.         while(!SSPIF);
  7.         SSPIF=0;
  8.         SSPBUF=add|0x01;
  9.         while(!SSPIF);
  10.         SSPIF=0;
  11.         temp=SSPBUF;
  12.         RCEN=1;
  13.         while(RCEN==1);//等待数据接受完成
  14.         while(!BF);  //检测SSPBUF是否有数据
  15.         SSPIF=0;         
  16.         read_data1=SSPBUF;
  17.         ACKDT=0;
  18.         ACKEN=1;
  19.         while(!SSPIF);
  20.         SSPIF=0;
  21.         RCEN=1;
  22.         while(RCEN==1);//等待数据接受完成
  23.         while(!BF);  //检测SSPBUF是否有数据
  24.         SSPIF=0;         
  25.         read_data2=SSPBUF;
  26.         ACKDT=1;
  27.         ACKEN=1;
  28.         while(!SSPIF);
  29.         SSPIF=0;
  30.         PEN=1;
  31.         while(!SSPIF);
  32.         SSPIF=0;
  33. }
NE5532 发表于 2013-10-25 10:16 | 显示全部楼层
我觉得你还是没找到问题,这个66不受控啊,是不是你有什么地方没有注意到,比如“上一次”的数据没有读取。
 楼主| 涵潇舒雅 发表于 2013-10-25 10:52 | 显示全部楼层
本帖最后由 涵潇舒雅 于 2013-10-25 10:54 编辑
NE5532 发表于 2013-10-25 10:16
我觉得你还是没找到问题,这个66不受控啊,是不是你有什么地方没有注意到,比如“上一次”的数据没有读取。 ...

我一开始也是这样想的,我检测WCOL,SSPOV发现都是为0,如果是上一次的数据没有发生完成,但也不可能都是66,01000010有的说大部分这样的格式的数据,都是确认帧,我看手册这方面的介绍是没有的!:-(
dong00520 发表于 2013-10-25 11:12 | 显示全部楼层
学习了 ,支持下
zhongs98 发表于 2015-1-30 15:16 | 显示全部楼层
学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部