您的位置: OpenADSP社区论坛 -> Sigma DSP/模拟器件专区 -> 新手上路 -> 关于用GPIO口来模拟I2C和ADAU1772通讯的问题... 
本帖共有112个阅读者
发表帖子 发表投票 回复主题
关于用GPIO口来模拟I2C和ADAU1772通讯的问题
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
关于用GPIO口来模拟I2C和ADAU1772通讯的问题
问:用GPIO口来模拟IIC和ADAU1772通讯,用示波器测试gpio口,ADAU1772的地址是0x78,我只测了开始和发送地址的数据,然后等待ACK,但是没收到ACK,

测试代码如下:



我是OP...
等级:管理员 参考IP地址:*.*.*.*
2019/1/25 16:43:27
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

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;    
}


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2019/1/25 16:43:44
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:1772的IIC口是标准的,物理接口,已跟很多MCU连接过。所以你需要做的是先用你的IO模拟的IIC与别的设备或MCU通信成功了。用MCU来测试你的IIC会比较好找问题。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2019/1/25 16:44:04
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154183 Call, 1 Queries, Processed in 0.015625 second(s),