Dependents:   Internal_ADC_with_interrupt

Files at this revision

API Documentation at this revision

Comitter:
marcelvandekamp
Date:
Fri Mar 04 15:22:24 2011 +0000
Commit message:

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
diff -r 000000000000 -r d049f6422506 Ser23K256.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ser23K256.cpp	Fri Mar 04 15:22:24 2011 +0000
@@ -0,0 +1,84 @@
+/* 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"
+#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
diff -r 000000000000 -r d049f6422506 Ser23K256.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ser23K256.h	Fri Mar 04 15:22:24 2011 +0000
@@ -0,0 +1,108 @@
+/** 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"
+
+#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
+
+/** An interface for the Microchip 32k byte 23K256 SRAM over SPI
+*
+* 
+*
+* @code
+* #include "mbed.h"
+* #include "Ser23K256.h"
+*
+*
+* SPI spi(p5,p6,p7);
+* Ser23K256 sram(spi,p14);
+*
+* int main() {
+*   char buff[50];
+*   sram.write(0, 'h');
+*   sram.write(1, 'i');
+*   sram.write(2, '!');
+*   sram.write(3, '\0');
+*   for (int address = 0; address < 4; address++) {
+*       buff[address] = sram.read(address);
+*   }
+*   printf("sram = %s\r\n", buff);
+*   sram.write(0, "Hello world!",12);
+*   sram.read(0, buff, 12);
+*   buff[12]='\0';
+*   printf("now = %s\r\n", buff);
+*}
+* @endcode
+* connections:
+* chip pin 1 to mbed ncs (see below)
+* chip pin 2 SO to mbed MISO
+* chip pin 3 - no connection
+* chip pin 4 to mbed Gnd
+* chip pin 5 SI pin to mbed MOSI
+* chip pin 6 SCK to mbed sck 
+* chip pin 7 (notHOLD) to mbed Vout
+* chip pin 8 to mbed Vout
+*/
+class Ser23K256 {
+public:
+/** Create an interface
+*
+*
+* @param spi   An SPI object
+* @param ncs   Not chip select pin - any free Digital pin will do
+*/
+    Ser23K256(SPI& spi, PinName ncs);
+/** read a byte from SRAM
+* @param address    The address to read from
+* @return the character at that address
+*/
+    char read(int address);
+/** read multiple bytes from SRAM into a buffer
+* @param address    The SRAM address to read from
+* @param buffer     The buffer to read into (must be big enough!)
+* @param count      The number of bytes to read
+*/
+    void read(int address, char * buffer, int count);
+/** write a byte to SRAM
+* @param address    The address SRAM to write to
+* @param byte       The byte to write there
+*/
+    void write(int address, char byte);
+    /** write multiple bytes to SRAM from a buffer
+* @param address    The SRAM address write to
+* @param buffer     The buffer to write from
+* @param count      The number of bytes to write
+*/
+    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