IP12B512 class for comunicating with the IPSiLog IP12B512 SPI RAM
IP12B512.cpp
- Committer:
- adamumpsimus
- Date:
- 2016-11-06
- Revision:
- 2:a0029473868c
- Parent:
- 1:bcbe2cf57840
File content as of revision 2:a0029473868c:
#include "IP12B512.h" // Constructor IP12B512::IP12B512( PinName pin_mosi, PinName pin_miso, PinName pin_sclk, PinName pin_cs ) : _device(pin_mosi, pin_miso, pin_sclk), _cs(pin_cs, 1) // even with pullup resistor, this pin goes down at startup, so a HIGH value is preferred { // Configure Interface _device.format(8, 0); // NOTE: different format (not 8.3) _device.frequency(20e6); // max speed of IP12B512 SRAM is 20MHz // Idle SPI RAM _cs = 0; _cs = 1; // Configure SPI RAM _cs = 0; _device.write(IP12B512_WRSR); // Write to Status Register _device.write(0x41); // Set to Virtual Chip Mode (0x40 - with HOLD, 0x41 - no HOLD) _cs = 1; } // Write SRAM in byte mode (sends the most data to SRAM prior to write) void IP12B512::Write(uint16_t addr, uint8_t data) { _cs = 0; _device.write(IP12B512_WRITE); // OpCode _device.write(addr >> 8); // Addr _device.write(addr); // Addr _device.write(data); // Pump out data to RAM _cs = 1; } // Write SRAM in stream mode (sends the least data to SRAM prior to write) void IP12B512::StreamWrite(uint16_t addr, uint8_t *data, uint32_t size) { uint8_t * p = data; uint32_t i; _cs = 0; _device.write(IP12B512_WRITE); // OpCode _device.write(addr >> 8); // Addr _device.write(addr); // Addr for (i = 0; i < size; i++) { _device.write(*p++); // Write to SPI ram } _cs = 1; } // Read SRAM in byte mode (sends the most data to SRAM prior to read) uint8_t IP12B512::Read(uint16_t addr) { uint8_t data; _cs = 0; _device.write(IP12B512_READ); // OpCode _device.write(addr >> 8); // Addr _device.write(addr); // Addr data = _device.write(0x00); // Clock in data from RAM (doesn't matter the value) _cs = 1; return data; } // Read SRAM in stream mode (sends the least data to SRAM prior to read) void IP12B512::StreamRead(uint16_t addr, uint8_t *data, uint32_t size) { uint8_t * p = data; uint32_t i; _cs = 0; _device.write(IP12B512_READ); // OpCode _device.write(addr >> 8); // Addr _device.write(addr); // Addr for (i = 0; i < size; i++) { *p++ = _device.write(0x00); // Clock in data from RAM(doesn't matter the value) } _cs = 1; } // Fill SRAM with data void IP12B512::ClearAll() { uint32_t ram_size = GetRamSize(); uint32_t i; _cs = 0; _device.write(IP12B512_WRITE); // OpCode _device.write(0x00); // Addr _device.write(0x00); // Addr for (i = 0; i < ram_size; i++) { _device.write(0x00); // Write to SPI ram } _cs = 1; } // Gets the SRAM size in bytes uint32_t IP12B512::GetRamSize() { uint8_t data; _cs = 0; _device.write(IP12B512_RDMI); // OpCode data = _device.write(0xFF); // Clock in data from RAM _cs = 1; if (data == 0b0000) return (64 * 1024) / 8; // 64Kbit = 8KByte if (data == 0b0001) return (128 * 1024) / 8; // 128Kbit = 16KByte if (data == 0b0010) return (256 * 1024) / 8; // 256Kbit = 32KByte if (data == 0b0011) return (512 * 1024) / 8; // 512Kbit = 64KByte return 0; }