175192387 发表于 2011-5-18 11:27:41

关于I2C通讯方式的问题

我有块芯片,通讯方式是I2C的,但是写的程序总是有问题,应答的时候都是高电平。check_ACK得到的都是0, 就是无应答
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_640647TXJM19.JPG
逻辑分析仪抓出来的图形 (原文件名:1.JPG)

//**********************************************************
// Send Byte
//**********************************************************
void Send_Byte( unsigned char nByte )
{
       unsigned char i;
       
       for( i=0; i<8; i++ )
         {
            
            if( (nByte & BIT7)==BIT7 ) IC_DATA_OUT |= IC_DATA_BIT;
            else IC_DATA_OUT &=~IC_DATA_BIT;
            nByte <<= 1;
            
            IC_CLK_OUT |= IC_CLK_BIT;
            _NOP();
            _NOP();
            
            IC_CLK_OUT &=~IC_CLK_BIT;
            
            //_NOP();         
      }
      IC_CLK_OUT &=~IC_CLK_BIT;
}

/*******************************************************************************
* 函 数 名 : check_ACK                                                                                                   
功    能:检查从机的应答操作
参    数:无
返回值 :从机是否有应答:1--有,0--无
*******************************************************************************/
unsigned char wait_ack(void)
{   
      
      uchar slaveack;
      IC_DATA_OUT |=IC_DATA_BIT;
      _NOP(); _NOP();
      IC_CLK_OUT |=IC_CLK_BIT;
      _NOP(); _NOP();
      IC_DATA_DIR &=~IC_DATA_BIT;   
      _NOP(); _NOP();
      slaveack = IC_DATA_IN & IC_DATA_BIT;;   //读入SDA数值
      IC_CLK_OUT &=~IC_CLK_BIT;
      delay_Nus(1);
      IC_DATA_DIR |= IC_DATA_BIT;

   if(slaveack)    return 0;
   else            return 1;
}

chenqiuhuang3 发表于 2011-5-31 22:26:45

我也是这样的,你解决了吗

millwood0 发表于 2011-5-31 22:44:20

if you look at the i2c spec, what you should do for ack detection, after a write command, is to float sda to high, bring scl to high, and then read the sda.

littlepig 发表于 2011-6-1 10:48:41

楼上的意思是写命令之后要进行应答信号的检测

comway 发表于 2011-6-1 12:37:42

有很多现成程序吧
页: [1]
查看完整版本: 关于I2C通讯方式的问题