玩转X-CTR100 l STM32F4 l AT24C02 EEPROM存储

我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

本文介绍X-CTR100控制器 板载EEPROM存储芯片AT24C02的使用,EEPROM常用于参数存储,系统掉电后也可以保存数据。

对比FLASH容量小,但是具有更高的擦写寿命。

原理

AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。


管脚名称


功能


A0、A1、A2


器件地址选择


SDA


串行数据、地址


SCL


串行时钟


WP


写保护


VCC


+1.8V~6.0V工作电压


VSS


例程

本例程实现单字节读写功能和连续字节读写功能。

硬件说明

硬件资源:

  • 串口UART1
  • 板载资源AT24C02

硬件连接:

X-CTR100设计有EEPROM芯片AT24C02,与MPU6050公用IIC2接口,地址引脚连接到GND。

软件生态

X-SOFT软件生态,X-API文件如下。

ax_at24c02.c——X-CTR100 板载 AT24C02 EEPROM 存储源文件

ax_at24c02.h——X-CTR100 板载 AT24C02 EEPROM 存储头文件

操作函数如下:


void AX_AT24C02_Init(void); //AT24C02初始化

void AX_AT24C02_Write(uint8_t *pbuf, uint8_t addr, uint8_t num); //AT24C02指定地址写入指定长度的数据

void AX_AT24C02_Read(uint8_t *pbuf, uint8_t addr, uint8_t num); //AT24C02指定地址读出指定长度的数据

void AX_AT24C02_WriteOneByte(uint8_t addr, uint8_t data); //AT24C02指定地址写入一个字节

uint8_t AX_AT24C02_ReadOneByte(uint8_t addr); //AT24C02指定地址读取一个字节

软件说明

本例程首先AT24C02初始化。然后进行单字节读写测试,分别向地址10、11、12写入数据,并读出数据显示,对比写入和读出的数据是否相同。然后进行多字节连续读写测试,向地址0写入字符串,并读出显示,对比写入和读出内容是否相同。主程序代码如下。


int main(void)

{

uint8_t tmp[3];

uint8_t str[] = { "X-CTR100 EEPROM TEST" };

uint8_t str1[sizeof(str)];

/* X-CTR100初始化 */

AX_Init(115200);

printf("***X-CTR100 EEPROM AT24C02读写例程***\r\n\r\n");

//模块初始化及配置

AX_AT24C02_Init();

//X-API测试:单字节读写测试

printf("*单字节读写测试\r\n");

AX_AT24C02_WriteOneByte(10, 10); //地址10 写入10

AX_AT24C02_WriteOneByte(11, 20); //地址11 写入20

AX_AT24C02_WriteOneByte(12, 30); //地址12 写入30

tmp[0] = AX_AT24C02_ReadOneByte(10); //从地址10读出数据

tmp[1] = AX_AT24C02_ReadOneByte(11); //从地址11读出数据

tmp[2] = AX_AT24C02_ReadOneByte(12); //从地址12读出数据

printf("*地址10 11 12 写入数据:10 20 30\r\n");

printf("*地址10 11 12 读出数据:%d %d %d\r\n\r\n", tmp[0], tmp[1], tmp[2]);

//X-API测试:连续读写测试

printf("*连续读写测试\r\n");

AX_AT24C02_Write(str, 0, sizeof(str)); //地址0 写入 str

AX_AT24C02_Read(str1, 0, sizeof(str));      //地址0 读出数据到 str1

printf("*地址0 写入数据:%s\r\n", str);

printf("*地址0 读出数据:%s\r\n", str1);

while (1)

{

AX_Delayms(1000);

AX_LEDG_Toggle();

}

}

实现效果

上电复位后,运行效果如下图所示。

原文地址:https://www.cnblogs.com/xtark/p/9413017.html

时间: 2024-10-09 00:12:33

玩转X-CTR100 l STM32F4 l AT24C02 EEPROM存储的相关文章

linux下使用math.h头文件-l与-L参数

遇到一个问题就是,c语言用到sqrt时,明明已包含math.h文件,却仍提示未定义,所以上网招答案的: gcc -lm 以下转自http://bbs.csdn.net/topics/330105678 ·-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供

ls | wc -l 与 ls -l | wc -l 的区别

注明:我的执行环境是unix 执行ls,结果如下 执行ls -l,结果 如下 执行ls|wc -l,结果如下 执行ls -l|wc -l,结果如下 从上面执行情况可以看出,ls|wc -l与ls -l|wc -l的区别就是wc -l|wc -l多了显示total的一行. ls|wc -l的结果是文件个数,ls -l|wc -l的结果是文件个数+1.

[].slice.call(k).filter(function(l) { return l != 0 });

[].slice.call(k).filter(function(l) { return l != 0 }); 将类数组调用数组方法. 原文地址:https://www.cnblogs.com/gaidalou/p/8479639.html

数据结构顺序表中Sqlist *L,&L,Sqlist *&L

//定义顺序表L的结构体 2 typedef struct 3 { 4 Elemtype data[MaxSize]: 5 int length; 6 }SqList; 7 8 //建立顺序表 9 void CreateList(SqList * &L,ElemType a[ ],int n) 10 { 11 int i; 12 L = (SqList * )malloc(sizeof(SqList)); 13 for(i = 0 ; i < n ; i++) 14 L->data[i

ps命令实用方法.ps -l ps -L详解

一.统计sleep状态的进程. c233 plugins # ps -elf|head -1F S UID     PID   PPID C PRI   NI       ADDR SZ   WCHAN STIME TTY TIME   CMD4 S root 28149  4204    0 80     0             -       16283 poll_s    Jul05 ? 00:00:00 sshd: root c233 plugins # ps -efl|awk '$

GCC中 -I、-L、-l 选项的作用

在makefile中经常会看到这些选项,gcc默认会在程序当前目录.path路径中查找所需要的材料 如何给gcc添加我们自己的原材料(头文件,库等) -I (注意是大写的i) 给gcc添加自定义的头文件的路径 例如:我的头文件目录是myinclude -Imyinclude -L 给gcc添加额外的搜索库的路径 例如 :有一个库A所在的路径是目录B -LB -l(小写的L) 给gcc 指定具体的库 例如:gcc需要一个库A -lA 整体举例: CC=g++ CFLAGS=-g BIN=main

线性表—顺序存储结构 Get Elem(L,i,*e)

写的不标准,改了改勉强过了.. #include <stdio.h>#include <stdlib.h>#define MAXSIZE 20#define OK 1#define ERROR 0#define TRUE 1#define FALS 0typedef  int Status;typedef int ElemType;typedef struct    {        ElemType data[MAXSIZE];        int length;    }Sq

排序算法----基数排序(RadixSort(L))单链表智能版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

排序算法----基数排序(RadixSort(L,max))单链表版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,