这段时间在做全国光电设计大赛,用到了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. C# .csv文件转为Excel格式;Excel格式转换为.csv

    using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...

  2. Ubuntu 安装 SublimeText 3

    1. 下载 $ cd ~/Downloads $ wget https://download.sublimetext.com/sublime-text_build-3083_i386.deb 2. 安 ...

  3. Linux驱动学习之驱动开发准备工作

    一.开启驱动开发之路 1.驱动开发的准备工作 (1)正常运行linux系统的开发板.要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的.原因在于在安装模块的时候会进行安全性校验 ...

  4. C#网络编程二:Socket编程

    一:什么是SOCKET socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端 ...

  5. Device eth0 does not seem to be present, delaying initialization. 问题

    今天在复制vmware的时候 出现网卡无法启动 报错显示 Device eth0 does not seem to be present, delaying initialization. 这个错误原 ...

  6. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

  7. Tomcat服务启动成功,但访问index.jsp出错 (jspInit)

    本文引用自 --> http://zhouhaitao.iteye.com/blog/1164736 Tomcat服务启动成功,但访问index.jsp出错 环境:Tomcat6 + jdk6 ...

  8. HttpTool.java(在java tool util工具类中已存在) 暂保留

    HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; import java.io.BufferedReader ...

  9. 主从LDAP

    yum -y install compat-openldap必须得安装这个   1:在主上       备份         cp /etc/openldap/slapd.conf /etc/open ...

  10. Windows自带.NET Framework版本大全

    The following is a complete list of which version of the .NET Framework is included in which version ...