之前为了测试, 拿最小板做了一个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, 这种方法仅限于做主, 做从还是得用硬件中断.

STM32模拟I2C的更多相关文章

  1. STM32 模拟I2C (STM32F051)

    /** ****************************************************************************** * @file i2c simu. ...

  2. STM32F4XX中断方式通过IO模拟I2C总线Master模式

    STM32的I2C硬核为了规避NXP的知识产权,使得I2C用起来经常出问题,因此ST公司推出了CPAL库,CPAL库在中断方式工作下仅支持无子地址 的器件,无法做到中断方式完成读写大部分I2C器件.同 ...

  3. STM32的I2C特性及架构

    软件模拟协议:使用CPU直接控制通讯引脚(GPIO)的电平,产生出符合通讯协议标准的逻辑. 硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要 ...

  4. 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)

    引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...

  5. STM32的I2C框图详解及通讯过程

    STM32 的I2C 特性及架构 如果我们直接控制STM32 的两个GPIO 引脚,分别用作SCL 及SDA,按照上述信号的时序要求,直接像控制LED 灯那样控制引脚的输出(若是接收数据时则读取SDA ...

  6. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  7. STM32 硬件I2C 到底是不是个坑?

    /** ****************************************************************************** * @author    Maox ...

  8. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  9. STM8S 模拟I2C程序

    STM8S的硬件I2C还是存在问题,不敢贸然使用. 于是决定用模拟I2C. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM P ...

随机推荐

  1. 使用Docker搭建consul集群+registrator实现服务自动注册。

    准备工作:10.173.16.83 master10.172.178.76 node110.171.19.139 node210.162.204.252 node3 一.安装consul-cluste ...

  2. docker-compose常用命令

    --verbose:输出详细信息-f 制定一个非docker-compose.yml命名的yaml文件-p 设置一个项目名称(默认是directory名)docker-compose的动作包括:bui ...

  3. Linux下设置网卡静态ip

    Linux下设置网卡静态ip 如果是服务器版,没有图形界面只用用命令行修改配置文件 如果是客户端版本,可以用图形界面 配置的前提是要在root用户下才能重启网卡服务 图形界面: system-conf ...

  4. shell 判断字符串是否为数字

    本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...

  5. 使用NSURLSession请求需要AD认证的HTTPS服务器

    关键代码:使用后台下载PDF文件 - (void)startDownloadPDF{ NSURLSession *session = [self session]; NSString *downloa ...

  6. oracle开启numa的支持

    在11.2中,即使是系统支持numa架构,oracle默认也不再检测硬件是否支持numa,也不开启对numa的支持. 要想开启对numa的支持,必须设置隐含参数: _enable_NUMA_suppo ...

  7. 当数据库某张表数据发生变化时,更新c#程序中缓存的用法

    参考:http://www.webkaka.com/tutorial/asp.net/2012/111912/(SqlDependency和SqlCacheDependency缓存的用法及具体步骤) ...

  8. DB2数据库管理最佳实践(1)

    1.DB2 9的新特性 1)DB2 9.1:主要是增加了原生XML,表分区和表压缩功能.从构架上,总的进程模型和内存构架看,都和8没啥区别. DB2 中的 pureXML 支持为管理 XML 数据提供 ...

  9. Leetcode: Elimination Game

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...

  10. Lintcode: Merge Sorted Array II

    Merge two given sorted integer array A and B into a new sorted integer array. Example A=[1,2,3,4] B= ...