Nick Chung gửi vào
- 16113 lượt xem
Ở 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 :
Giao tiếp với arduino Uno r3
Các bạn cần chuẩn bị :
- 1 Arduino uno R3 hoặc Arduino mega.
- 1 ic SRAM 23lc1024.
- 3 điện trở 10k ôm
- Mạch, máy hàn...
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.
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 >