打印

C8051f120 的SMBUS请教!

[复制链接]
2978|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlgcumt|  楼主 | 2011-11-23 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jlgcumt 于 2011-11-24 20:04 编辑

void SMBUS_ISR (void) interrupt 7
{

switch (SMB0STA)

  {

    case 0x08:
    //起始条件  重复起始条件

    SMB0DAT =  SMBUSAddr;

  
STA = 0;
                          

break;

case 0x10:
  

    SMB0DAT =  SMBUSAddr | 0x01;

  
STA = 0;
                          

break;
  

  
case 0x18:
//从地址+w已发
   收到ACK
  

    SMB0DAT = *SMBUSBuf++ ;

    SMBUSNbyte = SMBUSNbyte-1;
   

break;
  

  
case 0x20:
//从地址+w已发
   收到NACK

  {

  
WRFinishStatus = 0x21 ;

STO = 1;

  
break;

  }

case 0x28:
  //数字字节已发出,收到ACK

  {

  
if(SMBUSNbyte > 0)

  {

    SMB0DAT = *SMBUSBuf++;

  
SMBUSNbyte = SMBUSNbyte-1;

break ;

  }

else if((WRFlag == 1) && (SMBUSNbyte==0))
   //当前操作为读

  {

    STA = 1;     //重启总线

break ;   
  


  }

else

  {

     WRFinishStatus = 0x11 ;  // 操作成功置1

STO = 1;
              // 中止 I2C

break ;
   
  //  禁止使能I2C

  }
  

  
break ;

  }

case 0x30:         //数字字节已发出,收到NACK

  {

  
WRFinishStatus = 0x21;
//操作失败

STO = 1;

break;

  }

case 0x38:
  //竞争失败

     

WRFinishStatus = 0x21;
//操作失败

STO = 1;

break;


  
case 0x40:         //从地址+R已发出 收到ACK

  {

     

AA = 0;

break ;
//
if(SMBUSNbyte<=1)
//
    AA = 0;
//
else
//
    AA = 1;

  }

case 0x48:          //从地址+R已发出,收到NACK

  {

  
WRFinishStatus = 0x21;
//操作失败

STO = 1;

    break ;

  }

case 0x50:         //数字字节收到,ACK已发出

  {
//
     aa = SMB0DAT;
//
WRFinishStatus = 0x11;
//操作成功
//
STO = 1;

break ;
/*
*SMBUSBuf++ = SMB0DAT;

SMBUSNbyte--;

if(SMBUSNbyte<=1)

     AA = 0;


else

     AA = 1;



break ;   */

  

  }

case 0x58:           //数字字节收到,NACK已发出

  {

  


aa = SMB0DAT;
//
*SMBUSBuf++ = SMB0DAT;
//
SMBUSNbyte--;

STO = 1;

WRFinishStatus = 0x11;
//操作成功
   

  
break;

  }
        default:

  {

  
SI = 0;

  
break;

  }

  

  }



SI = 0;
}

相关帖子

沙发
jlgcumt|  楼主 | 2011-11-23 19:56 | 只看该作者
case 0x18:                 //从地址+w已发           收到ACK                   
                    SMB0DAT = *SMBUSBuf++ ;
                    SMBUSNbyte = SMBUSNbyte-1;                           
                        break;
调试是发现一个奇怪的现象:在写操作时单步跑。进入case 0x18: 执行完SMB0DAT = *SMBUSBuf++ ;
再点下一步时就跑到: case 0x28里面了,这是怎么回事呀!怎么下一句不执行呢!

使用特权

评论回复
板凳
jlgcumt|  楼主 | 2011-11-23 20:38 | 只看该作者
原来是优化的问题,但这个程序还有问题,写操作正常,读操作有问题

使用特权

评论回复
地板
hotpower| | 2011-11-23 21:43 | 只看该作者
实际就是I2C

使用特权

评论回复
5
Ryanhsiung| | 2011-11-24 08:00 | 只看该作者
注意频率,10-100K。
不过还要小心:曾经我这有一块SMBUS 的板子只能用50-100K通信,低于30完全不能通信,30-50之间则部分成功通信。(注:这个板子不是标准的SMBUS)

使用特权

评论回复
6
jlgcumt|  楼主 | 2011-11-24 20:06 | 只看该作者
在读操作的时候单步跑或者在读之前设一个断点可以正常读出数据,但全速跑的时候不行,这是什么原因?
我一设断点就好了,搞得我没法调了!

使用特权

评论回复
7
jlgcumt|  楼主 | 2011-11-24 20:24 | 只看该作者
在程序里加了错误判断代码,写操作正常,但在读的时候,不是要把地址先用写操作设定要读的数据地址吗,在发送完写地址+w后,收到NACK,但在读之前暂停一下就行了,怎么回事,间隔时间短吗?

使用特权

评论回复
8
jlgcumt|  楼主 | 2011-11-24 20:27 | 只看该作者
哈哈,果然如此

使用特权

评论回复
9
jlgcumt|  楼主 | 2011-11-24 20:28 | 只看该作者
我把读写操作时间加了个延时就行了,庆祝一下。

使用特权

评论回复
10
jlgcumt|  楼主 | 2011-11-24 20:29 | 只看该作者
搞了我一个礼拜,唉!

使用特权

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

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