【蓝桥杯嵌入式】四、各种外设驱动(十)I2C通信和可编程电阻的操作

本文详细介绍了在蓝桥杯嵌入式竞赛中,如何进行I2C需求分析、选择合适的驱动程序、配置软件以及实现I2C通信功能,包括使用I2C初始化、读写操作和与外设M24C02和MCP4017的交互。
摘要由CSDN通过智能技术生成

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录

【蓝桥杯嵌入式】附录

目录

重点提炼:

理论知识:

一、需求分析

1、需要的外设资源分析:

 2、外设具体分析:

二、软件配置

三、程序功能实现

用到的函数:

程序流程:

在MDK中编写代码:

四、运行测试


重点提炼:

I2C不用配置CUbeMX,只使用比赛提供的驱动程序即可。

I2C驱动函数:用到的函数:

读写套路:在MDK中编写代码:

理论知识:

一、需求分析

        设计一个示例,将I2C驱动程序中的函数全部使用一遍,实现全部可能用到的功能。

1、需要的外设资源分析:

  • I2C占用PB6和PB7,在驱动程序中有配置,无需自己配置。
  • 板载存储芯片M24C02

 2、外设具体分析:

查看原理图,和手册:

原理图:

 手册:

根据手册,可知:

24C02的地址范围为:0~255

可编程电阻的设置范围为:0~127

二、软件配置

参考附录的内容,建立名为“I2C_Demo”的项目。

按照附录创建一个空项目,无需做配置;

生成项目文件后,打开MDK;

导入iic驱动程序文件;

导入LCD驱动程序文件,编译。

三、程序功能实现

用到的函数:

I2C驱动函数:(有些提供的函数名不同,但功能相同)

void I2CInit(void);        //I2C初始化

//24C02的相关代码
void iic_24c02_write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum);
void iic_24c02_read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum);

//MCP4017的相关代码
void write_resistor(uint8_t value);
uint8_t read_resistor(void);

程序流程:

  1. 在初始化HAL库后初始化LCD,之前实验发现中断可能会影响LCD初始化;
  2. 初始化I2C;
  3. 读取原始信息并显示;
  4. 写一些信息到存储芯片,设置可编程电阻的值;
  5. 从存储芯片读取信息,读取可编程电阻的设置,并在LCD上显示;
  6. 改变值,循环4.5.

在MDK中编写代码:

 在main.h中 

/* USER CODE BEGIN Includes */
#include "lcd.h"
#include <stdio.h>
/* USER CODE END Includes */

main.c 的 /* USER CODE BEGIN WHILE */ 代码段,编写以下代码

  /* USER CODE BEGIN WHILE */
	I2CInit();
	char wBuf[5]={0};        //写数据缓冲区
	char rBuf[5]={0};        //读数据缓冲区
	char lcdStr[20]={0};     //LCD显示缓冲区
	
	int num=0;               //写入芯片的数值
	uint8_t RES_4017=0;      //设置的阻值,<=127
	
	//读取芯片值
	iic_24c02_read(rBuf,1,5);    //在芯片的1区,写5个单位数据rBuf
    
    //在LCD上显示
	sprintf(lcdStr, "Ori Read = %s",rBuf);
	LCD_DisplayStringLine(Line1, lcdStr);
	
	//读电阻设置值
	RES_4017=read_resistor();
    
    //在LCD上显示
	sprintf(lcdStr, "Ori Resistor = %3d",RES_4017);
	LCD_DisplayStringLine(Line5, lcdStr);


  while (1)
  {
		//写入操作的套路
		sprintf(wBuf,"%d",num);       //复制数据,并将类型转换为cahr*
		iic_24c02_write(wBuf,1,5);    //在芯片的1区,写5个单位数据rBuf
		HAL_Delay(5);                 //存储芯片的写入操作需要时间,这里必须等一下
		
		//写电阻设置值
		write_resistor(num);
		
		iic_24c02_read(rBuf,1,5);
		sprintf(lcdStr, "Now Read =  %s",rBuf);
		LCD_DisplayStringLine(Line3, lcdStr);
		
		RES_4017=read_resistor();
		sprintf(lcdStr, "Now Resistor = %3d",RES_4017);
		LCD_DisplayStringLine(Line7, lcdStr);
		
		num++;
		HAL_Delay(50);
    /* USER CODE END WHILE */

四、运行测试

编译、下载(见附录)。

运行结果如下:

“I2C_Demo”

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值