打印
[PIC®/AVR®/dsPIC®产品]

pic16硬件i2c主机读取从机的的问题,加急!!加急!!

[复制链接]
2564|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 涵潇舒雅 于 2013-10-24 15:16 编辑

主机发送数据到从机的程序已经调试成功
void read_iic(uchar add)
{
        uchar temp;
        SSPIF=0;
        SEN=1;
        while(!SSPIF);
        SSPIF=0;
        SSPBUF=add|0x01;
        while(!SSPIF);
        SSPIF=0;
        temp=SSPBUF;
        RCEN=1;
        while(!BF);
        SSPIF=0;         //等待接受数据完成
        read_data=SSPBUF;
        ACKDT=1;
        ACKEN=1;
        while(!SSPIF);
        SSPIF=0;
        PEN=1;
        while(!SSPIF);
        SSPIF=0;
}
void interrupt isr()
{
        unsigned char temp,i;
        if(SSPIF==1&&SSPIE==1)
        {
                        SSPIF=0;
                        if(R_nW==0 && D_nA==1)  //接受的是数据
                        {
                                if(BF==1)
                                {
                                        receive_data=SSPBUF;
                                        write_flag=1;
                                }
                        }
                        else if(D_nA==0)  //接受的是地址
                        {
                                
                                if(BF==1)
                                {
                                        master_add=SSPBUF;
                                }
                                count_isr++;
                        }
                        else if(R_nW==1&&D_nA==1&&BF==0)//发送数据
                        {
                                CKP=0;
                                SSPBUF=0xaa;
                                if(BF==0)              //判断SSPBUF是否为空
    read_flag=1;                        
                        }
                        
                }
                CKP=1;
                SSPOV=0;
}
经测试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.用示波器观察总线上的数据___(能/不能)随着从机发送寄存器内的数据改变而正 ...

第一题 不能随着从机发送数据改变而改变
第二题  读取的数据和示波器的数据 一致
非常奇怪!!!

使用特权

评论回复
5
涵潇舒雅|  楼主 | 2013-10-25 09:27 | 只看该作者
NE5532 发表于 2013-10-24 19:28
看不懂,你来做填空题好了

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

老大,我找到原因了,读取的数据66应该是属于一个帧头,类似于告诉主机已经准备好了,在读取一次,就能正常读取数据了。
void read_iic(uchar add)
{
        uchar temp;
        SSPIF=0;
        SEN=1;
        while(!SSPIF);
        SSPIF=0;
        SSPBUF=add|0x01;
        while(!SSPIF);
        SSPIF=0;
        temp=SSPBUF;
        RCEN=1;
        while(RCEN==1);//等待数据接受完成
        while(!BF);  //检测SSPBUF是否有数据
        SSPIF=0;         
        read_data1=SSPBUF;
        ACKDT=0;
        ACKEN=1;
        while(!SSPIF);
        SSPIF=0;
        RCEN=1;
        while(RCEN==1);//等待数据接受完成
        while(!BF);  //检测SSPBUF是否有数据
        SSPIF=0;         
        read_data2=SSPBUF;
        ACKDT=1;
        ACKEN=1;
        while(!SSPIF);
        SSPIF=0;
        PEN=1;
        while(!SSPIF);
        SSPIF=0;
}

使用特权

评论回复
6
NE5532| | 2013-10-25 10:16 | 只看该作者
我觉得你还是没找到问题,这个66不受控啊,是不是你有什么地方没有注意到,比如“上一次”的数据没有读取。

使用特权

评论回复
7
涵潇舒雅|  楼主 | 2013-10-25 10:52 | 只看该作者
本帖最后由 涵潇舒雅 于 2013-10-25 10:54 编辑
NE5532 发表于 2013-10-25 10:16
我觉得你还是没找到问题,这个66不受控啊,是不是你有什么地方没有注意到,比如“上一次”的数据没有读取。 ...

我一开始也是这样想的,我检测WCOL,SSPOV发现都是为0,如果是上一次的数据没有发生完成,但也不可能都是66,01000010有的说大部分这样的格式的数据,都是确认帧,我看手册这方面的介绍是没有的!:-(

使用特权

评论回复
8
dong00520| | 2013-10-25 11:12 | 只看该作者
学习了 ,支持下

使用特权

评论回复
9
zhongs98| | 2015-1-30 15:16 | 只看该作者
学习了~

使用特权

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

本版积分规则

26

主题

164

帖子

1

粉丝