STM32-17 I²C EEPROM

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

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

AT24C256BL476RGVCC5VGndGndSCLPB6SDAPB7A0xA1xA2xWDx

照上方的接法地址会变成(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);elseHAL_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);elseHAL_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)。
http://img2.58codes.com/2024/201463252D7lvZGNXO.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章