0、系列目录

  1. STM32 软件模拟IIC
  2. STM32 使用DMP库处理MPU6050数据
  3. STM32 MPU6050与匿名上位机通讯(V2.6版)

1、IIC通讯过程


SCL和SDA在空闲时候均为高电平。
MCU接收到通讯命令后,首先广播从机地址(例:MPU6050地址为0x68,0x69)+读/写操作,从机收到后产生应答,随后开始SCL强制拉低,开始传送一字节数据
①收到应答信号后,继续传送第二个字节……
②收到非应答信号后,停止传输

2、IIC通讯协议


从图中可以看到
IIC起始信号:SCL保持高电平,SDA从高电平跳变到低电平
IIC结束信号:SCL保持高电平,SDA从低电平跳变到高电平
开始和结束信号的SCL相同,SDA相反。
IIC应答信号:STM32接收到8bit的数据后,向发送数据的外设发送低电平,表示收到数据,CPU向外设发出信号后,等待外设发送一个应答信号,接收到应答信号后判断是否要继续传递数据。未收到应答,表示外设故障。

复合通讯协议

3、有效数据传输


IIC的SCL在高电平的时候会读取SDA,所以必须保持SDA电平时间多于SCL高电平时间,数据有效。
在软件模拟IIC通讯时,不需要IIC时必须保持SCL和SDA为高电平,在广播从机地址得到应答后,必须保持SCL为低电平,相当于钳制住SCL,以保证MCU与从机正常通讯。

4、代码示例

代码的编写要严格按照IIC的通讯协议控制IO的电平,否则会出现数据错误。

/**  *  功能:软模拟IIC引脚初始化 PB6->SCL  PB7->SDA*  入口参数:无*  返回值:无*/
void IIC_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7);}
//IIC操作的宏定义
//IO方向设置
#define SDA_IN()            {GPIOB->CRL &= 0x0FFFFFFF;GPIOB->CRL |=(u32)8<<28;}
#define SDA_OUT()           {GPIOB->CRL &= 0x0FFFFFFF;GPIOB->CRL |=(u32)3<<28;}//IO操作函数
#define IIC_SCL             PBout(6)
#define IIC_SDA             PBout(7)//输出数据
#define READ_SDA            PBin(7)//读数据

起始信号

/**  *  功能:IIC开始信号 SCL保持高电平,SDA从高电平跳变到低电平*  入口参数:无*  返回值:无*/
void IIC_Start(void)
{SDA_OUT();IIC_SDA=1;IIC_SCL=1;delay_us(4);IIC_SDA=0;delay_us(4);IIC_SCL=0;//钳制IIC总线,准备发送或接受数据
}

结束信号

/**  *  功能:IIC结束信号 SCL保持高电平,SDA从低电平跳变到高电平*  入口参数:无*  返回值:无*/
void IIC_Stop(void)
{SDA_OUT();IIC_SDA=0;IIC_SCL=0;delay_us(4);IIC_SCL=1;IIC_SDA=1;delay_us(4);
}

等待应答信号ACK

/**  *  功能:等待应答信号ACK*  入口参数:无*  返回值:0,接受应答成功;1,接受应答失败*/
u8 IIC_Wait_Ack(void)
{u8 ucErrTime = 0;SDA_IN();IIC_SDA=1;delay_us(1);IIC_SCL=1;delay_us(1);while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;return 0;
}

产生应答信号

/**  *  功能:产生ACK应答*  入口参数:无*  返回值:无*/
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}

产生非应答信号

/**  *  功能:产生非ACK应答*  入口参数:无*  返回值:无*/
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}

发送一个字节数据

/**  *  功能:IIC发送一个字节(8 bit)*  入口参数:无*  返回值:返回从机有无应答。0,无应答;1,有应答*/
void IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();IIC_SCL=0;//拉低IIC总线时钟开始数据传输for(t=0;t<8;t++){IIC_SDA=(txd&0x80)>>7;txd<<=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;delay_us(2);}
}

读取一个字节数据

/**  *  功能:IIC读取一个字节(8 bit)*  入口参数:ack,应答*  返回值:一个字节(8 bit)*/
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();for(i=0;i<8;i++){IIC_SCL=0;delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;delay_us(1);}if(!ack)IIC_NAck();//发送NACKelseIIC_Ack();//发送ACKreturn receive;
}

总结

