Mục lục:

Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino: 5 bước
Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino: 5 bước

Video: Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino: 5 bước

Video: Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino: 5 bước
Video: Vi điều khiển | VDK Bài 5 (p2): Viết chương trình ghi dữ liệu vào bộ nhớ EEPROM bằng ngôn ngữ C 2024, Tháng bảy
Anonim
Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino
Đọc và ghi dữ liệu vào EEPROM bên ngoài bằng Arduino

EEPROM là viết tắt của Electrically Erasable Programmable Read-Only Memory.

EEPROM rất quan trọng và hữu ích vì nó là một dạng bộ nhớ không bay hơi. Điều này có nghĩa là ngay cả khi bo mạch tắt nguồn, chip EEPROM vẫn giữ lại chương trình đã được ghi vào nó. Vì vậy, khi bạn tắt nguồn bo mạch rồi bật lại, chương trình đã được ghi vào EEPROM có thể chạy được. Vì vậy, về cơ bản, EEPROM lưu trữ và chạy một chương trình không có vấn đề gì. Điều này có nghĩa là bạn có thể tắt một thiết bị, giữ nó trong 3 ngày và quay lại và bật nó lên và nó vẫn có thể chạy chương trình đã được lập trình trong đó. Đây là cách hoạt động của hầu hết các thiết bị điện tử tiêu dùng.

Dự án này được tài trợ bởi LCSC. Tôi đã và đang sử dụng các thành phần điện tử từ LCSC.com. LCSC cam kết cung cấp nhiều lựa chọn linh kiện điện tử chính hãng, chất lượng cao với mức giá tốt nhất với mạng lưới vận chuyển toàn cầu đến hơn 200 quốc gia. Đăng ký ngay hôm nay và được giảm giá $ 8 cho đơn hàng đầu tiên của bạn.

EEPROM cũng rất hiệu quả ở chỗ các byte riêng lẻ trong EEPROM truyền thống có thể được đọc, xóa và viết lại một cách độc lập. Trong hầu hết các loại bộ nhớ không bay hơi khác, điều này không thể thực hiện được. Các thiết bị EEPROM nối tiếp như EEPROM 24-series của Microchip cho phép bạn thêm nhiều bộ nhớ hơn vào bất kỳ thiết bị nào có thể nói I²C.

Quân nhu

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. Tinh thể 16 MHz
  4. Breadboard
  5. Điện trở 4,7k Ohm x 2
  6. Tụ điện 22 pF x 2

Bước 1: Khái niệm cơ bản về EEPROM

Khái niệm cơ bản về EEPROM
Khái niệm cơ bản về EEPROM

Có thể mua chip Microchip 24LC2512 trong gói DIP 8 chân. Các chân trên 24LC512 khá thẳng và bao gồm nguồn (8), GND (4), chống ghi (7), SCL / SDA (6, 5) và ba chân địa chỉ (1, 2, 3).

Lược sử về ROM

Các máy tính loại "Chương trình được Lưu trữ" ban đầu - chẳng hạn như máy tính bàn và máy thông dịch bàn phím - đã bắt đầu sử dụng ROM dưới dạng ROM Ma trận Diode. Đây là một bộ nhớ được tạo thành từ các điốt bán dẫn rời rạc được đặt trên một PCB được tổ chức đặc biệt. Điều này đã nhường chỗ cho ROM Mask với sự ra đời của các mạch tích hợp. Mask ROM rất giống ROM Diode Matrix chỉ khác là nó được triển khai ở quy mô nhỏ hơn nhiều. Tuy nhiên, điều này có nghĩa là bạn không thể chỉ di chuyển một vài điốt xung quanh bằng mỏ hàn và lập trình lại nó. Mask ROM phải được lập trình bởi nhà sản xuất và sau đó không thể thay đổi được.

Thật không may, Mask ROM rất đắt và mất nhiều thời gian để sản xuất vì mỗi chương trình mới yêu cầu một thiết bị hoàn toàn mới do xưởng đúc sản xuất. Tuy nhiên, vào năm 1956, vấn đề này đã được giải quyết với việc phát minh ra PROM (ROM có thể lập trình) cho phép các nhà phát triển tự lập trình các chip. Điều đó có nghĩa là các nhà sản xuất có thể sản xuất hàng triệu thiết bị không được lập trình giống nhau để làm cho nó rẻ hơn và thiết thực hơn. Tuy nhiên, PROM chỉ có thể được ghi một lần bằng thiết bị lập trình điện áp cao. Sau khi thiết bị PROM được lập trình, không có cách nào để đưa thiết bị về trạng thái chưa được lập trình.

Điều này đã thay đổi vào năm 1971 với việc phát minh ra EPROM (Erasable Programmable ROM) - bên cạnh việc thêm một chữ cái khác vào từ viết tắt - mang lại cho nó khả năng xóa thiết bị và đưa nó về trạng thái "trống" bằng cách sử dụng nguồn sáng UV mạnh. Đúng vậy, bạn phải chiếu đèn sáng vào IC để lập trình lại nó, điều đó thật tuyệt phải không? Chà, hóa ra nó khá tuyệt trừ khi bạn là một nhà phát triển đang làm việc trên phần sụn, trong trường hợp đó bạn thực sự muốn có thể lập trình lại thiết bị bằng các tín hiệu điện. Điều này cuối cùng đã trở thành hiện thực vào năm 1983 với sự phát triển của EEPROM (Electrically Erasable Programmable ROM) và cùng với đó, chúng ta đi đến từ viết tắt thông dụng ngày nay.

