zoukankan      html  css  js  c++  java
  • STM32模拟I2C

    之前为了测试, 拿最小板做了一个I2C的主发跟主读, 一开始当然是尝试用硬件I2C, 结果弄了很久, 时间紧迫, 只好用了模拟, 结果发现, 哎, 真特么挺好用的, 现在1片儿顶过去5片儿.

    硬件I2C, 用库函数的方法如下:

    void WriteData2OBD(u8 TxLength){
          u8 Tx_Idx=0;
        I2C_GenerateSTART(I2C2, ENABLE);                  //起始信号
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));  
        
          I2C_Send7bitAddress(I2C2, I2C_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
            while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){}
                
            while(Tx_Idx < TxLength){            
                        /* Transmit buffer data */
                        I2C_SendData(I2C2, OBD_Buffer_Tx[Tx_Idx]);
                        Tx_Idx++;
                      while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
            }
          I2C_GenerateSTOP(I2C2, ENABLE);     
    }

    后来的模拟方法比较流氓:

    void sendCommand2OBD(u8 cmd1,u8 cmd2){
          IIC_Start();
          delay_us(10);
          IIC_Send_Byte(I2C_SLAVE_ADDRESS7);
          IIC_Wait_Ack();
          delay_us(10);
          IIC_Send_Byte(0x00);
          IIC_Wait_Ack();
          delay_us(10);
          IIC_Send_Byte(cmd1);
          IIC_Wait_Ack();
          delay_us(10);
          IIC_Send_Byte(cmd2);
          IIC_Wait_Ack();
          delay_us(10);  
          IIC_Send_Byte(0x03);
          IIC_Wait_Ack();
          delay_us(10);

          IIC_Stop();

    }

    Anyway, 这种方法仅限于做主, 做从还是得用硬件中断.

  • 相关阅读:
    P1642 规划 [01分数规划]
    01分数规划学习笔记
    P1527 [国家集训队]矩阵乘法 [整体二分]
    P3292 [SCOI2016]幸运数字 [线性基+倍增]
    java中遍历集合的三种方式
    20190706中兴提前批专业面面经
    《java入门如此简单》——语句,函数和数组
    java中数组常见的操作
    2019 波克城市ava面试笔试题 (含面试题解析)
    2019 华云数据java面试笔试题 (含面试题解析)
  • 原文地址:https://www.cnblogs.com/Montauk/p/5454466.html
Copyright © 2011-2022 走看看