STM32模拟I2C通讯的驱动程序

ops/2024/12/14 12:07:01/

目录

STM32模拟I2C通讯的驱动程序

开发环境

引脚连接

驱动程序


STM32模拟I2C通讯的驱动程序

开发环境
立创天空星开发板、主控芯片为STM32F407VxT6
引脚连接
使用stm32的PB9引脚模拟I2C时钟线SCL、PB8引脚模拟I2C数据线SDA
驱动程序
i2c.h文件如下:
#ifndef _I2C_H
#define _I2C_H#include "stm32f4xx.h"//端口宏定义
#define RCC_I2C_GPIO          RCC_AHB1Periph_GPIOB
#define PORT_I2C_GPIO         GPIOB#define GPIO_SDA             GPIO_Pin_8
#define GPIO_SCL             GPIO_Pin_9//设置SDA输出模式
#define SDA_OUT()   {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; \GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; \GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure); \}
//设置SDA输入模式
#define SDA_IN()    {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; \GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; \GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure); \}
//获取SDA引脚的电平
#define SDA_GET()       GPIO_ReadInputDataBit(PORT_I2C_GPIO, GPIO_SDA)//SDA与SCL输出高低电平
#define SDA(x)          GPIO_WriteBit(PORT_I2C_GPIO, GPIO_SDA, (x?Bit_SET:Bit_RESET) )
#define SCL(x)          GPIO_WriteBit(PORT_I2C_GPIO, GPIO_SCL, (x?Bit_SET:Bit_RESET) )//模拟I2C引脚初始化
void I2C_GPIO_Init(void);//I2C起始时序
void I2C_Start(void);//I2C停止时序
void I2C_Stop(void);//主机发送应答或者非应答信号
void I2C_Send_Ack(unsigned char ack);//主机等待从机应答
unsigned char I2C_WaitAck(void);//主机发送一个字节数据
void Send_Byte(uint8_t dat);//主机接收一个字节数据
unsigned char Read_Byte(void);#endif
i2c.c文件如下:
#include "i2c.h"/******************************************************************* 函 数 名 称:I2C_GPIO_Init* 函 数 说 明:模拟IIC引脚初始化* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_GPIO_Init(void)
{RCC_AHB1PeriphClockCmd(RCC_I2C_GPIO, ENABLE); // 使能GPIO时钟GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_SDA | GPIO_SCL;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure);
}/******************************************************************* 函 数 名 称:I2C_Start* 函 数 说 明:IIC起始时序* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Start(void)
{SDA_OUT();SCL(1);SDA(0);SDA(1);delay_us(5);SDA(0);delay_us(5);SCL(0);
}/******************************************************************* 函 数 名 称:I2C_Stop* 函 数 说 明:I2C停止信号* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Stop(void)
{SDA_OUT();SCL(0);SDA(0);SCL(1);delay_us(5);SDA(1);delay_us(5);
}/******************************************************************* 函 数 名 称:I2C_Send_Ack* 函 数 说 明:主机发送应答或者非应答信号* 函 数 形 参:0发送应答  1发送非应答* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Send_Ack(unsigned char ack)
{SDA_OUT();SCL(0);SDA(0);delay_us(5);if(!ack) SDA(0);else     SDA(1);SCL(1);delay_us(5);SCL(0);SDA(1);
}/******************************************************************* 函 数 名 称:I2C_WaitAck* 函 数 说 明:主机等待从机应答* 函 数 形 参:无* 函 数 返 回:0有应答  1超时无应答* 备       注:无
******************************************************************/
unsigned char I2C_WaitAck(void)
{char ack = 0;unsigned char ack_flag = 10;SCL(0);SDA(1);SDA_IN();SCL(1);while( (SDA_GET()==1) && ( ack_flag ) ){ack_flag--;delay_us(5);}if( ack_flag <= 0 ){I2C_Stop();return 1;	//应答超时返回1}else{SCL(0);SDA_OUT();}return ack;		//正常通讯返回应答
}/******************************************************************* 函 数 名 称:Send_Byte* 函 数 说 明:主机发送一个字节数据* 函 数 形 参:dat要发送的数据* 函 数 返 回:无* 备       注:无
******************************************************************/
void Send_Byte(uint8_t dat)
{int i = 0;SDA_OUT();SCL(0);//拉低时钟开始数据传输for( i = 0; i < 8; i++ ){SDA( (dat & 0x80) >> 7 );delay_us(1);SCL(1);delay_us(5);SCL(0);delay_us(5);dat<<=1;}
}/******************************************************************* 函 数 名 称:Read_Byte* 函 数 说 明:主机接收一个字节数据* 函 数 形 参:无* 函 数 返 回:接收到的数据* 备       注:无
******************************************************************/
unsigned char Read_Byte(void)
{unsigned char i,receive=0;SDA_IN();for(i=0;i<8;i++ ){SCL(0);delay_us(5);SCL(1);delay_us(5);receive<<=1;if(SDA_GET()){receive |= 1;}delay_us(5);}SCL(0);return receive;
}

​ ​


http://www.ppmy.cn/ops/141811.html

相关文章

MQ比较选型

4 种消息队列&#xff0c;如何选型&#xff1f; kafka 分布式存储&#xff0c;多分区&#xff0c;分副本&#xff1b;基于发布订阅模式 架构 Product broker Consumer Group ZK 关键词 product topic主题&#xff1a;消息分类&#xff0c;类似数据库表 partition分区&a…

【开源免费】基于SpringBoot+Vue.JS加油站管理系统(JAVA毕业设计)

本文项目编号 T 003 &#xff0c;文末自助获取源码 \color{red}{T003&#xff0c;文末自助获取源码} T003&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

SQL Having用法

拿个业务场景说这个案例&#xff0c;比如我们有个表里面可能有批改过的数据&#xff0c;批改过得数据不会随着新批改的数据覆盖&#xff0c;而是逐条插入表中&#xff0c;如果想找出包含最早批改的数据和最新批改数据的话&#xff0c;那么我们就需要用到了havinng 用法,假设最开…

【C++算法】41模拟_外观数列

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 38. 外观数列 题目描述&#xff1a; 解法 演示&#xff1a; 模拟双指针&#xff1a; right&#xff0c;直到left和right不同才停下来。 countright-left C 算法代码&…

Node.JS基础

标题&#xff1a;Node.js 基础教学课件 第一章&#xff1a;Node.js 概述 课件内容&#xff1a; 介绍Node.js及其与浏览器中JavaScript的区别。讲解Node.js的事件驱动、非阻塞I/O模型。Node.js的适用场景和优势。Node.js的版本管理和环境搭建。 讨论点&#xff1a; Node.js…

react-redux 数据持久化

安装依赖&#xff1a; npm install redux-persist 改造 src/store/index.js import { configureStore } from reduxjs/toolkit import userSlice from ./userSlice import storage from redux-persist/lib/storage; import { persistReducer, persistStore } from redux-p…

【再谈设计模式】组合模式~层次构建的多面手

一、引言 在软件开发的世界里&#xff0c;我们经常面临着处理对象之间复杂关系的挑战。如何有效地表示对象的部分 - 整体层次结构&#xff0c;并且能够以一种统一的方式操作这些对象&#xff0c;是一个值得探讨的问题。组合模式&#xff08;Composite Pattern&#xff09;为我们…

《蓝桥杯比赛规划》

大家好啊&#xff01;我是NiJiMingCheng 我的博客&#xff1a;NiJiMingCheng 这节课我们来分享蓝桥杯比赛规划&#xff0c;好的规划会给我们的学习带来良好的收益&#xff0c;废话少说接下来就让我们进入学习规划吧&#xff0c;加油哦&#xff01;&#xff01;&#xff01; 一、…