STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用
此为软件模拟IIC,可以直接移植到HAL库使用。.h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论。
使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是根据IIC的时序图编写代码,主要内容就是包括开始信号,停止信号以及发送数据的格式、接收数据和数据的应答。
此IIC代码可以供所有的IIC模块使用,包括IIC必须要的几个基本功能代码中都已经给出。下面开始来介绍IIC协议。
IIC协议具体内容
写数据 :主机给从机发 从机只收 SDA为输出模式
读数据: 从机给主机发 主机收 SDA为输入模式
IIC具体内容:(只规定了开始信号 停止信号 8位数据(发8位收一位ACK) ACK应答(低电位有效) 具体使用IIC模块要看模块数据的发送协议) 时钟线为高电平期间数据有效 ACK应答的时候SDA的模式为输入模式(因为要判断SDA的电平状态)
应答:
MCU一次只能和IIC总线的一个从机进行通信
SDA数据线 SCLK时钟线
具体代码如下:包括IIC开始 停止 应答 发送 接收数据的几种模式
#include "iic.h"
#include "delay.h"
#include "gpio.h"
/**********************************************************ST芯片单片机HAL库之IIC软件模拟 作者:十一
**********************************************************/
/**********************************************************1.IIC软件模拟 使用HAL库时2.需要STM32CubeMX配置初始化的相关引脚为GPIO模式 SDA SCL初始状态下都是输出 推挽 上拉模式 4.初始状态下SDA 与 SCL要给高电平 使用高低电平转换时之间要有明显的us级延时
**********************************************************/
static GPIO_InitTypeDef GPIO_InitStruct;
/**********************************************************
1.引脚配置 宏定义用IF语句
2.给引脚电平必须要给输出模式
3.SCL一直都是输出模式(输出时钟肯定是输出模式)
4.宏定义绑定引脚SDA与SCL SDA PB7 SCL PB6
**********************************************************/
#define SCL_Type GPIOB
#define SDA_Type GPIOB#define SCL_GPIO GPIO_PIN_6
#define SDA_GPIO GPIO_PIN_7
//设置输出高低电平模式
#define SDA_OUT(X) if(X) \HAL_GPIO_WritePin(SDA_Type, SDA_GPIO, GPIO_PIN_SET); \else \HAL_GPIO_WritePin(SDA_Type, SDA_GPIO, GPIO_PIN_RESET);#define SCL_OUT(X) if(X) \HAL_GPIO_WritePin(SCL_Type, SCL_GPIO, GPIO_PIN_SET); \else \HAL_GPIO_WritePin(SCL_Type, SCL_GPIO, GPIO_PIN_RESET); #define SDA_IN HAL_GPIO_ReadPin(SDA_Type,SDA_GPIO)//只有输入模式才能读取电平状态/*****************************************SDA引脚转变为 OUT输出模式(输出模式给停止 开始信号)
******************************************/
void IIC_SDA_Mode_OUT(void)
{GPIO_InitStruct.Pin = SDA_GPIO;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(SDA_Type, &GPIO_InitStruct);
}
/*****************************************SDA引脚转变为 输入模式(输入模式传输具体的数据)
******************************************/
void IIC_SDA_Mode_IN(void)
{GPIO_InitStruct.Pin = SDA_GPIO;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(SDA_Type, &GPIO_InitStruct);
}
/*****************************************IIC开始信号
******************************************/
void IIC_Start(void)//IIC开始信号
{//设置为输出模式IIC_SDA_Mode_OUT();//空闲状态两个引脚是高电平SDA_OUT(1);SCL_OUT(1) ;delay_us(5);//拉低数据线SDA_OUT(0);delay_us(5);//再拉低时钟线SCL_OUT(0) ;delay_us(5);
}
//IIC停止信号
void IIC_Stop(void)
{//设置为输出模式IIC_SDA_Mode_OUT();//拉低SDA_OUT(0);SCL_OUT(0);delay_us(5);//时钟线先拉高SCL_OUT(1);delay_us(5);//再把数据线拉高SDA_OUT(1);delay_us(5);
}
void IIC_Send_Byte(uint8_t d)//主机发送8位数据给从机MSB 高位先发
{uint8_t i = 0;//设置为输出模式IIC_SDA_Mode_OUT();SDA_OUT(0);SCL_OUT(0);delay_us(5);for(i=0;i<8;i++){if(d & (0x1<<(7-i)))//表示数据是1SDA_OUT(1)elseSDA_OUT(0);delay_us(5);SCL_OUT(1);//拉高时钟线,告诉对方你可以读了delay_us(5);SCL_OUT(0);//拉低时钟线,告诉对方你暂时别读,我在准备数据}}
uint8_t IIC_Wait_Ack(void)//等待从机给主机应答或者不应答
{uint8_t ack = 0;//设置为输入模式IIC_SDA_Mode_IN();//时钟线拉高,时钟线为高电平期间,不管是数据还是ack都是有效的SCL_OUT(1);delay_us(5);if( SDA_IN == 1)ack = 1;//无效ACK,就是无效应答elseack = 0;//有效ACK,就是有效应答SCL_OUT(0);delay_us(5);return ack;
}
uint8_t IIC_Read_Byte(void)//从机发送8位数据给主机
{uint8_t i =0;uint8_t data = 0;//设置为输入模式IIC_SDA_Mode_IN();//先拉低时钟线,准备数据SCL_OUT(0);delay_us(5);for(i=0;i<8;i++){SCL_OUT(1);//时钟线为高电平期间数据才是有效的delay_us(5);if(SDA_IN == 1)data |= (0x1<<(7-i));//数据就是1elsedata &= ~(0x1<<(7-i));//数据就是0SCL_OUT (0);//告诉对方此时准备数据,先别读写delay_us(5);}return data;
}
void IIC_Ack(uint8_t ack)//主机发送应答或者不应答给从机
{//设置为输出模式IIC_SDA_Mode_OUT();SDA_OUT(0);SCL_OUT(0);delay_us(5);SDA_OUT(ack) ;//发送高/低电平--->发送不应答/应答delay_us(5);SCL_OUT(1);//告诉从机我已经准备好数据,你可以读取了delay_us(5);SCL_OUT (0);//拉低时钟线,发送ack结束delay_us(5);
}
STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用相关推荐
- 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32
** 0.96寸OLED显示屏标准库移植HAL库,使用模拟IIC ** 由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码 ...
- STM32F0 HAL库软件模拟串口发送数据
试验STM32F0官方提供的例程的时候,希望看到程序中某些变量的值,但是程序中往往没有串口发送部分,自己加又非常麻烦. 而点亮LED的程序基本上每个例程都有.所以用点亮LED引脚模拟串口发送数据就很方 ...
- STM32实例源码剖析(软件模拟IIC)
基本的驱动都是一样的,延时时间是之前遇到的一个小问题 代码都是之前做项目写的,基本可以完全复制使用 #include "I2C1_soft.h" // Software I2C1_ ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
1 #ifndef _IIC_H 2 #define _IIC_H 3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h& ...
- 《STM32单片机开发应用教程(HAL库版)---基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第二章 软件安装与使用
写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>系列之第二章,本章节将介绍开发软件STM32CubeMX和KEIL5的 ...
- STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)
目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 ...
- 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)
[STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...
- stm32直流电机PID控制hal库(Cubemx)
stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...
- STM32 软件模拟IIC
0.系列目录 STM32 软件模拟IIC STM32 使用DMP库处理MPU6050数据 STM32 MPU6050与匿名上位机通讯(V2.6版) 1.IIC通讯过程 SCL和SDA在空闲时候均为高电 ...
最新文章
- newman api
- 动态半导体ram依据什么存储信息_LPDDR4X和RAM两者有什么关系 它们有什么特点
- rssi室内定位算法原理_智慧定位系统之蓝牙网关在室内定位技术的原理浅析
- 得到照片_大叔偷别人羞羞的照片画画,添油加醋后,却得到无数人点赞!
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
- 关于页面的多种自适应布局——两列布局
- php ztree异步加载数据格式,zTree异步加载简单demo
- (转)Spring的三种实例化Bean的方式
- 【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法!...
- Julia: PostgreSQL数据库.......
- 自动化!windows端自动化抢购茅台python脚本
- 双鱼和射手怎样能合拍(图
- 卡通动漫游戏人物网页模板_灰色 卡通 动漫 游戏 漂亮 精美 整站 斜纹 质感
- ERD图“乌鸦脚”形式表示的关系的使用方法与理解
- halocn标定找旋转中心_一种利用旋转中心进行手眼标定的原理性介绍
- 皇家恩菲尔德子弹500经典
- 互联网研发晋升答辩汇总
- 机器学习图像特征提取—Hu矩(Hu不变矩)原理及代码
- CentOS 6.9设置IP、网关、DNS
- 微信小程 文字在图片正下方
热门文章
- Verilog 代码编写 DDS信号发生器(幅频相可调正弦波、方波、三角波、锯齿波)纯VIVADO编写仿真
- 油溶性Cu,Mn共掺杂量子点光转换材料
- 在线思维导图Processon部分截图
- 一文详解Pandas
- CQOI2020 退役记
- 年过完了,收心吧!送给大家送一波前端新书!
- 基础计算机教学论文,基础计算机论文,关于民办院校计算机基础课程实践教学体会相关参考文献资料-免费论文范文...
- 2022 Apache IoTDB 物联网生态大会 | 议题嘉宾公布,大会亮点抢先看!
- 使用GPU硬件加速FFmpeg视频转码
- 2019年2月星环科技大数据应用开发面试(2年工作经验)