Library to drive the Microchip 23K256 SRAM over SPI.

Dependencies:   mbed

Committer:
romilly
Date:
Sun Aug 15 13:06:52 2010 +0000
Revision:
2:f96c3c85aa3b
Child:
3:d2314b1ac797
created a library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
romilly 2:f96c3c85aa3b 1 // Ser23K256 - drive the Microchip 23K256 SRAM using SPI
romilly 2:f96c3c85aa3b 2 // Copyright (c) 2010 Romilly Cocking
romilly 2:f96c3c85aa3b 3 // Released under the MIT License: http://mbed.org/license/mit
romilly 2:f96c3c85aa3b 4
romilly 2:f96c3c85aa3b 5 // 23K256 data sheet at http://ww1.microchip.com/downloads/en/DeviceDoc/22100B.pdf
romilly 2:f96c3c85aa3b 6
romilly 2:f96c3c85aa3b 7 // Page-mode commands have not been implemented; I have found no need for them yet.
romilly 2:f96c3c85aa3b 8
romilly 2:f96c3c85aa3b 9 // Assumes spi mode is default (8,0).
romilly 2:f96c3c85aa3b 10
romilly 2:f96c3c85aa3b 11 // You can clock the 23K256 at up to 20MHz, so it supports the mbed's maximum SPI frequency of 12MHz.
romilly 2:f96c3c85aa3b 12
romilly 2:f96c3c85aa3b 13 #include "mbed.h"
romilly 2:f96c3c85aa3b 14 #include "Ser23K256.h"
romilly 2:f96c3c85aa3b 15
romilly 2:f96c3c85aa3b 16 Ser23K256::Ser23K256(SPI& spi, PinName ncs) : _spi(spi), _ncs(ncs) {
romilly 2:f96c3c85aa3b 17 deselect();
romilly 2:f96c3c85aa3b 18 }
romilly 2:f96c3c85aa3b 19
romilly 2:f96c3c85aa3b 20 void Ser23K256::select() {
romilly 2:f96c3c85aa3b 21 _ncs = 0;
romilly 2:f96c3c85aa3b 22 }
romilly 2:f96c3c85aa3b 23
romilly 2:f96c3c85aa3b 24 void Ser23K256::deselect() {
romilly 2:f96c3c85aa3b 25 _ncs = 1;
romilly 2:f96c3c85aa3b 26 }
romilly 2:f96c3c85aa3b 27
romilly 2:f96c3c85aa3b 28 void Ser23K256::writeStatus(char status) {
romilly 2:f96c3c85aa3b 29 select();
romilly 2:f96c3c85aa3b 30 _spi.write(WRITE_STATUS);
romilly 2:f96c3c85aa3b 31 _spi.write(status);
romilly 2:f96c3c85aa3b 32 deselect();
romilly 2:f96c3c85aa3b 33 }
romilly 2:f96c3c85aa3b 34
romilly 2:f96c3c85aa3b 35 char Ser23K256::readStatus() {
romilly 2:f96c3c85aa3b 36 select();
romilly 2:f96c3c85aa3b 37 _spi.write(READ_STATUS);
romilly 2:f96c3c85aa3b 38 char result = (char) _spi.write(0);
romilly 2:f96c3c85aa3b 39 deselect();
romilly 2:f96c3c85aa3b 40 return result;
romilly 2:f96c3c85aa3b 41 }
romilly 2:f96c3c85aa3b 42
romilly 2:f96c3c85aa3b 43 void Ser23K256::prepareCommand(char command, int address) {
romilly 2:f96c3c85aa3b 44 select();
romilly 2:f96c3c85aa3b 45 _spi.write(command);
romilly 2:f96c3c85aa3b 46 _spi.write(address >> 8);
romilly 2:f96c3c85aa3b 47 _spi.write(address & 0xFF);
romilly 2:f96c3c85aa3b 48 }
romilly 2:f96c3c85aa3b 49
romilly 2:f96c3c85aa3b 50 // write or read a single byte
romilly 2:f96c3c85aa3b 51
romilly 2:f96c3c85aa3b 52 void Ser23K256::write(int address, char byte) {
romilly 2:f96c3c85aa3b 53 prepareCommand(WRITE, address);
romilly 2:f96c3c85aa3b 54 _spi.write(byte);
romilly 2:f96c3c85aa3b 55 deselect();
romilly 2:f96c3c85aa3b 56 }
romilly 2:f96c3c85aa3b 57
romilly 2:f96c3c85aa3b 58 char Ser23K256::read(int address) {
romilly 2:f96c3c85aa3b 59 prepareCommand(READ, address);
romilly 2:f96c3c85aa3b 60 int result = _spi.write(0);
romilly 2:f96c3c85aa3b 61 deselect();
romilly 2:f96c3c85aa3b 62 return (char) result;
romilly 2:f96c3c85aa3b 63 }
romilly 2:f96c3c85aa3b 64
romilly 2:f96c3c85aa3b 65 // buffered write and read
romilly 2:f96c3c85aa3b 66
romilly 2:f96c3c85aa3b 67 /*
romilly 2:f96c3c85aa3b 68 * the single-byte read and write assume the 23K256 is in its default byte-mode
romilly 2:f96c3c85aa3b 69 * so sequential-model commands must switch the chip into sequential mode
romilly 2:f96c3c85aa3b 70 * at the start and return it to byte mode at the end.
romilly 2:f96c3c85aa3b 71 */
romilly 2:f96c3c85aa3b 72
romilly 2:f96c3c85aa3b 73 void Ser23K256::write(int address, char * buffer, int count) {
romilly 2:f96c3c85aa3b 74 writeStatus(SEQUENTIAL_MODE);
romilly 2:f96c3c85aa3b 75 prepareCommand(WRITE, address);
romilly 2:f96c3c85aa3b 76 for (int i = 0; i < count; i++) {
romilly 2:f96c3c85aa3b 77 _spi.write(buffer[i]);
romilly 2:f96c3c85aa3b 78 }
romilly 2:f96c3c85aa3b 79 deselect();
romilly 2:f96c3c85aa3b 80 writeStatus(BYTE_MODE);
romilly 2:f96c3c85aa3b 81 }
romilly 2:f96c3c85aa3b 82
romilly 2:f96c3c85aa3b 83 void Ser23K256::read(int address, char * buffer, int count) {
romilly 2:f96c3c85aa3b 84 writeStatus(SEQUENTIAL_MODE);
romilly 2:f96c3c85aa3b 85 prepareCommand(READ, address);
romilly 2:f96c3c85aa3b 86 for (int i = 0; i < count; i++) {
romilly 2:f96c3c85aa3b 87 buffer[i] = _spi.write(0);
romilly 2:f96c3c85aa3b 88 }
romilly 2:f96c3c85aa3b 89 deselect();
romilly 2:f96c3c85aa3b 90 writeStatus(BYTE_MODE);
romilly 2:f96c3c85aa3b 91 }