Romilly Cocking
/
Ser23K256
Library to drive the Microchip 23K256 SRAM over SPI.
Ser23K256.cpp@2:f96c3c85aa3b, 2010-08-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |