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
28 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

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 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

Hẳn là các bạn ít nhiều cũng đã từng có một tuổi thơ dữ dội cùng với trò xếp gạch, xe tăng trên các máy chơi game đen trắng cầm tay, phá đảo thế giới ảo cùng với Contra, Super Mario, MUblushlaugh…Và khi lớn lên, chúng ta lại thích thú trong việc làm sao để tạo ra các chuyển động như vậy, nói đúng hơn là làm game.enlightenedcoolBài viết này sẽ giúp bạn hiểu hơn cách tạo ra các hiệu ứng chuyển động hình ảnh trong lập trình đồ họa nói chung và game nói riêng. Tất nhiên là bằng board mạch Arduino cùng với LCD ST7565.

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

Bài 2: Kiểm chứng tốc độ khi điều khiển các pin bằng ngôn ngữ AVR so với các lệnh trên Arduino

Arduino dùng chip AVR, nếu điều khiển arduino bằng ngôn ngữ tiêu chuẩn của chip AVR thì tốc độ có thể nhanh hơn 12 lần so với cách dùng lệnh digitalWrite, nhanh hơn 4 lần so với lệnh digitalRead, nhanh 14 hơn lần so với analogRead, nhanh 10 hơn lần so với pinMode… thậm chí cách biệt còn xa hơn nữa. Điều này rất rất quan trọng. Cùng khám phá nào..

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