Arduino AT24C02详解读写地址位
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino AT24C02详解读写地址位相关的知识,希望对你有一定的参考价值。
AT24C02详解读写地址位
如果光看AT24C02的文档,很抽象,难弄懂。结合程序和实际通讯波形;来描述。
- 购买回来默认是接
GND
的,所以安装上AT24C02芯片后地址就是:0xA0
示例程序(写入一个字符为例来展开讲解)
/*
* Wire库I2C基本读写程序
* AT24C02读写操作
*
*/
#include <Wire.h> // 使用Wire库,需要包含头文件
const int16_t I2C_ADDR = 0x50; // AT24C02的IIC器件地址0x50,这个地址可以通过I2C扫描程序搜索到。
#define button 7
bool buttonState = true;
/* 描述:AT24C02写入一个字节函数
* 参数:date_wr: 要写入的值
* WriteAddr: 要写入的地址
* 返回值:通信成功:0
* 通信失败:1->数据溢出 2->发送addtess时从机接受到NACK
* 3->发送数据时接受到NACK 4->其他错误
*/
uint8_t at24c02_write(char data_wr, uint8_t WriteAddr)
/* 1. 开始一次传输,设置I2C器件地址 */
Wire.beginTransmission(I2C_ADDR);
/* 2. 需要写入的位置 */
Wire.write(WriteAddr);
/* 3. 需要写入的值 */
Wire.write(data_wr);
/* 4. 完成一次I2C通信,默认发送一个停止位 */
return Wire.endTransmission();
/* 描述:AT24C02读取一个字节函数
* 参数:date_wr: 要读出值的存放指针
* WriteAddr: 要读出的地址
* 返回值:通信成功:0
* 通信失败:1->数据溢出 2->发送address时从机接受到NACK
* 3->发送数据时接受到NACK 4->未接受到数据 5->其他
*/
uint8_t at24c02_read(char *data_wr, uint8_t ReadAddr)
uint8_t t = 200;
uint8_t ret = 0;
/* 1. 开始一次传输,设置I2C器件地址 */
Wire.beginTransmission(I2C_ADDR);
/* 2. 需要读出的位置 */
Wire.write(ReadAddr);
/* 3. 完成一次I2C通信,发送一个开始位(即重发码) */
ret = Wire.endTransmission(false);
/* 4. 开始一次读取,设置I2C器件地址,读取AT24C02一个字节 */
Wire.requestFrom(I2C_ADDR, 1);
/* 5. 读出AT24C02返回的值,成功读取后写入缓存变量处,读取失败返回失败码 */
while (!Wire.available())
t--;
delay(1);
if(t == 0)
return 1;
*data_wr= Wire.read(); // receive a byte as character
return ret;
void setup()
/* 初始化串口波特率为115200 */
Serial.begin(115200);
digitalWrite(LED_BUILTIN, LOW);//板子led,作为观察数据发射状态
pinMode(button,INPUT);
digitalWrite(button,HIGH);
/* 初始化IIC接口,不写入地址则默认为主设备 */
Wire.begin();
void loop()
buttonState = digitalRead(button);
if(buttonState == LOW)
delay(250);
if(buttonState == LOW)
char str0 = 'H';
uint8_t Write = at24c02_write(str0, 0);
Serial.println("Trigger!!!");
Serial.println(Write);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(2000);
// char*str2;
// uint8_t Read = at24c02_read(str2,0);
// Serial.println(*str2);Serial.println(Read);
IIC通讯讲解
要想硬件之间建立通讯,需要知道对方的地址。
就像打电话,打电话前,你必须知道对方的电话号码才行。
- 确定访问AT24C02的硬件地址(AT24C02手册)
代码上面定义AT24C02的硬件信息填写:
const int16_t I2C_ADDR = 0x50;// AT24C02的IIC器件地址0x50,这个地址可以通过
为什么是0x50这个地址呢?
0x50
转换成2进制就是1010 0000
==解析:前面的(高位MSB)1010
没得解释了,官方资料就是定死了的,没法改变,A2,A1,A0,为什么说是自定义呢?这个要根据电路原理图的设计来确定这3个自定义位。
- 原理图1,将
A2
,A1
,A0
都接GND,那么自定义的地址位就都是000
,加上第八位确定读写位,如果是读就是1
,写就是0
,本实例演示的是写数据,那就是确定要写,那么就是0
,所以地址就是1010 0000
,转换为16进制就是0xA0
- 示波器捕获到单片机和AT24C02通讯时的波形,紫色代表
SDA
,黄色代表SCL
对应代码:
/* 1. 开始一次传输,设置I2C器件地址 */
Wire.beginTransmission(I2C_ADDR);
- 如果你想挂载8个AT24C02器件,可以根据以下来连接,各器件IIC地址:
0x50 - 0x57
- 根据A2,A1,A0,不同的组合,我们可以确定一条总线上可以挂载多少个AT24C02,从而不会导致地址重复或者冲突。最多挂载8个:
有道翻译:
设备/页地址(A2、A1和A0): A2、A1和A0引脚是设备地址输入
它们是AT24C02的硬线。8个2K设备可以在一个总线系统上寻址
(设备寻址将在设备寻址部分详细讨论)。
AT24C04使用A2和A1输入进行硬线寻址,总共有4个4K设备
在一个单一的总线系统上被处理。A0引脚是无连接的,可以连接到GND。
AT24C08只使用A2输入进行硬线寻址,总共有两个8K设备
在一个单一的总线系统上寻址。A0和A1引脚没有连接,可以连接
GND。
AT24C16不使用设备地址引脚,这限制了总线上单个设备的数量
。A0、A1和A2引脚没有连接,可以连接到地。
第二阶段,写数据地址位。
就比如送快递,将物品送入到某个小区单元还不够,你还要知道具体到,某个单元里的某一栋的门牌号,也就是具体到存储的地址位。
/* 2. 需要写入的位置 */
Wire.write(WriteAddr);
第三阶段,将具体的数据写入到地址位中去,才算完成。
Wire.write(data_wr);
/* 4. 完成一次I2C通信,默认发送一个停止位 */
以上是关于Arduino AT24C02详解读写地址位的主要内容,如果未能解决你的问题,请参考以下文章
Arduino UNO向AT24C02写入数据IIC完整通讯过程详解