Arduino与Proteus仿真实例-I2C总线多个M24C01设备数据储存仿真

I2C总线多个M24C01设备数据储存仿真

I2C 总线是一种非常流行且功能强大的总线,用于主机(或多个主机)与单个或多个从设备之间的通信。 下图说明了有多少不同的外设可以共享仅通过 2 条线连接到处理器的总线,这是 I2C 总线与其他接口相比可以提供的最大优势之一。

在这里插入图片描述

本次实例将实现4个M24C01串行(I2C)EEPROM设备连接到I2C总线上,进行单独控制数据存取。

在前面的文章中,对I2C以及M24C01设备驱动进行了详细介绍,请参考:

1、仿真电路原理图

在这里插入图片描述

开关SW2分别对四个M24C01设备进行选择,按键Read和Write分别对设备进行数据读写操作。

2、仿真代码实现

本次实例使用了如下开源库:

演示代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <Eeprom24C01\_02.h>
#define EEPROM\_ADDRESS\_1 0x50
#define EEPROM\_ADDRESS\_2 0x51
#define EEPROM\_ADDRESS\_3 0x52
#define EEPROM\_ADDRESS\_4 0x53
int readPin = 2;
int writePin = 3;
int eepromSelectPin1 = 4;
int eepromSelectPin2 = 5;
int eepromSelectPin3 = 6;
int eepromSelectPin4 = 7;
int selectPin = -1;
uint8\_t counts1 = 1;
uint8\_t counts2 = 1;
uint8\_t counts3 = 1;
uint8\_t counts4 = 1;
byte readState;
byte writeState;

static Eeprom24C01_02 eeprom1(EEPROM_ADDRESS_1);
static Eeprom24C01_02 eeprom2(EEPROM_ADDRESS_2);
static Eeprom24C01_02 eeprom3(EEPROM_ADDRESS_3);
static Eeprom24C01_02 eeprom4(EEPROM_ADDRESS_4);

void read\_interrupt(){
readState = 1;
}

void write\_interrupt(){
writeState = 1;
}

void setup(){
pinMode(readPin,INPUT);
pinMode(writePin,INPUT);
pinMode(eepromSelectPin1,INPUT);
pinMode(eepromSelectPin2,INPUT);
pinMode(eepromSelectPin3,INPUT);
pinMode(eepromSelectPin4,INPUT);
// 绑定中断
attachInterrupt(digitalPinToInterrupt(readPin),read_interrupt,RISING);
attachInterrupt(digitalPinToInterrupt(writePin),write_interrupt,RISING);

Serial.begin(9600);

// 设备初始化
eeprom1.initialize();
eeprom2.initialize();
eeprom3.initialize();
eeprom4.initialize();
Serial.println("\*\*\*\*EEPROM 24C01 \*\*\*\*");
}

void loop(){
// 第一个设备读写
if(digitalRead(eepromSelectPin1) == HIGH){
if(readState){
int value = eeprom1.readByte(0);
Serial.print("read device 1:");
Serial.print(value);
Serial.println();
readState = 0;
}

if(writeState){
Serial.print("write device 1:");
Serial.print(counts1);
Serial.println();
eeprom1.writeByte(0, counts1);
counts1++;
writeState = 0;
}
}

// 第二个设备读写
if(digitalRead(eepromSelectPin2) == HIGH){
if(readState){
int value = eeprom2.readByte(0);
Serial.print("read device 2:");
Serial.print(value);
Serial.println();
readState = 0;
}

if(writeState){
Serial.print("write device 2:");
Serial.print(counts2);
Serial.println();
eeprom2.writeByte(0, counts2);
counts2++;
writeState = 0;
}
}

// 第三个设备读写
if(digitalRead(eepromSelectPin3) == HIGH){
if(readState){
int value = eeprom3.readByte(0);
Serial.print("read device 3:");
Serial.print(value);
Serial.println();
readState = 0;
}

if(writeState){
Serial.print("write device 3:");
Serial.print(counts3);
Serial.println();
eeprom3.writeByte(0, counts3);
counts3++;
writeState = 0;
}
}

// 第四个设备读写
if(digitalRead(eepromSelectPin4) == HIGH){
if(readState){
int value = eeprom4.readByte(0);
Serial.print("read device 4:");
Serial.print(value);
Serial.println();
readState = 0;
}

if(writeState){
Serial.print("write device 4:");
Serial.print(counts4);
Serial.println();
eeprom4.writeByte(0, counts4);
counts4++;
writeState = 0;
}
}
}

3、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/121048548