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, 这种方法仅限于做主, 做从还是得用硬件中断.

  • 相关阅读:
    面试8:找二叉树的下个结点
    面试8:找二叉树的下个结点
    面试题7:重建二叉树
    面试题7:重建二叉树
    Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案
    基础的Mapgis三维二次开发-插件式
    面试题6:从尾到头打印链表
    C语言中声明和定义详解(待看。。
    面试题5:替换空格
    面试题5:替换空格
  • 原文地址:https://www.cnblogs.com/Montauk/p/5454466.html
Copyright © 2011-2022 走看看