关于逻辑分析仪抓到的模拟I2C的波形不对该改程序哪里

2019-07-20 03:31发布

QQ截图20190301153253.jpg

程序如下:

void IIC_Start(uchar a)
{

{        IIC_SDA=1;          
        IIC_SCL=1;
        SDA_OUT();
        delay_us(400);
        IIC_SDA=0;
        delay_us(300);
        IIC_SCL=0;
        delay_us(300);}

}          

void IIC_Ack(uchar a)

{ IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(200);
        IIC_SCL=1;
        delay_us(200);
        IIC_SCL=0;}

}

void IIC_Stop(uchar a)
{       

{
        {IIC_SCL=0;
        IIC_SDA=0;
        SDA_OUT();
        delay_us(200);
        IIC_SCL=1;
        delay_us(200);               
        IIC_SDA=1;       
        delay_us(200);

        }
}


}


u8 I2C_WaitToAck(uchar a)
{
        {
        SDA_IN();   

        delay_us(300);
        IIC_SCL=1;
        delay_us(200);
        if(READ_SDA)
        {
                return 1;
        }
else
       
        {IIC_SCL=0;
        delay_us(200);
        return 0;  
} }
}




void IIC_NAck(uchar a)
{
       
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(200);
        IIC_SCL=0;
        delay_us(200);
        IIC_SCL=1;
       


}




void I2C_SendByte(uchar txd,uchar a)      
{                        
        {IIC_SCL=0;
        SDA_OUT();             

    for(t=0;t<8;t++)
    {   
                if((txd&0x80)>0)
                        IIC_SDA=1;
                else
                        IIC_SDA=0;
                txd<<=1;        
               
                delay_us(200);
                IIC_SCL=1;
                delay_us(200);
                IIC_SCL=0;       
    }}         



}             


u8 IIC_Read_Byte(unsigned char ack,uchar a)
{

                SDA_IN();
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0;
        delay_us(200);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(200);
    }                                         
    if (!ack)
        IIC_NAck();
    else
        IIC_Ack();
    return receive;       



  }




void delay_us(u32 i)   
{u32 temp;
        SysTick->LOAD=9*i;   
        SysTick->CTRL=0x01;  
        SysTick->VAL=0;     
  do
        {
          temp=SysTick->CTRL;   
       
        }
while((temp&0x01)&&(!(temp&(1<<16))));   
SysTick->CTRL=0;   
SysTick->VAL=0;      


}


u8 ReadByte(uchar Reg_Addr )
{
  u32 data;
  IIC_Start();
  I2C_SendByte(0x54|0);
        I2C_WaitToAck();
        I2C_SendByte(Reg_Addr);
        I2C_WaitToAck();
//        IIC_Start();
        I2C_SendByte(0x54|1);
        I2C_WaitToAck(0);
        data=IIC_Read_Byte(0);
//        IIC_NAck();
        IIC_Stop();
  return data;
               
}

时序图是这样子的




求大神赐教,我是菜鸟。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
773208906
1楼-- · 2019-07-20 06:48
 精彩回答 2  元偷偷看……
往事随风就好
2楼-- · 2019-07-20 08:40
773208906 发表于 2019-3-2 14:14
23h寄存器不是两个字节的寄存器吗,你这发一个字节错了

不是的,0x23就是寄存器地址

一周热门 更多>