Hi guys,
I'm trying to log data on a SPI FRAM breakout (4 Mbit / 512 KBytes - MB85RS4MT) from adafruit. So far I've been able to log data using fram.write8(uint32_t addr, uint8_t value) and the associated read function.
Since speed if a concern, I tried out: fram.write8(uint32_t addr, uint8_t *value, size_t count) and I'm getting something but not quite what I want. Here's the code:
/*
https://www.adafruit.com/product/4719
https://github.com/adafruit/Adafruit_FRAM_SPI/blob/master/Adafruit_FRAM_SPI.cpp#L200
*/
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"
uint8_t FRAM_CS = 10;
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS); // use hardware SPI
struct DATA {
uint16_t data00;
uint16_t data01;
uint16_t data02;
uint16_t data03;
uint16_t data04;
uint16_t data05;
uint16_t data06;
uint16_t data07;
uint16_t data08;
uint16_t data09;
};
struct DATA src;
struct DATA *ptrSrc = &src;
struct DATA dst;
struct DATA *ptrDst = &dst;
uint32_t framAddr = 0;
void setup() {
Serial.begin(9600);
// setup fram module
if (fram.begin(3)) {
Serial.println("Found SPI FRAM");
} else {
Serial.println("No SPI FRAM found ... check your connections\r\n");
while (1);
}
// populate data
ptrSrc->data00 = 100;
ptrSrc->data01 = 100;
ptrSrc->data02 = 100;
ptrSrc->data03 = 100;
ptrSrc->data04 = 100;
ptrSrc->data05 = 100;
ptrSrc->data06 = 100;
ptrSrc->data07 = 100;
ptrSrc->data08 = 100;
ptrSrc->data09 = 100;
// write function
fram.write(framAddr, (uint8_t *) ptrSrc, sizeof(src));
// read function
fram.read(framAddr, (uint8_t *) ptrDst, sizeof(dst));
// print data
Serial.print(dst.data00); Serial.print(",");
Serial.print(dst.data01); Serial.print(",");
Serial.print(dst.data02); Serial.print(",");
Serial.print(dst.data03); Serial.print(",");
Serial.print(dst.data04); Serial.print(",");
Serial.print(dst.data05); Serial.print(",");
Serial.print(dst.data06); Serial.print(",");
Serial.print(dst.data07); Serial.print(",");
Serial.print(dst.data08); Serial.print(",");
Serial.println(dst.data09);
}
void loop() {
}
/* NOT USED BY THE CODE
WRITE
void Adafruit_FRAM_SPI::write(uint32_t addr, uint8_t *values, size_t count) {
uint8_t prebuf[10];
uint8_t i = 0;
prebuf[i++] = OPCODE_WRITE;
if (_nAddressSizeBytes > 3)
prebuf[i++] = (uint8_t)(addr >> 24);
if (_nAddressSizeBytes > 2)
prebuf[i++] = (uint8_t)(addr >> 16);
prebuf[i++] = (uint8_t)(addr >> 8);
prebuf[i++] = (uint8_t)(addr & 0xFF);
spi_dev->write(values, count, prebuf, i);
}
READ
void Adafruit_FRAM_SPI::read(uint32_t addr, uint8_t *values, size_t count) {
uint8_t buffer[10];
uint8_t i = 0;
buffer[i++] = OPCODE_READ;
if (_nAddressSizeBytes > 3)
buffer[i++] = (uint8_t)(addr >> 24);
if (_nAddressSizeBytes > 2)
buffer[i++] = (uint8_t)(addr >> 16);
buffer[i++] = (uint8_t)(addr >> 8);
buffer[i++] = (uint8_t)(addr & 0xFF);
spi_dev->write_then_read(buffer, i, values, count);
}
*/
and here's what I'm getting:
Found SPI FRAM
513,1027,1541,2055,2569,3083,3597,4111,4625,5139
I'm getting 10 values not they all should be 100.
What am I doing wrong ?
Any help is appreciated. Thanks