温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录
目录
重点提炼:
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);
程序流程:
- 在初始化HAL库后初始化LCD,之前实验发现中断可能会影响LCD初始化;
- 初始化I2C;
- 读取原始信息并显示;
- 写一些信息到存储芯片,设置可编程电阻的值;
- 从存储芯片读取信息,读取可编程电阻的设置,并在LCD上显示;
- 改变值,循环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”