Dependents:   Internal_ADC_with_interrupt

Committer:
marcelvandekamp
Date:
Fri Mar 04 15:22:24 2011 +0000
Revision:
0:d049f6422506

        

Who changed what in which revision?

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