打印

请教一个pic16f 硬件i2c接口通讯问题

[复制链接]
2558|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

从机模式,从机接收中断

interrupt ISR(void)
{
        char tmp;
//        RC2=0;
        if(SSP1IF==1)
        {
                SSP1IF=0;
                if(D_nA==1)  // 1 是数据
                {
                        if(BF==1)  // 缓冲区满,说明从主机收到一个字节
                        {
                                tmp=SSPBUF;  // 保存收到的普通数据
                                if(tmp==0x23)
                                RC2=0;  // 显示收到的数据
                        }
                        else  // BF=0,主机读取结束
                        {
                                if(R_nW==1) // 读标志位有效,说明主机还在继续读数据
                                {
                                  SSPBUF=0x06; // 把主机要的数据保存在SSPBUF中等待主机读取                                         
                                }
                                else
                                {  // 读标志位无效,说明主机已经读取完最后一个字节了
                                }
                        }
                }
                else  //0 是地址
                {
                       
                        tmp=SSPBUF;
                        if( (tmp & 0b00000001)!=0 ) // R/W =1,read
                        {
                                SSPBUF=0x06;  // 准备好数据等待下一次主机读取
                        }
                        else  //R/W=0, write
                        {
                       
                                // 等待下一次主机来数据放到SSPBUF中
                        }
                }
        }
        CKP=1; //  从机释放SCL

}


主机模式,主机数据发送
/*************************************************************************
函数功能:主机写模式
入口参数:CMD  PACE 。
返    回:无。
备    注:无。
*************************************************************************/
void I2C_Write (uint8 add, uint8 CMD, uint8 PACE)
{
        SEN=1;  // 发送起始位
        while(SEN); // SEN=1说明未发送完毕
    // 循环退出说明SEN=0,即发送完毕


    SSPBUF = add&Write; // 从机地址+写操作
    while(R_nW);  //R_nW=1说明数据发送进行中
    // 循环退出说明R_nW=0,即发送完毕
    if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
      while(1);// 死循环,便于调试,实际项目中应做错误处理

    SSPBUF = CMD; //向从机写入数据 CMD
    while(R_nW);  //R_nW=1说明数据发送进行中
    // 循环退出说明R_nW=0,即发送完毕
    if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
      while(1);  // 死循环,便于调试,实际项目中应做错误处理

   SSPBUF = PACE; //向从机写入数据 PACE
    while(R_nW);  //R_nW=1说明数据发送进行中
    // 循环退出说明R_nW=0,即发送完毕
    if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
      while(1){LED=0;}  // 死循环,便于调试,实际项目中应做错误处理

    PEN=1;  // 发送停止位
    while(PEN); // PEN=1说明未发送完毕
    // 循环退出说明PEN=0,即发送完毕
}

屏蔽掉红字部分代码,也就是一次只发送地址和一个数据时,没有问题
如果不屏蔽红字部分代码,一次发地址和俩个数据时,程序会死在LED=0;




沙发
yewuyi| | 2013-5-22 11:53 | 只看该作者
在官网应用板块找IIC通信的例程,按照那个修改即可。

使用特权

评论回复
板凳
gurong60|  楼主 | 2013-5-22 12:09 | 只看该作者
好像没有,我用的是pic16f1824,官网下没有

使用特权

评论回复
地板
chengqing3968| | 2013-9-16 16:13 | 只看该作者
楼主,指导……不会!

使用特权

评论回复
5
gurong60|  楼主 | 2013-9-16 21:09 | 只看该作者
判断中断标志位就好了

使用特权

评论回复
6
chengqing3968| | 2013-9-16 23:53 | 只看该作者
gurong60 发表于 2013-9-16 21:09
判断中断标志位就好了

楼主,我刚接触I2C,可以加你qq嘛!我的396891848 忘指导哈!

使用特权

评论回复
7
理工大小薛| | 2013-10-21 21:03 | 只看该作者
官网例程不给力

使用特权

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

本版积分规则

个人签名:对手,队友

179

主题

1307

帖子

4

粉丝