Interface library for Ramtron FRAM memory, FM25VXX series.
Code sample:
#include "mbed.h" #include "FRAMSPI.h" SPI spi(p5,p6,p7); FRAMSPI fram(spi,p8); Serial pc(USBTX, USBRX); int main() { char wdata[] = "Hello world!"; char rdata[14]; fram.write(0, wdata, 13); // 12 symbols + zero terminator fram.read(0, rdata, 13); pc.printf("data: %s", rdata); }
FRAMSPI.cpp@0:27d10d94f7d9, 2012-10-21 (annotated)
- Committer:
- Decimus
- Date:
- Sun Oct 21 17:10:30 2012 +0000
- Revision:
- 0:27d10d94f7d9
Upload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Decimus | 0:27d10d94f7d9 | 1 | /* FRAMSPI - Ramtron FRAM FM24VXX series driver |
Decimus | 0:27d10d94f7d9 | 2 | * Copyright (c) 2012 Oleg Evsegneev |
Decimus | 0:27d10d94f7d9 | 3 | * Released under the MIT License: http://mbed.org/license/mit |
Decimus | 0:27d10d94f7d9 | 4 | * |
Decimus | 0:27d10d94f7d9 | 5 | * Datasheet http://www.ramtron.com/files/datasheets/FM25V02_ds.pdf |
Decimus | 0:27d10d94f7d9 | 6 | */ |
Decimus | 0:27d10d94f7d9 | 7 | |
Decimus | 0:27d10d94f7d9 | 8 | #include "mbed.h" |
Decimus | 0:27d10d94f7d9 | 9 | #include "FRAMSPI.h" |
Decimus | 0:27d10d94f7d9 | 10 | |
Decimus | 0:27d10d94f7d9 | 11 | FRAMSPI::FRAMSPI(SPI& spi, PinName ncs) : _spi(spi), _ncs(ncs) { |
Decimus | 0:27d10d94f7d9 | 12 | deselect(); |
Decimus | 0:27d10d94f7d9 | 13 | } |
Decimus | 0:27d10d94f7d9 | 14 | |
Decimus | 0:27d10d94f7d9 | 15 | void FRAMSPI::select() { |
Decimus | 0:27d10d94f7d9 | 16 | _ncs = 0; |
Decimus | 0:27d10d94f7d9 | 17 | } |
Decimus | 0:27d10d94f7d9 | 18 | |
Decimus | 0:27d10d94f7d9 | 19 | void FRAMSPI::deselect() { |
Decimus | 0:27d10d94f7d9 | 20 | _ncs = 1; |
Decimus | 0:27d10d94f7d9 | 21 | } |
Decimus | 0:27d10d94f7d9 | 22 | |
Decimus | 0:27d10d94f7d9 | 23 | void FRAMSPI::readID( char *buff ) { |
Decimus | 0:27d10d94f7d9 | 24 | select(); |
Decimus | 0:27d10d94f7d9 | 25 | _spi.write(READ_SN); |
Decimus | 0:27d10d94f7d9 | 26 | for( int i=0; i<8; i++ ) |
Decimus | 0:27d10d94f7d9 | 27 | buff[i] = (char) _spi.write(0); |
Decimus | 0:27d10d94f7d9 | 28 | deselect(); |
Decimus | 0:27d10d94f7d9 | 29 | } |
Decimus | 0:27d10d94f7d9 | 30 | |
Decimus | 0:27d10d94f7d9 | 31 | void FRAMSPI::readSN( char *buff ) { |
Decimus | 0:27d10d94f7d9 | 32 | select(); |
Decimus | 0:27d10d94f7d9 | 33 | _spi.write(READ_SN); |
Decimus | 0:27d10d94f7d9 | 34 | for( int i=0; i<2; i++ ) |
Decimus | 0:27d10d94f7d9 | 35 | buff[i] = (char) _spi.write(0); |
Decimus | 0:27d10d94f7d9 | 36 | deselect(); |
Decimus | 0:27d10d94f7d9 | 37 | } |
Decimus | 0:27d10d94f7d9 | 38 | |
Decimus | 0:27d10d94f7d9 | 39 | void FRAMSPI::prepareCommand(char cmd, int addr) { |
Decimus | 0:27d10d94f7d9 | 40 | if( cmd == WRITE ){ |
Decimus | 0:27d10d94f7d9 | 41 | select(); |
Decimus | 0:27d10d94f7d9 | 42 | _spi.write(WRITE_ENABLED); |
Decimus | 0:27d10d94f7d9 | 43 | deselect(); |
Decimus | 0:27d10d94f7d9 | 44 | } |
Decimus | 0:27d10d94f7d9 | 45 | select(); |
Decimus | 0:27d10d94f7d9 | 46 | _spi.write(cmd); |
Decimus | 0:27d10d94f7d9 | 47 | _spi.write(addr >> 8); |
Decimus | 0:27d10d94f7d9 | 48 | _spi.write(addr & 0xFF); |
Decimus | 0:27d10d94f7d9 | 49 | } |
Decimus | 0:27d10d94f7d9 | 50 | |
Decimus | 0:27d10d94f7d9 | 51 | // write |
Decimus | 0:27d10d94f7d9 | 52 | void FRAMSPI::write(int addr, char byte) { |
Decimus | 0:27d10d94f7d9 | 53 | prepareCommand(WRITE, addr); |
Decimus | 0:27d10d94f7d9 | 54 | _spi.write(byte); |
Decimus | 0:27d10d94f7d9 | 55 | deselect(); |
Decimus | 0:27d10d94f7d9 | 56 | } |
Decimus | 0:27d10d94f7d9 | 57 | |
Decimus | 0:27d10d94f7d9 | 58 | void FRAMSPI::write(int addr, char *buff, int cnt) { |
Decimus | 0:27d10d94f7d9 | 59 | prepareCommand(WRITE, addr); |
Decimus | 0:27d10d94f7d9 | 60 | for (int i = 0; i < cnt; i++) { |
Decimus | 0:27d10d94f7d9 | 61 | _spi.write(buff[i]); |
Decimus | 0:27d10d94f7d9 | 62 | } |
Decimus | 0:27d10d94f7d9 | 63 | deselect(); |
Decimus | 0:27d10d94f7d9 | 64 | } |
Decimus | 0:27d10d94f7d9 | 65 | |
Decimus | 0:27d10d94f7d9 | 66 | // read |
Decimus | 0:27d10d94f7d9 | 67 | char FRAMSPI::read(int addr) { |
Decimus | 0:27d10d94f7d9 | 68 | char res; |
Decimus | 0:27d10d94f7d9 | 69 | prepareCommand(READ, addr); |
Decimus | 0:27d10d94f7d9 | 70 | res = _spi.write(0); |
Decimus | 0:27d10d94f7d9 | 71 | deselect(); |
Decimus | 0:27d10d94f7d9 | 72 | return res; |
Decimus | 0:27d10d94f7d9 | 73 | } |
Decimus | 0:27d10d94f7d9 | 74 | |
Decimus | 0:27d10d94f7d9 | 75 | void FRAMSPI::read(int addr, char * buff, int cnt) { |
Decimus | 0:27d10d94f7d9 | 76 | prepareCommand(READ, addr); |
Decimus | 0:27d10d94f7d9 | 77 | for (int i = 0; i < cnt; i++) { |
Decimus | 0:27d10d94f7d9 | 78 | buff[i] = _spi.write(0); |
Decimus | 0:27d10d94f7d9 | 79 | } |
Decimus | 0:27d10d94f7d9 | 80 | deselect(); |
Decimus | 0:27d10d94f7d9 | 81 | } |