第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑤IIC调试24C02、MCP4017

目录

0.前言

1.功能要求

电路原理图

2.STM32Cubemx初始化

3.程序实现

main.c相关初始化

24C02

M24CO2_Read读数据

M24CO2_Write写数据

MCP4017

MCP4017_Read读数据

MCP4017_Write写数据

4.工程文件


0.前言

这套教程针对于蓝桥杯嵌入式比赛的底层模块调试,针对于比赛进行每个模块的调试,低层模块调试好,对于赛题的实现就会方便很多,虽然有一些应试教育的意味,不过准备这个比赛对于程序整体实现思维还是有着很大帮助,我也从中受益颇多!

1.功能要求

使用官方提供的底层驱动代码i2c_hal.c、i2c_hal.h文件中的函数编写EEPROM:24C02存储器的读写操作以及MCP4017可编程电阻的阻值的写入和读取。(本教程侧重于功能的实现,对原理的讲解较少,请谅解,后续如果有机会会在返回补充)

电路原理图

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑤IIC调试24C02、MCP4017_第1张图片

2.STM32Cubemx初始化

 与上一讲相同④,无需改动

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑤IIC调试24C02、MCP4017_第2张图片

3.程序实现

首先将赛场提供的底层驱动代码i2c_hal.c、i2c_hal.h添加到自己的工程文件中(本操作为Keil的基本操作,不在赘述),并在main.c中添加头文件

/*main.c*/

#include "i2c_hal.h"

main.c相关初始化

 main.c中创建MCP相关变量

/*main.c*/

uint16_t MCP_tt=0;//MCP写入计时标志位
uint16_t MCP_Ref=0;//MCP写入标志位
uint16_t MCP_Out=0;//MCP写入的值

 Task_Time()函数扩充,以执行定时读取ADC值(移步②,查看该函数)

/*main.c*/

void Task_Time(void)
{
	if(++Key_tt==10)	{Key_tt=0;Key_Ref=1;}//按键扫描计时
	if(++Lcd_tt==200)	{Lcd_tt=0;Lcd_Ref=1;}//LCD刷新计时
	if(++ADC_tt==300)	{ADC_tt=0;ADC_Ref=1;}//ADC读取计时
	if(++MCP_tt==200)	{MCP_tt=0;MCP_Ref=1;}//MCP写入计时
}

主循环中添加判断程序(MCP4017_Write(uint16_t info)之后会讲到)

/*main.c*/ 

 while (1)
  {
	if(MCP_Ref==1)
	{
		MCP_Ref=0;//清除标志位
		MCP4017_Write(MCP_Out);
	}
  }

 对IIC进行初始化(主循环之前)

/*main.c*/

I2CInit();

24C02

在i2c_hal.c中编写以下函数,并在i2c_hal.h中声明(详细函数解释在注释中)

/*i2c_hal.h*/

uint16_t M24CO2_Read(uint16_t address);
void M24CO2_Write(uint16_t address,uint16_t info);
uint16_t MCP4017_Read(void);
void MCP4017_Write(uint16_t info);

M24CO2_Read读数据

该函数实现对M24C02的地址address位置内存值的读取

/*i2c_hal.c*/

uint16_t M24CO2_Read(uint16_t address)
{
	uint16_t val;
	I2CStart();//开启IIC
	
	I2CSendByte(0xa0);//发送写数据信号
	I2CWaitAck();//等待响应
	
	I2CSendByte(address);//发送地址
	I2CWaitAck();
	I2CStop();//停止IIC
	
	I2CStart();
	I2CSendByte(0xa1);//发送读数据信号
	I2CWaitAck();
	val=I2CReceiveByte();//读取数据
	I2CStop();
	
	return val;
	
}

M24CO2_Write写数据

该函数实现对M24C02的地址address位置内存值的写入,写入值为info

/*i2c_hal.c*/

void M24CO2_Write(uint16_t address,uint16_t info)
{
	I2CStart();//开启IIC
	
	I2CSendByte(0xa0);//发送写数据信号
	I2CWaitAck();//等待响应
	
	I2CSendByte(address);//发送地址
	I2CWaitAck();
	
	I2CSendByte(info);//发送要写的数据
	I2CWaitAck();
	
	I2CStop();//停止IIC
}

MCP4017

在i2c_hal.c中编写以下函数,并在i2c_hal.h中声明

MCP4017_Read读数据

读取此时MCP4017的值

/*i2c_hal.c*/

uint16_t MCP4017_Read(void)
{
	uint16_t val;
	
	I2CStart();//开启IIC
	I2CSendByte(0x5f);//发送读数据信号
	I2CWaitAck();//等待响应
	
	val=I2CReceiveByte();//读取数据
	I2CStop();//停止IIC
	
	return val;

}

MCP4017_Write写数据

写入MCP4017的值

/*i2c_hal.c*/

void MCP4017_Write(uint16_t info)
{
	I2CStart();//开启IIC
	I2CSendByte(0x5e);//发送写数据信号
	I2CWaitAck();//等待响应
	
	I2CSendByte(info);//发送要写的数据
	I2CWaitAck();
	
	I2CStop();//停止IIC
}

注:以上调用的函数均定义在文件i2c_hal.c、i2c_hal.h中

/*i2c_hal.h*/

void I2CStart(void);
void I2CStop(void);
unsigned char I2CWaitAck(void);
void I2CSendByte(unsigned char cSendByte);
unsigned char I2CReceiveByte(void);
void I2CInit(void);

在Task.c中声明外部变量,即可改变MCP4017电阻值了

/*Task.c*/

extern uint16_t MCP_Out;//MCP写入的值

4.工程文件

该工程文件为全10讲所有内容,可以作为参考,不过还是希望读者能够自己手敲一遍,加深记忆

链接:https://pan.baidu.com/s/1LcNszc7_oHWvXcucCezlxg?pwd=hw07 
提取码:hw07

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑤IIC调试24C02、MCP4017_第3张图片

 

 自己做的笔记,也希望能对你有帮助!

你可能感兴趣的:(蓝桥杯,嵌入式硬件,stm32,单片机)