Library to drive the Microchip 23K256 SRAM over SPI.

Dependencies:   mbed

Committer:
romilly
Date:
Sun Aug 15 14:28:05 2010 +0000
Revision:
3:d2314b1ac797
Parent:
2:f96c3c85aa3b
Added DOXYGEN comments

Who changed what in which revision?

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