OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3093|回复: 2

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

[复制链接]

22

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2019-3-1
在线时间
43 小时
发表于 2019-3-1 15:37:45 | 显示全部楼层 |阅读模式
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;
               
}

时序图是这样子的




求大神赐教,我是菜鸟。

OZ3710_DS_v1.1_182306.pdf

2 MB, 下载次数: 3

数据手册

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2936
金钱
2936
注册时间
2017-3-6
在线时间
398 小时
发表于 2019-3-2 14:14:26 | 显示全部楼层
23h寄存器不是两个字节的寄存器吗,你这发一个字节错了
回复 支持 反对

使用道具 举报

22

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2019-3-1
在线时间
43 小时
 楼主| 发表于 2019-3-4 08:30:33 | 显示全部楼层
773208906 发表于 2019-3-2 14:14
23h寄存器不是两个字节的寄存器吗,你这发一个字节错了

不是的,0x23就是寄存器地址
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 22:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表