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)
{
}
}