Nâng 128kbyte SRAM ngoài cho arduino với IC 23lc1024

Mô tả dự án: 

Ở bài trước, mình đã hướng dẫn các bạn nâng cấp 32kbyte SRAM cho arduino mega. Còn có 1 loại SRAM cực nhỏ gọn đang được ưa chuộng là 23lc1024 với dung lượng 128kbyte. Bài này mình sẽ hướng dẫn các bạn sử dụng nó với arduino. Đi nào...

Về ic SRAM 23lc1024.

Hình dáng và các kiểu đóng gói của IC

 

Sơ đồ chân của ic

 

Thông số quan trọng của SRAM 23lc1024 (hãng MicroChip)

  • Kiểu SRAM, công nghệ CMOS.
  • Điện áp nuôi : 2.5v đến 5.5v
  • Dòng tiêu thụ ở 5.5v-20mHz khi đọc : 3mA
  • Khi ngủ: 4uA.
  • Dung lượng bộ nhớ : 1Mbit (131k x8) với 32 trang.
  • Giao tiếp :SPI và SQI.
  • Nhiệt độ hoạt động : -40C đến +80C
  • Số chân 8 DIP.

Các lựa chọn khác

Có nhiều các lựa chọn về dung lượng ,chất lượng ,điện áp..: 23A512xx, 23A640xx, 23A1024xx, 23K256xx,23LC512xx, 23LC1024xx...

Thông số cho 1 vài loại nổi bât

Giao tiếp với MASTER

Lưu ý khi giao tiếp :

Ic 23lc1024 có  32 trang với 4096 bytes nhớ ,tổng cộng dung lượng là 131072 byte,  như vậy địa chỉ để ta lưu giá trị  chạy từ 0 đến 131071 .
 

http://ww1.microchip.com/downloads/en/AppNotes/01484A.pdf

Giao tiếp với arduino Uno r3

Các bạn cần chuẩn bị :

Sơ đồ kết nối với arduino UNO R3.

SRAM sẽ sử dụng cổng SPI để giao tiếp, trên arduino Uno r3, thứ tự các chân SPI (cứng) là :

  • Chân Sclock: pin 13
  • Chân MOSI (Master Output Slave Input): pin 12
  • Chân MISO: pin 11
  • Chân SS (Seclect Slave) : pin 10 hoặc tùy chọn

 

 

Như vậy sơ đồ kêt nối sẽ như sau :

 

Code giao tiếp :

 

Cũng giống như bao bộ nhớ khác, luôn có 2 hàm sơ khai là READ và WRITE 1byte dữ liệu. Dưới đây là code demo giao tiếp cho mạch trên:

Lưu ý nhỏ : CSPIN là pin chọn IC, bạn có thể sửa thành pin khác để phù hợp với dự án.!

#include <SPI.h>
//SRAM opcodes
// không sửa 4 mode này nếu không biết dùng.
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2

#define CSPIN 10

uint8_t Spi23LC1024Read8(uint32_t address)
{
    uint8_t read_byte;
    digitalWrite(CSPIN, LOW);
    SPI.transfer(READ);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    read_byte = SPI.transfer(0x00);
    digitalWrite(CSPIN, HIGH);

    return read_byte;
}

void Spi23LC1024Write8(uint32_t address, uint8_t data_byte)
{
    digitalWrite(CSPIN, LOW);
    SPI.transfer(WRITE);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    SPI.transfer(data_byte);
    digitalWrite(CSPIN, HIGH);
}

void setup(void)
{
    uint32_t i;
    uint8_t value;

    Serial.begin(9600);
    pinMode(CSPIN, OUTPUT);
    digitalWrite(CSPIN, HIGH);
    SPI.begin();

    for (i = 0; i < 32; i++) {
        Spi23LC1024Write8(i, (uint8_t)i);
    }

    for (i = 0; i < 32; i++) {
        value = Spi23LC1024Read8(i);
        Serial.println((uint16_t)value);
    }
}

void loop()
{
}

Kết quả

Giao tiếp với arduino MEGA

