关于用GPIO口来模拟I2C和ADAU1772通讯的问题

用GPIO口来模拟IIC和ADAU1772通讯,用示波器测试gpio口,ADAU1772的地址是0x78,我只测了开始和发送地址的数据,然后等待ACK,但是没收到ACK,

示波器上面显示的图形是:

前面两张是完整的图形,最后一张是示波器旋转按钮往右移的图形。

测试代码如下:

VOID i2c_test(VOID)
{
	U8 ret; 
	
	SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SDA);  	//SDA = 1;
	SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);    //SCL = 1;

	I2C_Start();
	I2C_Send_Byte(0X78 | 0X00);
	ret = I2C_Wait_Ack();
}


void I2C_Start(void)
{
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SDA);  //SDA =1
   //delay_us(2);
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);  //SCL=1
   //delay_us(2);
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SDA);  //SDA=0
   //delay_us(5);
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SCL); //SCL=0
}  
 
void I2C_Send_Byte(U8 txd)
{  
	unsigned char Sdata;
	U8 t;	
	Sdata = 0;

	for(t=0;t<8;t++)
	{			 
		//delay_us(5);
		if((txd&0x80)==0x80)   
		{
			SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SDA); //SDA=1,写 1	
   		}			
		else  
		{
			SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SDA);  //SDA=0,写 0 
   		}
		txd<<=1;	
	   //delay_us(5);
	   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);
	   //delay_us(5); 
	   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SCL);
	   //delay_us(5);
	}  
}     

//等待应答信号到来
//返回值:1,接收应答失�?
//        0,接收应答成�?
U8 I2C_Wait_Ack(void)
{
	U8 bOk;
	U8 ret;
	U8 ucErrTime=0;

   SDK_GPIO_SetIO(PIN_SET_INPUT, LEVEL_HIGH, PIN_SDA);
   //delay_us(3);    
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);   	
   bOk = TRUE;

   while(bOk)
   {
		ret = SDK_GPIO_GetInputHighLow(PIN_SDA);
		
		if(ret == LEVEL_LOW) {	
			bOk = FALSE;   //SDA被垃低说明回复了ACK
		}
		else if(ret == LEVEL_HIGH){
			//fail
		}		

      ucErrTime++;
      if(ucErrTime>250)
      {
         //I2C_Stop();
         return 1;
      }
   }  
   SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SCL);
   return 0;     
}

Parents Reply Children
No Data