此为软件模拟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 可直接移植使用相关推荐

  1. 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32

    ** 0.96寸OLED显示屏标准库移植HAL库,使用模拟IIC ** 由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码 ...

  2. STM32F0 HAL库软件模拟串口发送数据

    试验STM32F0官方提供的例程的时候,希望看到程序中某些变量的值,但是程序中往往没有串口发送部分,自己加又非常麻烦. 而点亮LED的程序基本上每个例程都有.所以用点亮LED引脚模拟串口发送数据就很方 ...

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

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

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

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

  5. 《STM32单片机开发应用教程(HAL库版)---基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第二章 软件安装与使用

    写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>系列之第二章,本章节将介绍开发软件STM32CubeMX和KEIL5的 ...

  6. STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)

    目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 ...

  7. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  8. stm32直流电机PID控制hal库(Cubemx)

    stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...

  9. STM32 软件模拟IIC

    0.系列目录 STM32 软件模拟IIC STM32 使用DMP库处理MPU6050数据 STM32 MPU6050与匿名上位机通讯(V2.6版) 1.IIC通讯过程 SCL和SDA在空闲时候均为高电 ...

最新文章

  1. newman api
  2. 动态半导体ram依据什么存储信息_LPDDR4X和RAM两者有什么关系 它们有什么特点
  3. rssi室内定位算法原理_智慧定位系统之蓝牙网关在室内定位技术的原理浅析
  4. 得到照片_大叔偷别人羞羞的照片画画,添油加醋后,却得到无数人点赞!
  5. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
  6. 关于页面的多种自适应布局——两列布局
  7. php ztree异步加载数据格式,zTree异步加载简单demo
  8. (转)Spring的三种实例化Bean的方式
  9. 【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法!...
  10. Julia: PostgreSQL数据库.......
  11. 自动化!windows端自动化抢购茅台python脚本
  12. 双鱼和射手怎样能合拍(图
  13. 卡通动漫游戏人物网页模板_灰色 卡通 动漫 游戏 漂亮 精美 整站 斜纹 质感
  14. ERD图“乌鸦脚”形式表示的关系的使用方法与理解
  15. halocn标定找旋转中心_一种利用旋转中心进行手眼标定的原理性介绍
  16. 皇家恩菲尔德子弹500经典
  17. 互联网研发晋升答辩汇总
  18. 机器学习图像特征提取—Hu矩(Hu不变矩)原理及代码
  19. CentOS 6.9设置IP、网关、DNS
  20. 微信小程 文字在图片正下方

热门文章

  1. Verilog 代码编写 DDS信号发生器(幅频相可调正弦波、方波、三角波、锯齿波)纯VIVADO编写仿真
  2. 油溶性Cu,Mn共掺杂量子点光转换材料
  3. 在线思维导图Processon部分截图
  4. 一文详解Pandas
  5. CQOI2020 退役记
  6. 年过完了,收心吧!送给大家送一波前端新书!
  7. 基础计算机教学论文,基础计算机论文,关于民办院校计算机基础课程实践教学体会相关参考文献资料-免费论文范文...
  8. 2022 Apache IoTDB 物联网生态大会 | 议题嘉宾公布,大会亮点抢先看!
  9. 使用GPU硬件加速FFmpeg视频转码
  10. 2019年2月星环科技大数据应用开发面试(2年工作经验)