Cổng SPI trên arduino mega và uno khác nhau kiểu đánh số, cụ thể:

  • Chân Sclock: pin 52
  • Chân MOSI (Master Output Slave Input): pin 51
  • Chân MISO: pin 50
  • Chân SS (Seclect Slave): pin 53 hoặc tùy chọn

Bạn có thể xem qua ảnh này cho dễ nhìn:

Như vậy, sơ đồ nối sẽ như bên dưới:

Code giao tiếp

Tương nhự như code dùng cho 1 ic với arduino uno phía trên, Bạn sửa lại CSPIN thành 53 nhé !

Kết quả cũng tương tự như phía trên.

Ghép thêm nhiều IC SRAM.

Các Slave sẽ được nối song song chân SCK-SI-SO với nhau. 

Giao tiếp SPI cho phép bạn giao tiếp không giới hạn số lượng Slave, Khi lựa chọn 1 Slave bất kỳ, ta kéo chân kích hoạt Cs(SS) của Ic RAM đó xuống Low, chân CS(SS) của các ic khác sẽ kéo lên HIGH. Với cách này bạn sẽ có hàng Mbyte SRAM!

 

Code giao tiếp demo

#include <SPI.h>
//SRAM opcodes
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2

#define CSPIN_ic1 10
#define CSPIN_ic2 9

uint8_t Spi23LC1024Read8(uint32_t address, uint8_t CSPIN)
{
    uint8_t read_byte;
    digitalWrite(CSPIN, LOW); //chọn ic này
    SPI.transfer(READ);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    read_byte = SPI.transfer(0x00);
    digitalWrite(CSPIN, HIGH);

    return read_byte;
}

void Spi23LC1024Write8(uint32_t address, uint8_t data_byte, uint8_t CSPIN)
{
    digitalWrite(CSPIN, LOW); // chộn ic này
    SPI.transfer(WRITE);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    SPI.transfer(data_byte);
    digitalWrite(CSPIN, HIGH);
}

void setup(void)
{

    Serial.begin(9600);
    //thiết lập pin CS
    pinMode(CSPIN_ic1, OUTPUT);
    digitalWrite(CSPIN_ic1, HIGH);
    pinMode(CSPIN_ic2, OUTPUT);
    digitalWrite(CSPIN_ic2, HIGH);
    SPI.begin();

    Spi23LC1024Write8(0, 11, CSPIN_ic1); //ghi vào ic 1 giá trị 11 tại dịa chỉ 0
    Spi23LC1024Write8(0, 22, CSPIN_ic2); // ghi vào ic 2 giá trị  22 dịa chỉ 0

    uint8_t value_ic1 = Spi23LC1024Read8(0, CSPIN_ic1);
    uint8_t value_ic2 = Spi23LC1024Read8(0, CSPIN_ic2);
    Serial.print("Doc tu ic 1 : ");
    Serial.println(value_ic1);
    Serial.print("Doc tu ic 2 : ");
    Serial.println(value_ic2);
}

void loop()
{
}

Kết quả

Cách lưu số lớn hơn kiểu byte ( >255) vào eeprom và SRAM

Chúng ta còn có thể lưu 1 kiểu số bất kỳ như byte, long double, float, char ..vv vào RAM (hoặc EEPROM) bằng việc tách và ghép các byte lưu trữ .

Code tham khảo cho mạch arduino uno R3 sử dụng 1 ic SRAM.

#include <SPI.h>
//SRAM opcodes
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2

#define CSPIN 53

uint8_t Spi23LC1024Read8(uint32_t address)
{
    uint8_t read_byte;
    digitalWrite(CSPIN, LOW); //chọn ic này
    SPI.transfer(READ);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    read_byte = SPI.transfer(0x00);
    digitalWrite(CSPIN, HIGH);

    return read_byte;
}

void Spi23LC1024Write8(uint32_t address, uint8_t data_byte)
{
    digitalWrite(CSPIN, LOW); // chọn ic này
    SPI.transfer(WRITE);
    SPI.transfer((uint8_t)(address >> 16) & 0xff);
    SPI.transfer((uint8_t)(address >> 8) & 0xff);
    SPI.transfer((uint8_t)address);
    SPI.transfer(data_byte);
    digitalWrite(CSPIN, HIGH);
}
template <class T>
int RAM_WRITE(uint32_t adress, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    int i;
    for (i = 0; i < sizeof(value); i++)
        Spi23LC1024Write8(adress + i, *p++);
    return i;
}

