IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103使用GPIO口模拟I2C通信源代码 -> 正文阅读

[嵌入式]STM32F103使用GPIO口模拟I2C通信源代码

由于STM32内部硬件I2C通讯时跑飞,因此使用STM32 GPIO口 模拟 I2C通信如下

AT24C02 测试

单片机:
STMF103C8T6
管脚 :	
GPIOB Pin6 ------ SCL
GPIOB Pin7 ------ SDA

使用时只需修改 RCC_APB2Periph_GPIOx;GPIOx; GPIO_Pin_x(SCL);GPIO_Pin_x (SDA) 即可将其移植
程序适配 STM32 标准库

#define AT24C02_RCC  RCC_APB2Periph_GPIOB
#define AT24C02_GPIO GPIOB
#define AT24C02_SCL  GPIO_Pin_6
#define AT24C02_SDA  GPIO_Pin_7

源代码链接:IIC_Protocol.c IIC_Protocol.h AT24C02.c AT24C02.h83/79460827

/**
  ******************************************************************************
  * @file    IIC_Protocol.c
  * @author  GuShangyi
  * @version V0.5.1
  * @data    6-February-2022
  * @brief   使用 GPIO 模拟 IIC 通讯,使用时参阅 IIC_Protocol.h
  ******************************************************************************
  * @log     适配AT24C02,未测试
  */
	
/* Includes ------------------------------------------------------------------*/
#include "IIC_Protocol.h"

/**
  * @brief  初始化使用 GPIO 模拟的 IIC 接口.
  * @param  IIC_RCC: IIC 使用的 GPIOx 时钟(x = A,B,C...)
  *         IIC_SCL: IIC 的 SCL 管脚
  *	        IIC_SDA: IIC 的 SDA 管脚
  *         *IIC_GPIO: 当前 GPIO
  * @retval None
  */
void IIC_Configuration(uint32_t IIC_RCC, uint16_t IIC_SCL, uint16_t IIC_SDA, GPIO_TypeDef *IIC_GPIO)
{
	/* 开启 IIC 相关时钟 */
	RCC_APB2PeriphClockCmd(IIC_RCC, ENABLE);
	/* 初始化 IIC 相关 GPIO */
	IIC_GPIO_Init(IIC_GPIO, IIC_SCL, IIC_SDA);
}

void IIC_GPIO_Init(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	/* 创建结构体 GPIO_InitStructure */
	GPIO_InitTypeDef GPIO_InitStructure; 
	/* 配置 IIC_SCL, IIC_SDA 为 50Mhz 通用推挽输出 */
	GPIO_InitStructure.GPIO_Pin = IIC_SCL | IIC_SDA; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(IIC_GPIO, &GPIO_InitStructure); 
	/* 配置 IIC_SCL, IIC_SDA 为低电平,防止意外写入 */
	GPIO_WriteBit(IIC_GPIO, IIC_SCL | IIC_SDA, (BitAction)LOW);
}

/**
  * @brief  配置 IIC GPIO 工作模式.
  * @param  *IIC_GPIO: 当前 GPIO
  *         IIC_PIN  : IIC 的 SCL 管脚或 SDA 管脚
  *	        GPIO_Mode: 当前管脚工作模式
  * @retval None
  */
void IIC_GPIO_Mode(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_PIN, GPIOMode_TypeDef GPIO_Mode)
{
	/* 创建结构体 GPIO_InitStructure */
	GPIO_InitTypeDef GPIO_InitStructure; 
	/* 配置 IIC_GPIO 工作模式 */
	GPIO_InitStructure.GPIO_Pin = IIC_PIN; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode; 
	GPIO_Init(IIC_GPIO, &GPIO_InitStructure); 
}

void IIC_Start(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	/* 配置 IIC_SDA 为输出 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_OUT);
	/* 写 IIC_START 时序 */
	IIC_Output(IIC_GPIO, IIC_SDA, HIGH);
	IIC_Output(IIC_GPIO, IIC_SCL, HIGH);
	Delay_us(2);
	IIC_Output(IIC_GPIO, IIC_SDA, LOW);
	IIC_Output(IIC_GPIO, IIC_SCL, LOW);
}

void IIC_Stop(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	/* 配置 IIC_SDA 为输出 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_OUT);
	/* 写 IIC_STOP 时序 */
	IIC_Output(IIC_GPIO, IIC_SDA, LOW);
	IIC_Output(IIC_GPIO, IIC_SCL, HIGH);
	Delay_us(2);
	IIC_Output(IIC_GPIO, IIC_SDA, HIGH);
	IIC_Output(IIC_GPIO, IIC_SCL, LOW);
	/* 连续写操作时间间隔 */
	Delay_us(5000);
}

void IIC_Transmit_Acknowledge(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	/* 配置 IIC_SDA 为输出 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_OUT);
	/* 写 IIC_TX_ACK 时序 */
	IIC_Output(IIC_GPIO, IIC_SCL, LOW);
	IIC_Output(IIC_GPIO, IIC_SDA, LOW);
	IIC_Output(IIC_GPIO, IIC_SDA, HIGH);
	Delay_us(2);
	IIC_Output(IIC_GPIO, IIC_SCL, LOW);
}

unsigned char IIC_Receive_Acknowledge(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	unsigned int n = 0;
	
	/* 配置 IIC_SDA 为输入 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_IN);
	/* 写 IIC_RX_ACK 时序 */
	IIC_Output(IIC_GPIO, IIC_SCL, HIGH);
	Delay_us(1);
	while(IIC_Input(IIC_GPIO, IIC_SDA) == HIGH)
	{
		Delay_us(1);
		n++;
		if(n > 20)
		{
			IIC_Stop(IIC_GPIO, IIC_SCL, IIC_SDA);
			return 1;
		}
	}
	IIC_Output(IIC_GPIO, IIC_SCL, LOW);
	return 0;
}

void IIC_Transmit_Byte(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA, unsigned char byte)
{
	unsigned char i;
	
	/* 配置 IIC_SDA 为输出 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_OUT);
	/* 发送一个字节 */
	for(i = 0; i < 8; i++)
	{
		IIC_Output(IIC_GPIO, IIC_SDA, ((byte & (0x80 >> i)) == (0x80 >> i)));
		IIC_Output(IIC_GPIO, IIC_SCL, LOW);
		Delay_us(1);
		IIC_Output(IIC_GPIO, IIC_SCL, HIGH);
		Delay_us(1);
		IIC_Output(IIC_GPIO, IIC_SCL, LOW);
	}
}

unsigned char IIC_Receive_Byte(GPIO_TypeDef *IIC_GPIO, uint16_t IIC_SCL, uint16_t IIC_SDA)
{
	unsigned char i;
	unsigned char data = 0;
	
	/* 配置 IIC_SDA 为输入 */
	IIC_GPIO_Mode(IIC_GPIO, IIC_SDA, IIC_IN);
	/* 接受一个字节 */
	for(i = 0; i < 8; i++)
	{
		IIC_Output(IIC_GPIO, IIC_SCL, LOW);
		IIC_Output(IIC_GPIO, IIC_SCL, HIGH);
		data = ((data * 2) |  IIC_Input(IIC_GPIO, IIC_SDA));
		IIC_Output(IIC_GPIO, IIC_SCL, LOW);
	}
	return data;
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:52:33  更:2022-02-07 13:54:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:41:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码