Bước 2: Những điều kỳ lạ của EEPROM

Có hai nhược điểm lớn đối với EEPROM là một phương pháp lưu trữ dữ liệu. Trong hầu hết các ứng dụng, ưu điểm vượt trội hơn nhược điểm, nhưng bạn nên biết chúng trước khi kết hợp EEPROM vào thiết kế tiếp theo của mình.

Trước hết, công nghệ làm cho EEPROM hoạt động cũng giới hạn số lần nó có thể được ghi lại. Điều này liên quan đến việc các điện tử bị mắc kẹt trong các bóng bán dẫn tạo nên ROM và tích tụ cho đến khi không thể nhận ra được sự chênh lệch điện tích giữa "1" và "0". Nhưng đừng lo lắng, hầu hết các EEPROM đều có số lần ghi lại tối đa là 1 triệu hoặc hơn. Miễn là bạn không liên tục ghi vào EEPROM, bạn không chắc sẽ đạt mức tối đa này. Thứ hai, EEPROM sẽ không bị xóa nếu bạn loại bỏ nguồn điện khỏi nó, nhưng nó sẽ không giữ dữ liệu của bạn vô thời hạn. Các điện tử có thể trôi ra khỏi bóng bán dẫn và xuyên qua chất cách điện, xóa EEPROM một cách hiệu quả theo thời gian. Điều đó nói rằng, điều này thường xảy ra trong suốt nhiều năm (mặc dù nó có thể được tăng tốc bởi nhiệt). Hầu hết các nhà sản xuất nói rằng dữ liệu của bạn an toàn trên EEPROM từ 10 năm trở lên ở nhiệt độ phòng. Và có một điều nữa bạn cần lưu ý khi chọn thiết bị EEPROM cho dự án của mình. Dung lượng EEPROM được đo bằng bit chứ không phải byte. Một EEPROM 512K sẽ chứa 512Kbit dữ liệu, nói cách khác, chỉ 64KB.

Bước 3: Kết nối phần cứng Arduino

Kết nối phần cứng Arduino
Kết nối phần cứng Arduino
Kết nối phần cứng Arduino
Kết nối phần cứng Arduino

Được rồi, bây giờ chúng ta đã biết EEPROM là gì, hãy cùng tìm hiểu và xem nó có thể làm được những gì! Để thiết bị của chúng ta kết nối được, chúng ta cần kết nối nguồn điện cũng như các đường nối tiếp I²C. Đặc biệt, thiết bị này chạy ở 5VDC, vì vậy chúng tôi sẽ kết nối nó với đầu ra 5V của Arduino UNO của chúng tôi. Ngoài ra, các đường I²C sẽ cần điện trở kéo lên để giao tiếp diễn ra chính xác. Giá trị của các điện trở này phụ thuộc vào điện dung của đường dây và tần số bạn muốn giao tiếp với nó, nhưng một nguyên tắc chung cho các ứng dụng không quan trọng là chỉ giữ nó trong phạm vi kΩ. Trong ví dụ này, chúng tôi sẽ sử dụng điện trở kéo lên 4,7kΩ.

Có ba chân trên thiết bị này để chọn địa chỉ I²C, bằng cách này, bạn có thể có nhiều EEPROM trên bus và định địa chỉ chúng theo cách khác nhau. Bạn chỉ có thể nối đất tất cả chúng, nhưng chúng tôi sẽ nối dây chúng để chúng tôi có thể đưa vào thiết bị có dung lượng cao hơn trong phần sau của hướng dẫn.

Chúng tôi sẽ sử dụng một breadboard để kết nối mọi thứ với nhau. Sơ đồ dưới đây cho thấy kết nối chính xác cho hầu hết các thiết bị EEPROM I²C, bao gồm cả EEPROM dòng Microchip 24 mà chúng tôi bán.

Bước 4: Đọc và Viết

Hầu hết khi sử dụng EEPROM kết hợp với vi điều khiển, bạn sẽ không thực sự cần xem tất cả nội dung của bộ nhớ cùng một lúc. Bạn sẽ chỉ đọc và ghi các byte ở đây và ở đó khi cần thiết. Tuy nhiên, trong ví dụ này, chúng ta sẽ ghi toàn bộ tệp vào EEPROM và sau đó đọc lại tất cả để chúng ta có thể xem nó trên máy tính của mình. Điều này sẽ giúp chúng tôi cảm thấy thoải mái với ý tưởng sử dụng EEPROM và cũng cho chúng tôi cảm giác về lượng dữ liệu có thể thực sự phù hợp trên một thiết bị nhỏ.

Viết vài thứ

Bản phác thảo ví dụ của chúng tôi sẽ chỉ đơn giản là lấy bất kỳ byte nào đi qua cổng nối tiếp và ghi nó vào EEPROM, theo dõi số byte mà chúng tôi đã ghi vào bộ nhớ.

