• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于模拟I2C总线

我爱下载 2018-02-05 浏览量:1092
关于adxl345模拟I2C总线中时钟信号和数据信号配合的问题,SCK时钟信号要如何和SDA信号配合,发送数据,判断ACK,和接收数据。是否有例程。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
我爱下载 回复了 我是爆米花啊:谢谢兄弟 回复
电子老工程师 回复了 :L4949ED013TR ST 回复

其他答案 数量:8
  • 模拟I2C,其实就是要用GPIO模拟I2C通讯时SDA和SCL的电平的高低变化,模拟的高低电平变化的依据就是数据手册上I2C的时序,其实每个操作,比如Start、STOP、Ack等都是可以用GPIO电平变化表示,按照手册要求进行功能封装,就能实现I2C的操作了。
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :AS78L12RTR-G1 原厂封装:SOT-89 . 以原厂封装信息为准。 回复

  • #define SCL_PORT GPIOA
    #define SCL_PIN GPIO_Pin_1
    #define SCL_HIGH GPIOA->BSRR=(uint32_t)GPIO_Pin_1
    #define SCL_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_1

    #define SDA_PORT GPIOA
    #define SDA_PIN GPIO_Pin_2
    #define SDA_HIGH GPIO_>BSRR=(uint32_t)GPIO_Pin_2
    #define SDA_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_2
    #define SDA_READ (uint16_t)(GPIOA->ID&GPIO_Pin_2)
    #define SDA_OUT GPIOA->MODER|=((uint32_t)GPIO_Mode_OUT)<<(2*2))
    #define SDA_IN GPIOA->MODER&=(GPIO_MODER_MODERO)<<(2*2))

    #define SCL_OUTH() SCL_HIGH
    #define SCL_OUTL() SCL_LOW
    #define SDA_OUTH() SDA_HIGH
    #define SDA_OUTL() SDA_LOW
    #define SDA_SETIN() SDA_IN
    #define SDA_READ() SDA_READ


    void I2C_Delay(void)
    {
    uint8_t i = 200;
    while(i--);
    }

    void SDA_SETOUT(void)
    {
    SDA_IN;
    SDA_OUT;
    }

    void I2C_Start(void)
    {
    SCL_OUTH();
    SDA_OUTH();
    I2C_Delay();
    SDA_OUTL();
    I2C_Delay();
    SCL_OUTL();
    I2C_Delay();
    }

    void I2C_Stop(void)
    {
    SCL_OUTL();
    SDA_OUTL();
    I2C_Delay();
    SCL_OUTH();
    I2C_Delay();
    SDA_OUTH();
    Delay(Delay5ms);  //Delay() 为系统延时,用于确保数据传输正确
    }

    uint8_t I2C_WriteByte(uint8_t Data)
    {
    uint8_t i,bAck=0;

    for(i=0;i<8;i++)
    {
    SCL_OUTL();
    if(Data & 0x80)
    SDA_OUTH();
    else
    SDA_OUTL();
    I2C_Delay();
    SCL_OUTH();
    I2C_Delay();
    Data <<=1;
    }

    SCL_OUTL();
    I2C_Delay();
    SCL_OUTH();
    I2C_Delay();
    SDA_SETIN();
    if(SDA_READ())
    bAck=1;
    else
    bAck=0;

    SCL_OUTL();
    SDA_SETOUT();
    I2C_Delay();
    return ((uint8_t)(!bAck));
    }

    uint8_t I2C_ReadByte(uint8_t bLSByte)
    {
    uint8_t i,Data=0;
    SDA_SETIN();
    for(i=8;i!=8;i--)
    {
    SCL_OUTL();
    Data = Data<<1;
    I2C_Delay();
    SCL_OUTH();
    I2C_Delay();

    if(SDA_READ())
    Data |=0x01;
    else
    Data &=0xFE;
    }
    SCL_OUTL();
    SDA_SETOUT();
    if(bLSByte)
    SDA_OUTH();
    else
    SDA_OUTL();
    I2C_Delay();
    SCL_OUTH();
    I2C_Delay();

    SCL_OUTL();
    I2C_Delay();
    return(Data);
    }

    uint8_t DAC_Write_1byte(uint8_t Slave,uint8_t Regist_Addr,uint8_t Data)
    {
    uint8_t succ,time=0;

    I2C_Start();
    succ=I2C_ReadByte(Slave);
    while((succ!=1)&&(time<3))   //从机没有响应,重试三次
    {
    I2C_Stop();
    I2C_Start();
    succ=I2C_WriteByte(Slave);
    time++;
    }
    succ=I2C_WriteByte(Regist_Addr);  //发送寄存器地址
    succ=I2C_WriteByte(Data);  //发送数据
    I2C_Stop();
    return succ;
    }

    uint8_t DAC_Read_1byte(uint8_t Slave,uint8_t,Regist_Addr)
    {
    uint8_t succ,time=0;
    uint8_t dat;

    I2C_Start();
    succ=I2C_WriteByte(Slave+1)  //加1表示读数据
    while((succ!=1)&&(time<3))
    {
    I2C_Stop();
    I2C_Start();
    succ=I2C_WriteByte(Slave+1);
    time++;
    }
    succ=I2C_WriteByte(Regist_Addr);
    dat=I2C_ReadByte(0);
    I2C_Stop();
    return dat;
    }
    STM32模拟IIC的代码
    • 发布于2018-02-05
    • 举报
    • 评论 2
    • 0
    • 0
我爱下载 回复了 Angel_YY :谢谢 回复
电子老工程师 回复了  :S14是对的,S10是错的 回复

我爱下载 回复了 lichangle :IIC的时序不同器件会不会不同 回复
lichangle 回复了 lichangle :IIC的时序有快速和低速之分,当然速度不同会导致通讯错误 回复
lichangle 回复了 我爱下载 :IIC的时序有快速和低速之分,当然速度不同会导致通讯错误 回复
电子老工程师 回复了  :7123-4123-30 :单独胶壳 7157-6421-80 :棕色的锁片 回复

  • 模拟IIC的要点是有层次,逐步向上,IIC实质是两根数据线的变化,把手册中的定义信号实现后,把对应的信号组合实现就能实现标准IIC时序
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :尾缀Z和N代表类别,Z:汽车级,N:一般用途 回复

  • 模拟I2C无非就是用两个普通引脚来作为SDA和SCK,可以参考I2C的时序实现
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :X5043S8IZ-2.7 Renesas Electronics America Inc 回复

  • 符合IIC的时序就可以了,芯片的时序图上有SCL与SDA的时序,按时序来就一定正确
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :1、MC74HCT14ADR2G IC INVERT SCHMITT 6CH 6IN 14SOIC 2、MC74HCT14ADG IC INVERT SCHMITT 6CH 6IN 14SOIC 回复

  • 还是自己对着数据手册,封装一遍操作函数,对自己的提高大,建议参考别人的程序,自己进行封装。
    • 发布于2018-02-07
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :包装区别。 CAT24C16WI-G 管件 CAT24C16WI-GT3 卷带 回复

  • 可以参考一下原子官方的例程,模拟I2C支持多种变种,如16位数据读取,连续数据读取等。

    • 发布于2018-02-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :弯角不能替换直角的,安装方式不同。也不能掰直使用属于不良操作。 回复

相关问题

问题达人换一批

关于模拟I2C总线