C8051f120 的SMBUS请教!

[复制链接]
3792|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
Ryanhsiung 发表于 2011-11-24 08:00 | 显示全部楼层
注意频率,10-100K。
不过还要小心:曾经我这有一块SMBUS 的板子只能用50-100K通信,低于30完全不能通信,30-50之间则部分成功通信。(注:这个板子不是标准的SMBUS)
 楼主| jlgcumt 发表于 2011-11-24 20:06 | 显示全部楼层
在读操作的时候单步跑或者在读之前设一个断点可以正常读出数据,但全速跑的时候不行,这是什么原因?
我一设断点就好了,搞得我没法调了!
 楼主| jlgcumt 发表于 2011-11-24 20:24 | 显示全部楼层
在程序里加了错误判断代码,写操作正常,但在读的时候,不是要把地址先用写操作设定要读的数据地址吗,在发送完写地址+w后,收到NACK,但在读之前暂停一下就行了,怎么回事,间隔时间短吗?
 楼主| jlgcumt 发表于 2011-11-24 20:27 | 显示全部楼层
哈哈,果然如此
 楼主| jlgcumt 发表于 2011-11-24 20:28 | 显示全部楼层
我把读写操作时间加了个延时就行了,庆祝一下。
 楼主| jlgcumt 发表于 2011-11-24 20:29 | 显示全部楼层
搞了我一个礼拜,唉!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

183

主题

733

帖子

4

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