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);
}
Committer:
Decimus
Date:
Sun Oct 21 17:10:30 2012 +0000
Revision:
0:27d10d94f7d9
Upload

Who changed what in which revision?

UserRevisionLine numberNew 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 }