Việc ghi một byte bộ nhớ vào EEPROM thường diễn ra theo ba bước:

  1. Gửi Byte quan trọng nhất của địa chỉ bộ nhớ mà bạn muốn ghi vào.
  2. Gửi Byte quan trọng nhất của địa chỉ bộ nhớ mà bạn muốn ghi vào.
  3. Gửi byte dữ liệu mà bạn muốn lưu trữ tại vị trí này.

Có thể có một vài từ chính ở đó giải thích rõ ràng:

Địa chỉ bộ nhớ

Nếu bạn tưởng tượng tất cả các byte trong EEPROM 512 Kbit đứng trên một dòng từ 0 đến 64000 - bởi vì có 8 bit đến một byte và do đó bạn có thể vừa với 64000 byte trên EEPROM 512 Kbit - thì địa chỉ bộ nhớ là vị trí trong dòng nơi bạn sẽ tìm thấy một byte cụ thể. Chúng ta cần gửi địa chỉ đó tới EEPROM để nó biết nơi đặt byte mà chúng ta đang gửi.

Số byte quan trọng nhất và ít byte quan trọng nhất

Bởi vì có 32000 vị trí có thể có trong một EEPROM 256 Kbit - và vì 255 là số lớn nhất mà bạn có thể mã hóa trong một byte - nên chúng tôi cần gửi địa chỉ này trong hai byte. Đầu tiên, chúng tôi gửi Byte quan trọng nhất (MSB) - 8 bit đầu tiên trong trường hợp này. Sau đó, chúng tôi gửi Byte ít quan trọng nhất (LSB) - 8 bit thứ hai. Tại sao? Bởi vì đây là cách thiết bị mong đợi nhận được chúng, vậy thôi.

Viết trang

Viết một byte tại một thời điểm là tốt, nhưng hầu hết các thiết bị EEPROM có một thứ gọi là "bộ đệm ghi trang" cho phép bạn ghi nhiều byte cùng một lúc giống như cách bạn làm với một byte. Chúng tôi sẽ tận dụng điều này trong bản phác thảo ví dụ của chúng tôi. EEPROM sử dụng bộ đếm bên trong tự động tăng vị trí bộ nhớ với mỗi byte dữ liệu sau mà nó nhận được. Khi một địa chỉ bộ nhớ đã được gửi đi, chúng tôi có thể theo dõi nó với tối đa 64 byte dữ liệu. EEPROM giả định (đúng) rằng một địa chỉ 312 theo sau là 10 byte sẽ ghi lại byte 0 ở địa chỉ 312, byte 1 ở địa chỉ 313, byte 2 ở địa chỉ 314, v.v.

Đọc một cái gì đó

Việc đọc từ EEPROM về cơ bản tuân theo quy trình ba bước tương tự như khi ghi vào EEPROM:

  1. Gửi Byte quan trọng nhất của địa chỉ bộ nhớ mà bạn muốn ghi vào.
  2. Gửi Byte quan trọng nhất của địa chỉ bộ nhớ mà bạn muốn ghi vào.
  3. Yêu cầu byte dữ liệu tại vị trí đó.

Bước 5: Sơ đồ và mã

Sơ đồ và mã
Sơ đồ và mã

Mã số:

#bao gồm

#define eeprom 0x50 // xác định địa chỉ cơ sở của EEPROM

void setup () {

Wire.begin (); // tạo một đối tượng Wire

Serial.begin (9600);

địa chỉ int không dấu = 0; // địa chỉ đầu tiên của EEPROM

Serial.println ("Chúng tôi viết mã zip 22222, một mã zip"); for (address = 0; address <5; address ++) writeEEPROM (eeprom, address, '2'); // Ghi 22222 vào EEPROM

for (address = 0; address <5; address ++) {Serial.print (readEEPROM (eeprom, address), HEX); }}

void loop () {

/ * không có gì trong hàm loop () bởi vì chúng tôi không muốn arduino lặp đi lặp lại cùng một thứ vào EEPROM. Chúng tôi chỉ muốn ghi một lần, vì vậy hàm loop () không được sử dụng với các EEPROM. * /}

// định nghĩa hàm writeEEPROM

void writeEEPROM (int deviceaddress, unsigned int eeaddress, byte data) {Wire.beginTransmission (deviceaddress); Wire.write ((int) (eeaddress >> 8)); // ghi MSB Wire.write ((int) (eeaddress & 0xFF)); // ghi LSB Wire.write (dữ liệu); Wire.endTransmission (); }

// định nghĩa hàm readEEPROM

byte readEEPROM (int deviceaddress, unsigned int eeaddress) {byte rdata = 0xFF; Wire.beginTransmission (địa chỉ thiết bị); Wire.write ((int) (eeaddress >> 8)); // ghi MSB Wire.write ((int) (eeaddress & 0xFF)); // ghi LSB Wire.endTransmission (); Wire.requestFrom (địa chỉ thiết bị, 1); if (Wire.available ()) rdata = Wire.read (); trả về rdata; }

Đề xuất: