上篇针对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(读取)。
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);
}
}
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);
}
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);
}
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;
}
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();
}
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可以接上去看看I2C是否正确,地址会显示0x50是正常的因为最低位是R/W,实际地址为 1 0 1 0 0 0 0!
可以确定一下在写入每一笔资料时是ACK(也就是SDA = 0),而读取资料是NACK(也就是SDA = 1)。
大家好,我是一名菜鸟工程师,这篇文章用来记录我工作遇到的需求及解决方式,如果有更好的解决方式,也欢迎...
容器组件 在网页开发的过程里,我们习惯会使用div作为一个容器,因为在 html 语意上它是不特别代...
Types of Color Video Signals Component video 主要作为单...
Kerberos基於对称密钥加密技术,并且需要受信任的第三方,并且可以选择在身份验证的某些阶段使用公...
负载平衡 API 最基本遇到的问题是如果使用者越来越多的时候 一台 Server 一定无法满足这些负...