这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模拟iic的时序要求可能更高一点所以在原子哥的iic程序上做了修改,代码测验后已经不会死机,做个笔记,保存一下。

 #include "myiic.h"
 #include "delay.h"

 //初始化IIC
 void IIC_Init(void)
 {
 19   GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟

   //GPIOB10,B11初始化设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
    IIC_SCL=;
    IIC_SDA=;
 }
 //产生IIC起始信号
 void IIC_Start(void)
 {
     SDA_OUT();     //sda线输出
     IIC_SDA=;          

     delay_us();    

     IIC_SCL=;
     delay_us();
     IIC_SDA=;//START:when CLK is high,DATA change form high to low
     delay_us();
     IIC_SCL=;//钳住I2C总线,准备发送或接收数据
 }
 //产生IIC停止信号
 void IIC_Stop(void)
 {
     SDA_OUT();//sda线输出
     IIC_SCL=;

     delay_us();

     IIC_SDA=;//STOP:when CLK is high DATA change form low to high
     delay_us();
     IIC_SCL=; 

     delay_us();

     IIC_SDA=;//发送I2C总线结束信号
     delay_us();
 }
 //等待应答信号到来
 //返回值:1,接收应答失败
 //        0,接收应答成功
 u8 IIC_Wait_Ack(void)
 {
     u8 ucErrTime=;
     SDA_IN();      //SDA设置为输入
     IIC_SDA=;
     delay_us();
     IIC_SCL=;
     delay_us();
     while(READ_SDA)                 //可能可以把数搞大点
     {
         ucErrTime++;
         )
         {
             IIC_Stop();
             ;
         }
     }
     IIC_SCL=;//时钟输出0
     ;
 }
 //产生ACK应答
 void IIC_Ack(void)
 {
     IIC_SCL=;

     delay_us();

     SDA_OUT();
     IIC_SDA=;
     delay_us();
     IIC_SCL=;
     delay_us();
     IIC_SCL=;
 }
 //不产生ACK应答
 void IIC_NAck(void)
 {
     IIC_SCL=;

     delay_us();

     SDA_OUT();
     IIC_SDA=;
     delay_us();
     IIC_SCL=;
     delay_us();
     IIC_SCL=;
 }
 //IIC发送一个字节
 //返回从机有无应答
 //1,有应答
 //0,无应答
 void IIC_Send_Byte(u8 txd)
 {
     u8 t;
     SDA_OUT();
     IIC_SCL=;//拉低时钟开始数据传输
     ;t<;t++)
     {
         IIC_SDA=(txd&;
         txd<<=;
         delay_us();
         IIC_SCL=;
         delay_us();
         IIC_SCL=;
         delay_us();
     }
 }
 //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
 u8 IIC_Read_Byte(unsigned char ack)
 {
     unsigned ;
     SDA_IN();//SDA设置为输入
     ;i<;i++ )
     {
         IIC_SCL=;
         delay_us();
         IIC_SCL=;
         receive<<=;
         if(READ_SDA)
             receive++;
         delay_us();
     }
     if (!ack)
         IIC_NAck();//发送nACK
     else
         IIC_Ack(); //发送ACK
     return receive;
 }

空行间隔的为新增延时,和注释不一样的为改了的延时

stm32软件模拟IIC读取PX4FLOW光流传感器数据的更多相关文章

  1. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    #ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...

  2. C51—模拟IIC总线实现EEPROM存取数据

    a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...

  3. GPIO软件模拟IIC时序

    一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...

  4. 51单片机下实现软件模拟IIC通信

    1.IIC协议简易概述 IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备.IIC属于半双 ...

  5. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  6. 软件模拟IIC实现EEPROM

    ....妈的太难.    反正就是控制引脚的高低电平 实现数据的读取....参考 I2C的协议层和物理层的那个几个图,个个信号产生的电平 自己看源码去把. 头疼

  7. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  8. STM32学习笔记:IIC通信协议详解(附带软件模拟源码)

    什么是IIC(I2C)? IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司设计出来的一种简单.双向.二线制.同步串行总线.它是一种多向控制总 ...

  9. px4flow通过iic读取具体寄存器数据程序

    底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 in ...

随机推荐

  1. VFP自定义函数StringFormat (仿.NET String.Format 方法)

    VFP仿.NET String.Format 方法 将指定字符串中的每个{x}替换为相应值,并返回文本 *-- 调用格式 StringFormat("日期{2},字符{1}",&q ...

  2. 发现IE7的一个问题,不能用索引取字符串中的单个字符

    如下javascript: var testValue="hello,world"; alert(testValue[]); 在IE7上运行该代码,竟然提示值为"unde ...

  3. Nginx的nginx.conf配置文件中文注释说明

    #运行用户    user www-data;        #启动进程,通常设置成和cpu的数量相等    worker_processes  1;    #全局错误日志及PID文件    erro ...

  4. redis geo 初探

    redis的geo搜索功能是3.2之后新增的,所以实验开始之前先查看redis的版本,确保版本正确. redis的geo多用于地理类应用,所以这次还是用了高德地图API来用作数据源. 首先截取几个点: ...

  5. android ListView子布局中按钮响应点击事件

    只需要在子布局的根布局中添加以下属性即可: android:descendantFocusability="blocksDescendants"

  6. 关于NIO

    操作系统的IO控制 在整个IO控制方式的发展过程中,始终贯穿着这样一条宗旨:即尽量减少主机对IO控制的干预,把主机从繁杂的IO控制事务中解脱出来,以便更多地去完成数据处理任务.为了缓和高速CPU和IO ...

  7. jQuery 取消事件冒泡 阻止后续内容执行 闭包函数 (学习笔记)

    1.取消事件冒泡 <title>取消事件冒泡</title> <style> div { border:solid 1px black; } </style& ...

  8. FusionCharts制作报表使用XML导入数据时出现的中文乱码问题

    今天在使用FusionCharts制作报表时用XML导入数据,总是出现乱码问题,下面是我的解决方案. 让FusionCharts支持中文 刚刚将XML导入到html中后,在火狐浏览器一直报Invali ...

  9. c++模板使用出错情况error LNK2019: unresolved external symbol "public: float __thiscall Compare<float>::min(void)" (?min@?$Compare@M@@QAEMXZ) referenced in function _main

    将类模板在头文件中定义,类的成员函数在头文件中声明,头文件中只留下接口,函数的实现在另一个.cpp文件中,这样编译出来错误error LNK2019: unresolved external symb ...

  10. MessageDigest消息摘要

    <1>MessageDigest基础 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法. MessageDigest 对象开始被初始化.该对象通 ...