Romilly Cocking
/
Ser23K256
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