IIC通讯协议不难,只需要按照协议,一步一步控制IO的电平,就可以模拟出IIC通讯,下篇会使用软模拟IIC获取MPU6050的原始数据,牵扯到IIC的连续读和连续写。连续读写,以及与MCU与从机之间的通讯方式非常重要,本节作为基础,理解最好。

STM32 软件模拟IIC相关推荐

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

    1 #ifndef _IIC_H 2 #define _IIC_H 3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h& ...

  2. STM32基于软件模拟IIC进行AHT21B温湿度采集

    STM32基于软件模拟IIC进行AHT21B温湿度采集 一. IIC简介 1.1 IIC简介 1.2 实现方式 1.3 实现方式对比 二. AHT21B简介 2.1 简介 2.2 产品特点 2.3 外 ...

  3. STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...

  4. STM32软件模拟IIC---读写驱动AT24Cxx

    以下内容皆是个人学习过程中的总结,记录一下整个过程,用于后期复习,如有不对之处,麻烦各位大佬指出~ (喜欢的朋友麻烦点个关注~~~ 后期还会进行持续更新) 概述 AT24C系列为美国ATMEL公司推出 ...

  5. STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器

    本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信.STM32自身含有硬件IIC资源,分别是PB6-->SCL.PB7-- ...

  6. 软件模拟IIC主从机

    软件模拟IIC 从机部分 从机接收部分 从机发送部分 主机部分 阻塞式发送 定时器中断方式发送 从机部分 因为项目简单,就只有数据接收,数据命令处理,显示.显示部分使用定时器中断动态扫描方式,主函数用 ...

  7. 【蓝桥杯嵌入式】【STM32】5_IICEEPROM之软件模拟IIC

    文章目录 1.原理图 2.源代码   下载工程文件:   https://gitee.com/Joseph_Cooper/blue-bridge-embedded 1.原理图 顺便指出了该器件的地址. ...

  8. IO口软件模拟IIC

    一.IIC时序 IIC(Inter-Integrated Circuit, 内部集成电路)总线是飞利浦公司开发的两线式串行总线,用于短距离传输,常用语微控制器及其外围设备.它是由数据线SDA和时钟线S ...

  9. STM32实例源码剖析(软件模拟IIC)

    基本的驱动都是一样的,延时时间是之前遇到的一个小问题 代码都是之前做项目写的,基本可以完全复制使用 #include "I2C1_soft.h" // Software I2C1_ ...

最新文章

  1. hdu4966 最小树形图(最少辅导花费)
  2. Struts1和Struts2的区别和对比
  3. docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理
  4. python调用窗口_如何调用一个函数并在另一个窗口中打开?
  5. 【git】Git Submodule管理项目子模块
  6. 2021-2025年中国冻融室行业市场供需与战略研究报告
  7. Hover.css:一组超实用的 CSS3 悬停效果和动画
  8. ug80浩强工具_ug浩强工具安装软件下载-ug浩强工具2.45 官方免费版-东坡下载
  9. 大疆2018网申之机器学习算法工程师笔试题B卷
  10. 最新elasticsearch版本与jdk版本对应图
  11. 阿里字体库的运用(网站上面的购物车或者一些小图标 箭头)
  12. 基于iOS11的HEVC(H.265)硬编码/硬解码功能开发指南
  13. Java写后门,JAVA简单编写后门程序
  14. WebVTT字幕格式
  15. Dynamic Convolution: Attention over Convolution Kernels
  16. ant pro-table点击表格行高亮显示
  17. Unity 编辑器开发实战【Custom Editor】- FSM Editor
  18. 工具箱@CMD实用命令
  19. python经典程序练习题6:健康食谱的输出。列出5种不同的食材,输出两两之间可能的组合形式
  20. CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解

热门文章

  1. linux get与put,科技常识:Linux ftp 命令行中下载文件get与上传文件put的命令应用详解...
  2. 【Arduino+ESP32专题】CP2102串口自动下载电路
  3. 策略模式的java实现例子
  4. VPI技术ABB低压变压器AFWF
  5. 打印机 WIA 无法停止服务,Windows无法停止Windows Image Acquisition(WIA)服务(位于本地计算 机上)。
  6. codeforces - 1315C - 思维题
  7. 关于C语言“文件”的知识点
  8. C++ this指针的理解和作用
  9. 2017.1.13【初中部 GDKOI】模拟赛B组 我要的幸福 题解
  10. Android触摸事件传递分析与实践