IIC(集成电路总线)-STM32F1系列-AT24C02-简易实验开发详细流程(个人总结)
基于正点原子代码的个人改编,本篇(IIC实验)共3个章节。
注:本博客无盈利行为,真诚希望能帮助到大家!如有错误,还请指正!
IIC_STM32F1_AT24C02实验:IO模拟IIC模块(2)
1.在写程序之前需要弄清楚三个问题,是什么?为什么?怎么做?
IIC是什么?为什么要使用IIC通信?
IIC_STM32F1_AT24C02实验:IIC介绍(1)
怎么写GPIO端口模拟IIC模块?
第一步:认识硬件图接线
这里的 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); //