STM32学习笔记5:I2C的应用

1.设备硬件

一个STM32F407ZGT6开发板
一个ST-LINK V2烧录器
一个CH340串口模块
一个AT24C16存储器模块
若干杜邦线(母对母)

2.设备软件

STM32CubeMX
keil μVision5
串口调试工具ATK-XCOM

3.CubeMX设计

1.创建工程

打开STM32CubeMX,点击下图所指的按钮进入创建工程界面。
在这里插入图片描述
按照下图指示选择单片机型号进行创建项目。
在这里插入图片描述

2.配置参数

配置时钟

在这里插入图片描述
在这里插入图片描述

配置烧录器模式

在这里插入图片描述

配置I2C1

在这里插入图片描述

串口配置

在这里插入图片描述

项目管理配置

在这里插入图片描述
勾选下图的位置是为了更好查看.c/.h文件,勾选完就可以生成代码
在这里插入图片描述
点击生成后弹出以下窗口选择图中所指的按钮,打开项目
在这里插入图片描述

4.keil5代码设计

注意:所有代码均需要在USER CODE BEGINUSER CODE END之间进行写入否则下次修改CubeMX的配置时会在更新代码的时候删除不在该区域之间的代码。
在以下函数内中均需要添加头文件为以下代码块

#include <stdio.h>

main.c

在main()中的while循环外进行写入以下代码

testAT24C16();

usart.c

添加以下函数在该文件中,以便使用串口打印内容

int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
	return ch;
}

i2c.h

void testAT24C16(void);

i2c.c

#define ADDR_AT24C16_Write 0xA0
#define ADDR_AT24C16_Read 0xA1
uint8_t I2C_Buffer_Write[256];
uint8_t I2C_Buffer_Read[256];
void testAT24C16()//向AT24C16写入15个数值并从其中读取这些数值
{
	int i;
	printf("\r\n***********STM32CubeMX I2C AT24C16 Example**********");
	printf("\r\n I2C Write Buffer:\r\n");
	for(i=0;i<15;i++)
	{
		I2C_Buffer_Write[i] = i;
		printf("%02X ",I2C_Buffer_Write[i]);
	}
	
	//write data to AT24C16
	for(i=0;i<15;i++)
	{
		if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,i,I2C_MEMADD_SIZE_8BIT,&I2C_Buffer_Write[i],sizeof(I2C_Buffer_Write[i]),1000)==HAL_OK)
		{
			printf("\r\n%2d write success!!",I2C_Buffer_Write[i]);
		}
		else
		{
			printf("\r\n%2d write failed!!",I2C_Buffer_Write[i]);
		}
	}
	//read data from AT24C16
	printf("\r\n Reading from AT24C16:\r\n");
	HAL_I2C_Mem_Read(&hi2c1,ADDR_AT24C16_Read,0,I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,15,1000);
	for(i=0;i<15;i++)
	{
		printf("0x%02X  ",I2C_Buffer_Read[i]);	
	}
}

//I2C_ByteWriteData I2C单字节写入函数
//参数列表
//Mem_Address 	存储地址
//*pData 		存储数据
void I2C_ByteWriteData(uint16_t Mem_Address,uint8_t pData)
{
	if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,Mem_Address,I2C_MEMADD_SIZE_8BIT,&pData,sizeof(pData),1000)==HAL_OK)
		{
			printf("\r\n%2d write success!!",pData);
		}
		else
		{
			printf("\r\n%2d write failed!!",pData);
		}
}
//I2C_BytesWriteData I2C多字节写入函数
//参数列表
//Mem_Address 	存储地址
//*pData 		存储数据
//Data_Size   	数据长度
void I2C_BytesWriteData(uint16_t Mem_Address,uint8_t *pData,uint16_t Data_Size)
{
	int i;
	if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,Mem_Address,I2C_MEMADD_SIZE_8BIT,pData,Data_Size,1000)==HAL_OK)
	{
		for(i = Mem_Address;i<Data_Size;i++)
		{
			printf("%2d success write to %2d address",pData[i-Mem_Address],i);
		}
	}
	else
	{
		printf("\r\n%2d write failed!!",*pData);
	}
}
//I2C_ReadData I2C I2C读取函数
//参数列表
//Mem_Address 		存储地址
//*pData 			存储数据
//Data_Size  		数据长度
void I2C_ReadData(uint16_t Mem_Address,uint8_t *pData,uint16_t Data_Size)
{
	HAL_I2C_Mem_Read(&hi2c1,ADDR_AT24C16_Read,Mem_Address,I2C_MEMADD_SIZE_8BIT,pData,Data_Size,1000);
}

5.成果展示

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值