Library to drive the Microchip 23K256 SRAM over SPI.
Revision 2:f96c3c85aa3b, committed 2010-08-15
- 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
--- /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
Microchip 23K256 SRAM