Library to drive the Microchip 23K256 SRAM over SPI.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
romilly
Date:
Sun Aug 15 13:06:52 2010 +0000
Parent:
1:28eb43851e6e
Child:
3:d2314b1ac797
Commit message:
created a library.

Changed in this revision

Ser23K256.cpp Show annotated file Show diff for this revision Revisions of this file
Ser23K256.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ser23K256.cpp	Sun Aug 15 13:06:52 2010 +0000
@@ -0,0 +1,91 @@
+// Ser23K256 - drive the Microchip 23K256 SRAM using SPI
+// Copyright (c) 2010 Romilly Cocking
+// Released under the MIT License: http://mbed.org/license/mit
+
+// 23K256 data sheet at http://ww1.microchip.com/downloads/en/DeviceDoc/22100B.pdf
+
+// Page-mode commands have not been implemented; I have found no need for them yet.
+
+// Assumes spi mode is default (8,0).
+
+// You can clock the 23K256 at up to 20MHz, so it supports the mbed's maximum SPI frequency of 12MHz.
+
+#include "mbed.h"
+#include "Ser23K256.h"
+
+Ser23K256::Ser23K256(SPI& spi, PinName ncs) : _spi(spi), _ncs(ncs)  {
+    deselect();
+}
+
+void Ser23K256::select() {
+    _ncs = 0;
+}
+
+void Ser23K256::deselect() {
+    _ncs = 1;
+}
+
+void Ser23K256::writeStatus(char status) {
+    select();
+    _spi.write(WRITE_STATUS);
+    _spi.write(status);
+    deselect();
+}
+
+char Ser23K256::readStatus() {
+    select();
+    _spi.write(READ_STATUS);
+    char result = (char) _spi.write(0);
+    deselect();
+    return result;
+}
+
+void Ser23K256::prepareCommand(char command, int address) {
+    select();
+    _spi.write(command);
+    _spi.write(address >> 8);
+    _spi.write(address & 0xFF);
+}
+
+// write or read a single byte
+
+void Ser23K256::write(int address, char byte) {
+    prepareCommand(WRITE, address);
+    _spi.write(byte);
+    deselect();
+}
+
+char Ser23K256::read(int address) {
+    prepareCommand(READ, address);
+    int result = _spi.write(0);
+    deselect();
+    return (char) result;
+}
+
+// buffered write and read
+
+/*
+* the single-byte read and write assume the 23K256 is in its default byte-mode
+* so sequential-model commands must switch the chip into sequential mode
+* at the start and return it to byte mode at the end.
+*/
+
+void Ser23K256::write(int address, char * buffer, int count) {
+    writeStatus(SEQUENTIAL_MODE);
+    prepareCommand(WRITE, address);
+    for (int i = 0; i < count; i++) {
+        _spi.write(buffer[i]);
+    }
+    deselect();
+    writeStatus(BYTE_MODE);
+}
+
+void Ser23K256::read(int address, char * buffer, int count) {
+    writeStatus(SEQUENTIAL_MODE);
+    prepareCommand(READ, address);
+    for (int i = 0; i < count; i++) {
+        buffer[i] = _spi.write(0);
+    }
+    deselect();
+    writeStatus(BYTE_MODE);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ser23K256.h	Sun Aug 15 13:06:52 2010 +0000
@@ -0,0 +1,37 @@
+// Ser23K256 - drive the Microchip 23K256 SRAM using SPI
+// Copyright (c) 2010 Romilly Cocking
+// Released under the MIT License: http://mbed.org/license/mit
+
+#include "mbed.h"
+
+#ifndef  SER23K256_H
+#define  SER23K256_H
+
+// mode codes for 23K256
+#define BYTE_MODE       0x00
+#define SEQUENTIAL_MODE 0x40
+
+// command codes for 23K256
+#define READ            0x03
+#define WRITE           0x02
+#define READ_STATUS     0x05 // called RDSR in datasheet
+#define WRITE_STATUS    0x01 // called WRSR in datasheet
+
+class Ser23K256 {
+public:
+    Ser23K256(SPI& spi, PinName ncs);
+    char read(int address);
+    void read(int address, char * buffer, int count);
+    void write(int address, char byte);
+    void write(int address, char * buffer, int count);
+private:
+    SPI& _spi;
+    DigitalOut _ncs;
+    char readStatus();
+    void writeStatus(char status);
+    void prepareCommand(char command, int address);
+    void select();
+    void deselect();
+};
+
+#endif
--- a/main.cpp	Sun Aug 15 10:10:05 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-#include "mbed.h"
-
-DigitalOut ncs(p14);
-SPI spi(p5,p6,p7);
-
-// 23K256 data sheet at http://ww1.microchip.com/downloads/en/DeviceDoc/22100B.pdf
-
-// Page-mode commands have not been implemented; I have found no need for them yet.
-
-// Assumes spi mode is default (8,0).
-
-// The 23K256 supports the mbed's maximum spi frequency of 12MHz.
-
-// mode codes for 23K256
-#define BYTE_MODE       0x00
-#define SEQUENTIAL_MODE 0x40
-
-// command codes for 23K256
-#define READ            0x03
-#define WRITE           0x02
-#define READ_STATUS     0x05 // called RDSR in datasheet
-#define WRITE_STATUS    0x01 // called WRSR in datasheet
-
-inline void on() {
-    ncs = 0;
-}
-
-inline void off() {
-    ncs = 1;
-}
-
-void writeStatus(char status) {
-    on();
-    spi.write(WRITE_STATUS);
-    spi.write(status);
-    off();
-}
-
-int readStatus() {
-    on();
-    spi.write(READ_STATUS);
-    int result = spi.write(0);
-    off();
-    return result;
-}
-
-inline void prepareCommand(char command, int address) {
-    on();
-    spi.write(command);
-    spi.write(address >> 8);
-    spi.write(address & 0xFF);
-}
-
-// write or read a single byte
-
-void write(int address, char byte) {
-    prepareCommand(WRITE, address);
-    spi.write(byte);
-    off();
-}
-
-char read(int address) {
-    prepareCommand(READ, address);
-    int result = spi.write(0);
-    off();
-    return (char) result;
-}
-
-// buffered write and read
-
-/*
-* the single-byte read and write assume the 23K256 is in its default byte-mode
-* so sequential-model commands must switch the chip into sequential mode
-* at the start and return it to byte mode at the end.
-*/
-
-void write(int address, char * buffer, int count) {
-    writeStatus(SEQUENTIAL_MODE);
-    prepareCommand(WRITE, address);
-    for (int i = 0; i < count; i++) {
-        spi.write(buffer[i]);
-    }
-    off();
-    writeStatus(BYTE_MODE);
-}
-
-void read(int address, char * buffer, int count) {
-    writeStatus(SEQUENTIAL_MODE);
-    prepareCommand(READ, address);
-    for (int i = 0; i < count; i++) {
-        buffer[i] = spi.write(0);
-    }
-    off();
-    writeStatus(BYTE_MODE);
-}
-
-int main() {
-    off();
-    printf("Status codes: 0 = byte mode (default), 0x40 = sequential mode. "); 
-    printf("Status is currently %i\r\n", readStatus());
-    char buff[50];
-    write(0, 'h');
-    write(1, 'i');
-    write(2, '!');
-    write(3, '\0');
-    for (int address = 0; address < 4; address++) {
-        buff[address] = read(address);
-    }
-    printf("mem = %s\r\n", buff);
-    write(0, "Hello world!",12);
-    read(0, buff, 12);
-    buff[12]='\0';
-    printf("now = %s\r\n", buff);
-}
\ No newline at end of file