Cypress F-RAM FM25W256 library

Dependents:   Hello-FM25W256 Hello-FM25W256

FM25W256.cpp

Committer:
MACRUM
Date:
2016-03-05
Revision:
1:bb2b1e4bfb6e
Parent:
0:5a552209903c

File content as of revision 1:bb2b1e4bfb6e:

/* Cypress FM25W256 F-RAM component library
 *
 * Copyright (c) 2016 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *  *
 *  @author  Toyomasa Watarai
 *  @version 1.0
 *  @date    5-March-2016
 *
 *  http://www.cypress.com/products/nonvolatile-ram
 *  http://www.cypress.com/documentation/datasheets/fm25w256-256-kbit-32-k-8-serial-spi-f-ram?source=search&keywords=FM25W256&cat=technical_documents
 *
 */

#include "mbed.h"
#include "FM25W256.h"

FM25W256::FM25W256(PinName mosi, PinName miso, PinName clk, PinName cs)
    : _spi(mosi, miso, clk), _cs(cs)
{
    _spi.format(8, 0);
    _spi.frequency(FM25W256_CLK);
    _cs = 1;
    wait_ms(1); // tPU = 1ms (min.)
}

FM25W256::FM25W256(SPI &spi, PinName cs)
    : _spi(spi), _cs(cs) 
{
    _spi.format(8, 0);
    _spi.frequency(FM25W256_CLK);
    _cs = 1;
    wait_ms(1); // tPU = 1ms (min.)
}

void FM25W256::write(uint16_t address, uint8_t data)
{
    _cs = 0;
    _spi.write(CMD_WREN);
    _cs = 1;

    _cs = 0;
    _spi.write(CMD_WRITE);
    _spi.write(address >> 8);
    _spi.write(address & 0xFF);
    _spi.write(data);
    _cs = 1;
}

void FM25W256::write(uint16_t address, uint8_t *data, uint16_t size)
{
    _cs = 0;
    _spi.write(CMD_WREN);
    _cs = 1;

    _cs = 0;
    _spi.write(CMD_WRITE);
    _spi.write(address >> 8);
    _spi.write(address & 0xFF);
    while(size--) {
        _spi.write(*data++);
    }
    _cs = 1;
}

uint8_t FM25W256::read(uint16_t address)
{
    uint8_t data;

    _cs = 0;
    _spi.write(CMD_READ);
    _spi.write(address >> 8);
    _spi.write(address & 0xFF);
    data = _spi.write(0);
    _cs = 1;

    return data;
}

void FM25W256::read(uint16_t address, uint8_t *buf, uint16_t size)
{
    _cs = 0;
    _spi.write(CMD_READ);
    _spi.write(address >> 8);
    _spi.write(address & 0xFF);
    while (size--) {
        *buf++ = _spi.write(0);
    }
    _cs = 1;
}

void FM25W256::wirte_status(uint8_t data)
{
    _cs = 0;
    _spi.write(CMD_WREN);
    _cs = 1;

    _cs = 0;
    _spi.write(CMD_WRSR);
    _spi.write(data);
    _cs = 1;
}

uint8_t FM25W256::read_status()
{
    uint8_t data;
    _cs = 0;
    _spi.write(CMD_RDSR);
    data = _spi.write(0);
    _cs = 1;
    
    return data;
}

void FM25W256::set_write_protect(E_WP bp)
{
    // Set WPEN, BP0 and BP1
    wirte_status((1 << 7) | (bp << 2));
}

void FM25W256::clear_write_protect()
{
    wirte_status(0);
}