17. STM32-I²C EEPROM

上篇针对AT24C256B DataSheet当中的地址以及功能说明,这一篇会使用STM32去对EEPROM做写入与读取。

首先先看一下接线的部分(x :不用接)

AT24C256B L476RG
VCC 5V
Gnd Gnd
SCL PB6
SDA PB7
A0 x
A1 x
A2 x
WD x

照上方的接法地址会变成(1 0 1 0 0 0 0 R/W ),这时就可以知道写入与读取的设备地址拉,分别是0XA0(写入)与0XA1(读取)。


程序

  • I2C Start :
void I2C_Start()
{
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, SET);
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, SET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, RESET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, RESET);
	HAL_Delay(1);
}
}
  • I2C Stop :
void I2C_Stop()
{
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, RESET);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, SET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, SET);
}
  • I2C_Write
void I2C_WriteByte(unsigned char dat)
{
	unsigned char i = 0;
	for(i=0;i<8;i++)
	{
		//HAL_GPIO_WritePin(GPIOB, SCL_Pin, 0);
		if(dat & 0x80)
			HAL_GPIO_WritePin(GPIOB,SDA_Pin ,1);
		else
			HAL_GPIO_WritePin(GPIOB, SDA_Pin, 0);
		HAL_GPIO_WritePin(GPIOB, SCL_Pin, 1);
		dat<<=1;
		HAL_GPIO_WritePin(GPIOB, SCL_Pin, 0);
	}
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, 0);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, 0);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, 1);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, 0);
}
  • I2C_Read
unsigned char I2C_ReadByte(int ACK)
{
	unsigned char dat = 0, i = 0;
	for(i = 0; i < 8; i++)
	{
		HAL_GPIO_WritePin(GPIOB, SCL_Pin, 1);
		dat<<=1;
		if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3)==1)
		{
			dat |= 0x01;
		}
		//HAL_GPIO_WritePin(GPIOB, SCL_Pin, 1);
		HAL_GPIO_WritePin(GPIOB, SCL_Pin, 0);
	}
	if(ACK == 1)
		HAL_GPIO_WritePin(GPIOB, SDA_Pin, 0);
	else
		HAL_GPIO_WritePin(GPIOB, SDA_Pin, 1);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, SET);
	HAL_GPIO_WritePin(GPIOB, SCL_Pin, RESET);
	HAL_GPIO_WritePin(GPIOB, SDA_Pin, RESET);
	return dat;
}

AT24C256B 函数

  • AT24C256_Write
void At24c256_Write(unsigned char Paddr,unsigned char Waddr, unsigned char dat)
{
	I2C_Start();
	I2C_WriteByte(0xA0);
	HAL_Delay(1);
	I2C_WriteByte(Paddr);
	HAL_Delay(1);
	I2C_WriteByte(Waddr);
	HAL_Delay(1);
	I2C_WriteByte(dat);
	HAL_Delay(1);
	I2C_Stop();
}
  • AT24C256_Read
unsigned char At24c256_Read(unsigned char Paddr ,unsigned char Addr)
{
	unsigned char dat = 0;
	I2C_Start();
	I2C_WriteByte(0xA0);
	HAL_Delay(1);
	I2C_WriteByte(Paddr);
	HAL_Delay(1);
	I2C_WriteByte(Addr);
	I2C_Start();
	I2C_WriteByte(0xA1);
	HAL_Delay(1);
	dat = I2C_ReadByte(0);
	HAL_Delay(1);
	I2C_Stop();
	return dat;
}

LA分析

手边有LA可以接上去看看I2C是否正确,地址会显示0x50是正常的因为最低位是R/W,实际地址为 1 0 1 0 0 0 0!
可以确定一下在写入每一笔资料时是ACK(也就是SDA = 0),而读取资料是NACK(也就是SDA = 1)。
https://ithelp.ithome.com.tw/upload/images/20220321/201463252D7lvZGNXO.png


<<:  【CSS】【Bootstrap】关於order

>>:  如何用笔电内建镜头制作即时监控网站

[教学] ASP NET Core将HighChart图片插入到Word中并提供下载

大家好,我是一名菜鸟工程师,这篇文章用来记录我工作遇到的需求及解决方式,如果有更好的解决方式,也欢迎...

Flutter体验 Day 14-容器组件

容器组件 在网页开发的过程里,我们习惯会使用div作为一个容器,因为在 html 语意上它是不特别代...

笔记-Basics of Video

Types of Color Video Signals Component video 主要作为单...

身份验证服务交换(The Authentication Service (AS) Exchange)

Kerberos基於对称密钥加密技术,并且需要受信任的第三方,并且可以选择在身份验证的某些阶段使用公...

Day14-Load Balance

负载平衡 API 最基本遇到的问题是如果使用者越来越多的时候 一台 Server 一定无法满足这些负...