STM32写入和读取AT24C02(字符串)

STM32写入和读取AT24C02(字符串)


我的理解是,EEPROM就相当于单片机的固态硬盘。不知道这样理解合不合适。昨天搞定了IIC通讯协议,所以今天就写了AT24C02的两个函数:写入字符串和读取字符串

代码中涉及MyI2C.h,这个文件在这篇博客中提到。

代码如下:

AT24C02.h:

#ifndef __AT24C02_H__
#define __AT24C02_H__

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"

#define Slave_Addr_W        0xA0


void AT24C02_Init(void);
void AT24C02_Send_String(char*String, u8 String_Addr);
void AT24C02_Read_String(char* String, u8 String_Addr);


#endif

AT24C02.c:

#include "AT24C02.h"


/**
  * @brief      AT24C02初始化函数
  * @param      无
  * @retval 	无
  */
void AT24C02_Init(void)
{
	IIC_Init();
}


/**
  * @brief      STM32以参数二指定的地址位首地址,向AT24C02写
					入参数一的字符串(函数内部自动添加'\0'标志位)
  * @param      String         要写入的字符串
  * @retval 	String_Addr    要写入的字符串在AT24C02中的首地址
  */
void AT24C02_Send_String(char String[], u8 String_Addr)
{
	u8 i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		IIC_Send_OneByte_to_Slave(Slave_Addr_W, String_Addr+i, String[i]);
	}
	IIC_Send_OneByte_to_Slave(Slave_Addr_W, String_Addr+i, '\0');
}


/**
  * @brief      STM32以参数二指定的地址为首地址,读取AT24C02的字符串,
					把该字符串写入参数一指定的字符数组中
  * @param      String         要写入的字符串
  * @retval 	String_Addr    要写入的字符串在AT24C02中的首地址
  */
void AT24C02_Read_String(char* String, u8 String_Addr)
{
	u8 i;
	for(i=0;IIC_Read_OneByte_From_Slave(Slave_Addr_W, String_Addr+i)!='\0';i++)
	{
		String[i]=IIC_Read_OneByte_From_Slave(Slave_Addr_W, String_Addr+i);
	}
	//String[i]='\0';这一句经过测试可以不写,这也符合在给字符数组赋值的时候
	//C语言编译器会自动在结尾添加'\0'的这一个规则
}

main:

#include "stm32f10x.h"
#include "Serial.h"
#include "AT24C02.h"

char String[100];

int main(void)
{
	Serial_Init();
	AT24C02_Init();
	
	AT24C02_Send_String("I am a GuiStar !", 0x01);
	AT24C02_Read_String(String,0x01);
	printf("%s\r\n",String);
	
	while(1) 
	{
	}
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32中使用页读取AT24C02存储器的数据,可以提高读取速度和效率。以下是一个简单的示例代码,可以读取AT24C02存储器中指定地址处的一个字节的数据: ``` #include "stm32f10x.h" #include "stm32f10x_i2c.h" #define I2C_SPEED 400000 #define I2C_TIMEOUT 1000 #define DEVICE_ADDRESS 0xA0 #define PAGE_SIZE 8 #define PAGE_MASK 0x07 int main(void) { uint8_t data = 0; I2C_InitTypeDef i2c; // 初始化I2C RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_DutyCycle = I2C_DutyCycle_2; i2c.I2C_OwnAddress1 = 0; i2c.I2C_Ack = I2C_Ack_Enable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; i2c.I2C_ClockSpeed = I2C_SPEED; I2C_Init(I2C1, &i2c); I2C_Cmd(I2C1, ENABLE); // 页读取数据 I2C_GenerateSTART(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {} I2C_Send7bitAddress(I2C1, DEVICE_ADDRESS, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {} I2C_SendData(I2C1, 0x00); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) {} I2C_GenerateSTART(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {} I2C_Send7bitAddress(I2C1, DEVICE_ADDRESS, I2C_Direction_Receiver); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) {} data = I2C_ReceiveData(I2C1); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {} data = I2C_ReceiveData(I2C1); while(1); } ``` 在示例代码中,首先定义了I2C通信的速度为400kHz,超时时间为1秒。定义了AT24C02存储器的I2C地址为0xA0。定义了页大小为8字节,页掩码为0x07。在主函数中,首先初始化I2C通信,并发送起始信号和器件地址。然后发送要读取的起始地址0x00,并再次发送起始信号和器件地址。接着,使用I2C_ReceiveData()函数读取AT24C02存储器中指定地址处的数据,并关闭应答位。最后发送停止信号,等待数据接收完成。 需要注意的是,在使用页读取AT24C02存储器时,需要将要读取的数据地址按页大小对齐,即地址最后三位为0,否则会读取到错误的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiStar_李什么恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值