SPI SRAM 23X library

sram23x.cpp

Committer:
bborredon
Date:
2012-07-14
Revision:
0:bdd299c0e8e6

File content as of revision 0:bdd299c0e8e6:

/***********************************************************
Author: Bernard Borredon
Date: 27 december 2011
Version: 1.0
************************************************************/
#include "sram23x.h"

#define HIGH(x) (x >> 8)
#define LOW(x) (x & 0xff)

SRAM23X::SRAM23X(PinName mosi, PinName miso, PinName sclk, PinName cs, TypeSram type) : _spi(mosi, miso, sclk) 
{
  
  _errnum = SRAM23X_NoError;
  _type = type;
  _cs = new DigitalOut(cs);
  if(_cs == NULL)
    _errnum = SRAM23X_CsError;
    
  // Don't select chip
  deselect();
  
    // Size in bytes
  _size = _type;
  
  // Set SPI frequency
  _spi.frequency(10000000);
  
  // Set format
  _spi.format(8,0);
  
  // Mode sequential
  select();
  writeStatus(SRAM23X_SEQ);
  deselect();
}

// Initialization
uint8_t SRAM23X::init(uint16_t address, uint16_t size, uint8_t mode)
{
  
  // Check error
  if(_errnum) 
    return(_errnum);
    
  // Check address
  if(!checkAddress(address)) {
    _errnum = SRAM23X_OutOfRange;
    return(_errnum);
  }
  
  // Check address
  if(!checkAddress(address + size - 1)) {
    _errnum = SRAM23X_OutOfRange;
    return(_errnum);
  }
  
  // No error
  _errnum = SRAM23X_NoError;

  select();
  // Acces instruction
  _spi.write(mode);
  
  // High address part
  _spi.write(HIGH(address));
  
  // Low address part
  _spi.write(LOW(address));
  
  return(_errnum);
}

// Sequential read bytes
void SRAM23X::read(uint16_t address, int8_t *data, uint16_t size)
{
  uint8_t ret;
  uint16_t i;
  
  ret = init(address,size,SRAM23X_READ);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size;i++) {
    data[i] = _spi.write(0);
  }
  
  // Deselect chip
  deselect();
  
}

// Sequential read anything
void SRAM23X::read(uint16_t address, void *data, uint16_t size)
{
  int8_t *cmd = NULL;
  
  cmd = (int8_t *)malloc(size);
  if(cmd == NULL) {
    _errnum = SRAM23X_MallocError;
    return;
  }
  
  read(address,cmd,size);
  
  memcpy(data,cmd,size);
  
  free(cmd);
}

// Sequential read int16
void SRAM23X::read(uint16_t address, int16_t *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t cmd[2];
  uint8_t ret;
  
  ret = init(address,size,SRAM23X_READ);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 2;i = i + 2) {
     for(j = 0;j < 2;j++)
        cmd[j] = _spi.write(0);
     memcpy(&data[i],cmd,2);
  }
  
  // Deselect chip
  deselect();

}

// Sequential read int32
void SRAM23X::read(uint16_t address, int32_t *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t cmd[4];
  uint8_t ret;
  
  ret = init(address,size,SRAM23X_READ);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 4;i = i + 4) {
     for(j = 0;j < 4;j++)
        cmd[j] = _spi.write(0);
     memcpy(&data[i],cmd,4);
  }
  
  // Deselect chip
  deselect();

}

// Sequential read float
void SRAM23X::read(uint16_t address, float *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t cmd[4];
  uint8_t ret;
  
  ret = init(address,size,SRAM23X_READ);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 4;i = i + 4) {
     for(j = 0;j < 4;j++)
        cmd[j] = _spi.write(0);
     memcpy(&data[i],cmd,4);
  }
  
  // Deselect chip
  deselect();

}

// Sequential write bytes
void SRAM23X::write(uint16_t address, int8_t *data, uint16_t size)
{
  uint16_t i;
  uint8_t ret;
  
  ret = init(address,size,SRAM23X_WRITE);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size;i++) {
    _spi.write(data[i]);
  }
  
  // Deselect chip
  deselect();
  
}

// Sequential write anything
void SRAM23X::write(uint16_t address, void *data, uint16_t size)
{
  int8_t *cmd = NULL;
  
  cmd = (int8_t *)malloc(size);
  if(cmd == NULL) {
    _errnum = SRAM23X_MallocError;
    return;
  }
  
  memcpy(cmd,data,size);
  
  write(address,cmd,size);
  
  free(cmd);
}

// Sequential write int16
void SRAM23X::write(uint16_t address, int16_t *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t ret;
  uint8_t cmd[2];
  
  ret = init(address,size,SRAM23X_WRITE);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 2;i = i + 2) {
     memcpy(cmd,&data[i],2);
     for(j = 0;j < 2;j++)
        _spi.write(cmd[j]);
  }
  
  // Deselect chip
  deselect();
  
}

// Sequential write int32
void SRAM23X::write(uint16_t address, int32_t *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t ret;
  uint8_t cmd[4];
  
  ret = init(address,size,SRAM23X_WRITE);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 4;i = i + 4) {
     memcpy(cmd,&data[i],4);
     for(j = 0;j < 4;j++)
        _spi.write(cmd[j]);
  }
  
  // Deselect chip
  deselect();
  
}

// Sequential write float
void SRAM23X::write(uint16_t address, float *data, uint16_t size)
{
  uint16_t i,j;
  uint8_t ret;
  uint8_t cmd[4];
  
  ret = init(address,size,SRAM23X_WRITE);
  if(ret != 0) {
    // Deselect chip
    deselect();
    return;
  }
  
  // Datas
  for(i = 0;i < size / 4;i = i + 4) {
     memcpy(cmd,&data[i],4);
     for(j = 0;j < 4;j++)
        _spi.write(cmd[j]);
  }
  
  // Deselect chip
  deselect();
  
}

// Get SRAM size in bytes
uint16_t SRAM23X::getSize(void)
{
  return(_size);
}

// Select chip
void SRAM23X::select(void)
{
  _cs->write(0);
  wait_us(10.0);
}

// Deselect chip
void SRAM23X::deselect(void)
{

  wait_us(10.0);
  _cs->write(1);
}

// Read status register
uint8_t SRAM23X::readStatus(void)
{
  uint8_t ret;
  
  select();
  _spi.write(SRAM23X_RDSR);
  ret = _spi.write(0);
  deselect();
  
  return(ret);
}

// Write status register
void SRAM23X::writeStatus(uint8_t status)
{
  
  select();
  _spi.write(SRAM23X_WRSR);
  _spi.write(status);
  deselect();
}

// Check address
bool SRAM23X::checkAddress(uint16_t address)
{
  bool ret = true;
  
  if(address >= _type)
    ret = false;
  
  return(ret);
}  

// Get current error number
uint8_t SRAM23X::getError(void)
{ 
  return(_errnum);
}