STM32 软件模拟IIC
0、系列目录
- STM32 软件模拟IIC
- STM32 使用DMP库处理MPU6050数据
- 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相关推荐
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
1 #ifndef _IIC_H 2 #define _IIC_H 3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h& ...
- STM32基于软件模拟IIC进行AHT21B温湿度采集
STM32基于软件模拟IIC进行AHT21B温湿度采集 一. IIC简介 1.1 IIC简介 1.2 实现方式 1.3 实现方式对比 二. AHT21B简介 2.1 简介 2.2 产品特点 2.3 外 ...
- STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用
此为软件模拟IIC,可以直接移植到HAL库使用..h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论. 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是 ...
- STM32软件模拟IIC---读写驱动AT24Cxx
以下内容皆是个人学习过程中的总结,记录一下整个过程,用于后期复习,如有不对之处,麻烦各位大佬指出~ (喜欢的朋友麻烦点个关注~~~ 后期还会进行持续更新) 概述 AT24C系列为美国ATMEL公司推出 ...
- STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器
本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信.STM32自身含有硬件IIC资源,分别是PB6-->SCL.PB7-- ...
- 软件模拟IIC主从机
软件模拟IIC 从机部分 从机接收部分 从机发送部分 主机部分 阻塞式发送 定时器中断方式发送 从机部分 因为项目简单,就只有数据接收,数据命令处理,显示.显示部分使用定时器中断动态扫描方式,主函数用 ...
- 【蓝桥杯嵌入式】【STM32】5_IICEEPROM之软件模拟IIC
文章目录 1.原理图 2.源代码 下载工程文件: https://gitee.com/Joseph_Cooper/blue-bridge-embedded 1.原理图 顺便指出了该器件的地址. ...
- IO口软件模拟IIC
一.IIC时序 IIC(Inter-Integrated Circuit, 内部集成电路)总线是飞利浦公司开发的两线式串行总线,用于短距离传输,常用语微控制器及其外围设备.它是由数据线SDA和时钟线S ...
- STM32实例源码剖析(软件模拟IIC)
基本的驱动都是一样的,延时时间是之前遇到的一个小问题 代码都是之前做项目写的,基本可以完全复制使用 #include "I2C1_soft.h" // Software I2C1_ ...
最新文章
- hdu4966 最小树形图(最少辅导花费)
- Struts1和Struts2的区别和对比
- docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理
- python调用窗口_如何调用一个函数并在另一个窗口中打开?
- 【git】Git Submodule管理项目子模块
- 2021-2025年中国冻融室行业市场供需与战略研究报告
- Hover.css:一组超实用的 CSS3 悬停效果和动画
- ug80浩强工具_ug浩强工具安装软件下载-ug浩强工具2.45 官方免费版-东坡下载
- 大疆2018网申之机器学习算法工程师笔试题B卷
- 最新elasticsearch版本与jdk版本对应图
- 阿里字体库的运用(网站上面的购物车或者一些小图标 箭头)
- 基于iOS11的HEVC(H.265)硬编码/硬解码功能开发指南
- Java写后门,JAVA简单编写后门程序
- WebVTT字幕格式
- Dynamic Convolution: Attention over Convolution Kernels
- ant pro-table点击表格行高亮显示
- Unity 编辑器开发实战【Custom Editor】- FSM Editor
- 工具箱@CMD实用命令
- python经典程序练习题6:健康食谱的输出。列出5种不同的食材,输出两两之间可能的组合形式
- CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解
热门文章
- linux get与put,科技常识:Linux ftp 命令行中下载文件get与上传文件put的命令应用详解...
- 【Arduino+ESP32专题】CP2102串口自动下载电路
- 策略模式的java实现例子
- VPI技术ABB低压变压器AFWF
- 打印机 WIA 无法停止服务,Windows无法停止Windows Image Acquisition(WIA)服务(位于本地计算 机上)。
- codeforces - 1315C - 思维题
- 关于C语言“文件”的知识点
- C++ this指针的理解和作用
- 2017.1.13【初中部 GDKOI】模拟赛B组 我要的幸福 题解
- Android触摸事件传递分析与实践