IIC_STM32F1_AT24C02实验:IO模拟IIC模块(2)

该文详细介绍了如何使用STM32F1系列单片机通过GPIO模拟IIC协议与AT24C02EEPROM进行通信,包括硬件连接、IIC空闲、起始、停止状态的实现,以及应答、非应答、数据传输的逻辑函数。代码已通过测试,适用于基于Cortex-M3内核的STM32F1系列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IIC(集成电路总线)-STM32F1系列-AT24C02-简易实验开发详细流程(个人总结)

基于正点原子代码的个人改编,本篇(IIC实验)共3个章节。
注:本博客无盈利行为,真诚希望能帮助到大家!如有错误,还请指正!

IIC_STM32F1_AT24C02实验:IO模拟IIC模块(2)

1.在写程序之前需要弄清楚三个问题,是什么?为什么?怎么做?

IIC是什么?为什么要使用IIC通信?

IIC_STM32F1_AT24C02实验:IIC介绍(1)

怎么写GPIO端口模拟IIC模块?

第一步:认识硬件图接线

外扩EEPROM,型号AT24C02
STM32F103ZET6单片机
这里的 AT24C02 存储器模块(EEPROM:带电可擦可编程只读存储器)就相当于是从机设备,STM32 单片机就相当于主机设备。

注:因为是利用 IO 口模拟 IIC 通信,所以选取任意正常可用的 IO口 都可行,例如 GPIOA~GPIOG,这里选用 PB6 和 PB7 仅是因为 AT24C02 外接模块挂载在了这两个IO端口上。

第二步:根据需求编写模块化代码(一般在F1系列单片机上是通用的-基于Cortex-ARM3内核)

1.创建 iic.h 用户头文件

/*
* 基于 ST 官方固件库编程
* 通用 GPIO 模拟 IIC 模块
* 程序员:贬道
*/

#ifndef IIC_H
#define IIC_H

#include "stm32f10x.h"

void IIC_Idle(void);	// 空闲状态
void IIC_Start(void);	// 起始状态
void IIC_Stop(void);	// 停止状态

#endif

2.创建 iic.c 头文件

#include "iic.h"

void IIC_Idle(void){
   
}

void IIC_Start(void){
   
}

void IIC_Stop(void){
   
}

3.根据 IIC 时序图编写通信的基础实现功能(本文的代码都已通过测试)

(1)首先编写空闲状态,即初始化并配置 IIC。

iic.c 文件

#include "iic.h"
#include "delay.h"	// 滴答定时器延时模块


/**************************************/
void SCL_HIGH(void){
   
	GPIO_SetBits(GPIOB, GPIO_Pin_6);
}

void SCL_LOW(void){
   
	GPIO_ResetBits(GPIOB, GPIO_Pin_6);
}
/**************************************/

/**********************************************************************************/
GPIO_InitTypeDef GPIO_InitStruct_SDA;	// SDA 配置结构体变量

void SDA_IN(void){
   
	GPIO_InitStruct_SDA.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct_SDA.GPIO_Mode = GPIO_Mode_IN_FLOATING;	// 浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStruct_SDA);
}

void SDA_OUT(void){
   
	GPIO_InitStruct_SDA.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct_SDA.GPIO_Mode = GPIO_Mode_Out_PP;		// 通用推挽输出
	GPIO_InitStruct_SDA.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct_SDA);
}

void SDA_HIGH(void){
   
	GPIO_SetBits(GPIOB, GPIO_Pin_7);
}

void SDA_LOW(void){
   
	GPIO_ResetBits(GPIOB, GPIO_Pin_7);
}

u8 READ_SDA(void){
   
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
}
/**********************************************************************************/


/************************************************************************************/
// IIC 空闲状态:两条线都为高电平
void IIC_Idle(void){
   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	// SCL 时钟线配置
	GPIO_InitTypeDef GPIO_InitStruct_SCL;
	GPIO_InitStruct_SCL.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct_SCL.GPIO_Mode = GPIO_Mode_Out_PP;		// 通用推挽输出
	GPIO_InitStruct_SCL.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct_SCL);
	
	SCL_HIGH();		// 空闲时拉高 SCL
	
	SDA_OUT();
	SDA_HIGH();		// 空闲时拉高 SDA
}

void IIC_Start(void){
   
}

void IIC_Stop(void){
   
}
/************************************************************************************/

iic.h 文件

/*
* 基于 ST 官方固件库编程
* 通用 GPIO 模拟 IIC 模块
* 程序员:贬道
*/

#ifndef IIC_H
#define IIC_H

#include "stm32f10x.h"

// SCL 时钟线
/*************************************************************/
void SCL_HIGH(void);	// SCL 输出高电平
void SCL_LOW(void);		// 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值