ArduinoAT24C02详解读写地址位
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通信,默认发送⼀个停⽌位 */
dTransmission();
}
/* 描述: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通信,发送⼀个开始位(即重发码) */
write的返回值
ret = dTransmission(false);
/* 4. 开始⼀次读取,设置I2C器件地址,读取AT24C02⼀个字节 */
/
* 5. 读出AT24C02返回的值,成功读取后写⼊缓存变量处,读取失败返回失败码 */
while(!Wire.available())
{
t--;
delay(1);
if(t ==0)
{
return1;
}
}
*data_wr= ad();// receive a byte as character
return ret;
}
void setup(){
/* 初始化串⼝波特率为115200 */
Serial.begin(115200);
digitalWrite(LED_BUILTIN, LOW);//板⼦led,作为观察数据发射状态
pinMode(button,INPUT);
digitalWrite(button,HIGH);
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的16进制这个地址⽽不是1010 0000的16进制0xA0呢?
解析:如果CPU读设备,那么读设备地址 = 设备地址 <<1.所以,0x50左移移位就变成了0xA01源码函数
C:\Users\Administrator\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility
void twi_setAddress(uint8_t address)
{
// set twi slave address (skip over TWGCE bit)
TWAR = address <<1;
}
原理图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
下⾯的AT24C02的地址,只适⽤于Arduino 平台开发时使⽤,才对应的上,移位底层函数在封装的时候,会将这个地址左移移⼀位,具体看上⾯的原函数,这⼀点刚刚开始也让我很困惑,当查看原函数的时候,才发现原因。
根据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引脚没有连接,可以连接到地。
第⼆阶段,写数据地址位。
就⽐如送快递,将物品送⼊到某个⼩区单元还不够,你还要知道具体到,某个单元⾥的某⼀栋的门牌号,也就是具体到存储的地址位。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。