I'm try using ST Nucleo F401RE + SDFileSystem Library + SparkFun MicroSD Breakout Board.
Everything works, but through 2-5 times of reading or writing everything hangs.
/*
SparkFun MicroSD Breakout Board
MicroSD Breakout mbed
CS o-------------o 8 (DigitalOut cs)
DI o-------------o 5 (SPI mosi)
VCC o-------------o VOUT
SCK o-------------o 7 (SPI sclk)
GND o-------------o GND
DO o-------------o 6 (SPI miso)
CD o
PB_13 = SCK
PB_15 = MOSI
PB_14 = MISO
PB_1 = CS
*/
#include "mbed.h"
#include "TextOLED.h"
#include "SDFileSystem.h"
#define LM75_REG_TEMP (0x00) // Temperature Register
#define LM75_REG_CONF (0x01) // Configuration Register
#define LM75_ADDR (0x90) // LM75 address A0 A1 A2 - to GND
#define LM75_REG_TEMP (0x00) // Temperature Register
#define LM75_REG_CONF (0x01) // Configuration Register
#define LM75_ADDR (0x90) // LM75 address A0 A1 A2 - to GND
// MOSI, MISO, SCK, CS
SDFileSystem sd(PB_15,PB_14,PB_13,PB_1,"sd"); // the pinout on the mbed Cool Components workshop board
I2C i2c(I2C_SDA, I2C_SCL);
// DigitalOut myled(LED1);
DigitalIn blue(D2);
Serial pc(SERIAL_TX,SERIAL_RX);
// volatile
char TempCelsiusDisplay[] = "+abc.d C";
TextLCD lcd(D13,D12,D11,D10,D9,D8); // rs, e, d4-d7
char buffer[32];
char c[32];
char Buff[256];
FILE *fp;
Timer t,w;
time_t seconds;
int main()
{
pc.baud(9600);
set_time(1387188323); // Set RTC time to 16 December 2013 10:05:23 UTC
pc.baud(9600);
lcd.cls();
char data_write[2];
char data_read[2];
/*
- Configure the Temperature sensor device STLM75:
- Thermostat mode Interrupt
- Fault tolerance: 0
*/
data_write[0] = LM75_REG_CONF;
data_write[1] = 0x02;
int status = i2c.write(LM75_ADDR, data_write, 2, 0);
if (status != 0) {
while (1) {
lcd.cls();
lcd.printf("Error LM75");
}
}
t.start();
w.start();
while (1) {
seconds = time(NULL);
// Read temperature register
data_write[0] = LM75_REG_TEMP;
i2c.write(LM75_ADDR, data_write, 1, 1); // no stop
i2c.read(LM75_ADDR, data_read, 2, 0);
// Calculate temperature value in Celcius
int tempval = (int)((int)data_read[0] << 8) | data_read[1];
tempval >>= 7;
if (tempval <= 256) {
TempCelsiusDisplay[0] = '+';
} else {
TempCelsiusDisplay[0] = '-';
tempval = 512 - tempval;
}
// Decimal part (0.5°C precision)
if (tempval & 0x01) {
TempCelsiusDisplay[5] = 0x05 + 0x30;
} else {
TempCelsiusDisplay[5] = 0x00 + 0x30;
}
// Integer part
tempval >>= 1;
TempCelsiusDisplay[1] = (tempval / 100) + 0x30;
TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30;
TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30;
// Display result
if(pc.readable()) {
char c = pc.getc();
if (c == 'c') {
pc.printf("\r\ntemp = %s\r\n", TempCelsiusDisplay);
}
if (c == 'w') {
fp = fopen("/sd/temp.txt","a");
if(fp == NULL) {
pc.printf("Could not open file for WRITE\r\n");
} else {
pc.printf("\r\nAll is OK (WRITE)\r\n");
strftime(buffer, 32, "%H:%M:%S", localtime(&seconds));
fprintf(fp,"Time: %s ", buffer);
fprintf(fp,"Temp = %s\r\n", TempCelsiusDisplay);
fclose(fp);
}
}
if (c == 'f') {
fp = fopen("/sd/temp.txt","r");
if(fp == NULL) {
pc.printf("Could not open file for READ\r\n");
} else {
pc.printf("\r\nAll is OK (READ)\r\n");
while(fgets (Buff, 256, fp) != NULL) {
Buff[strlen(Buff)-1] = 0;
pc.printf("%s\r\n", Buff);
}
}
fclose(fp);
}
}
if (t.read() > 1) {
pc.printf("Write...LCD ->");
lcd.cls();
lcd.locate(0,1);
lcd.printf(TempCelsiusDisplay);
lcd.locate(0,0);
strftime(buffer, 32, "%H:%M:%S\n", localtime(&seconds));
lcd.printf("Time: %s", buffer);
if(blue) {
lcd.locate(11,1);
lcd.printf("CON ");
} else {
lcd.locate(11,1);
lcd.printf("None");
}
t.stop();
t.reset();
t.start();
pc.printf("LCD...DONE\r\n");
}
if (w.read() > 100) {
pc.printf("Write...SD ->");
fp = fopen("/sd/temp.txt","a");
strftime(buffer, 32, "%H:%M:%S", localtime(&seconds));
fprintf(fp,"Time: %s ", buffer);
fprintf(fp,"Temp = %s\r\n", TempCelsiusDisplay);
fclose(fp);
w.stop();
w.reset();
w.start();
pc.printf("Write...DONE\r\n");
}
}
}
I'm try using ST Nucleo F401RE + SDFileSystem Library + SparkFun MicroSD Breakout Board. Everything works, but through 2-5 times of reading or writing everything hangs.