template <class T>
int RAM_READ(uint32_t adress, T& value)
{
    byte* p = (byte*)(void*)&value;
    int i;
    for (i = 0; i < sizeof(value); i++)
        *p++ = Spi23LC1024Read8(adress + i);
    return i;
}

void setup()
{
    Serial.begin(9600);
    SPI.begin();
    //thiết lập pin CS
    pinMode(CSPIN, OUTPUT);
    digitalWrite(CSPIN, HIGH);
}
int INT = -1233, i = 0;
float FLOAT = 134.344, f = 0;
double DOUBLE = 123.966, d = 0;
long LONG = 123343545, l = 0;
byte BYTE = 93, b = 0;
char CHAR = 'g', c = 0;
//

void loop()
{
    delay(1000);

    //ghi
    RAM_WRITE(0, INT); //2 byte (ghi 2 ô :0,1)
    RAM_WRITE(2, FLOAT); //4 byte (ghi 4 ô: 2,3,4,5)
    RAM_WRITE(6, DOUBLE); //4 byte (ghi 4 ô: 6,7,8,9)
    RAM_WRITE(10, LONG); //4 byte(ghi 4 ô: 10 -> 13)
    RAM_WRITE(14, BYTE); //1 byte(ghi 1 ô:14)
    RAM_WRITE(15, CHAR); //1 byte(ghi 4 ô: 15)
    //đọc
    RAM_READ(0, i);
    RAM_READ(2, f);
    RAM_READ(6, d);
    RAM_READ(10, l);
    RAM_READ(14, b);
    RAM_READ(15, c);
    //in

    Serial.println(i);
    Serial.println(f, 5);
    Serial.println(d, 5);
    Serial.println(l);
    Serial.println(b);
    Serial.println(c);
    Serial.println("_____");
}

 

Kết quả :

Tạm kết.

Nếu như được chọn, tôi sẽ chọn IC Sram này cho mọi dự án cần sự nhỏ gọn mà không cần tốc độ quá cao. laughwink

Mình đã thử ic này trên nhiều board khác nhau : Arduino Uno, Mega, ESP8266, ESP32,.. tất cả đều ổn.

Việc mua ic này hiện tại rất hiếm ở Việt Nam, để viết được bài này, mình và  Admin cũng phải khá chật vật để đặt 3 con 23LC1024 về nghiên cứu, hy vọng sức mua của các bạn sẽ thúc đẩy số lượng bán SRAM này trong thời gian tới.

<Đừng quên nhấn like nhé các bạn >laughsmiley

lên
8 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Điều khiển 8 đèn LED qua wifi, sử dụng Arduino và ESP8266

Với mục đích giúp các bạn tiếp cận với các thiết bị IOT gần hơn. Hôm nay mình sẽ hướng dẫn các bạn viết chương trình điều khiển 8 LED qua mạng wifi. Và hơn thế nữa, nếu kết hợp với VPN hoặc mở port thì chúng ta có thể làm hơn thế nữa!

lên
43 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

ST7565 | Chuyển động trong lập trình Game và đồ họa | Phần 2

Trong bài viết trước, chúng ta đã cùng tìm hiểu một vài nguyên tắc của hiệu ứng chuyển động trong đồ họa. Bài viết này sẽ nối tiếp nội dung còn dở dang của bài trước, hãy cùng đi tiếp nào. Tất nhiên là trên arduino cùng lcd st7565 rồi.cheekyblush

lên
8 thành viên đã đánh giá bài viết này hữu ích.

AVR-Xuất xung với tần số và độ rộng theo ý muốn

Tiếp tục chuỗi bài: Điều khiển pin bằng ngôn ngữ chính thống. 

Bài viết này sẽ giúp bạn tạo một xung PWM có tần số và độ rộng xung theo ý muốn. 

lên
19 thành viên đã đánh giá bài viết này hữu ích.