Hi All,
I'm working on a data logger capturing serial at writing it to SD card - which works fine for a period (many hours) but then hangs when trying to open a file on the SD device for writing. I have a watchdog that resets the mbed when this happens but each reset can't get past card initialisation - failing with the "No disk, or could not put SD card in to SPI idle state" message. The watchdog then fires & resets the mbed & this cycle repeats forever. The only thing that resolves this, albeit until the next crash, is a powercycle of the mbed - suggesting perhaps that the SD has found its way into the inactive state.
I'm using the mbed on a CoolComponents breakout board (actually I have 2 mbeds & 2 boards, both behave the same) capturing on UARTs 1 & 2 serial data at 4800baud 8:even:1 - logging to a variety of SD cards, including a Transcend 1GB microSD. All combinations fail eventually. I'm using the latest (as of today) mbed libs & SD card files.
I've looked around the forums & read a few posts on issues with the SD card - none appear to have been thoroughly investigated or resolved (at least in the threads I've read).
Attached is the main loop - it polls the serial ports (in case of any serial irq problems that may exist), formats the data into a timestamped string & writes it to the card. DBG_INSTR() is a macro that sets the state of the LEDs which flicker like mad until a hang when they show the 'OPENING_FILE' LED pattern.
Any input is welcome & invited.
Cheers.
Serial uart[2] = { Serial(NC, p14), Serial(NC, p27) };
uint32_t bytesRX[2];
time_t t = 0;
SDFileSystem sd(p5, p6, p7, p8, FILE_FS_NAME); // mosi, miso, sclk, cs
FILE *pf = NULL;
int fileSize = 0;
int fileIdx = 0;
char fileName[FILE_NAME_LEN];
DigitalOut ledArr[4] = { LED1, LED2, LED3, LED4 };
DigitalIn pushBtn(p16);
DigitalIn sdDetect(p9);
// The main loop
while(1)
{
for (int i = 0; i < 2; i++)
{
if (uart[i].readable())
{
idx = 0;
DBG_INSTR(READING_SERIAL);
(void)sprintf(buf, DATA_HEADER,
i, time(NULL),
uart[i].getc());
(void)ReadLSR(i);
DBG_INSTR(READING_SERIAL_DONE);
++bytesRX[i];
// While there's still data in the serial FIFO
while (uart[i].readable())
{
uint16_t offset = DATA_LINE_OFFSET(++idx);
// Ensure no overflow
if (offset > (DATA_LINE_LEN - (2 * DATA_FORMAT_EXT_LEN)))
break;
// Read it & put in on the formatted line
DBG_INSTR(READING_SERIAL);
(void)sprintf(&buf[offset],
DATA_FORMAT_EXT,
uart[i].getc());
(void)ReadLSR(i);
DBG_INSTR(READING_SERIAL_DONE);
++bytesRX[i];
}
// Write data to the file
DBG_INSTR(OPENING_FILE);
if ((pf = fopen(fileName, "a")) == NULL)
{
error("Cannot open %s\n", fileName);
}
DBG_INSTR(WRITING_TO_FILE);
fileSize += fprintf(pf, buf);
DBG_INSTR(CLOSING_FILE);
(void)fclose(pf);
DBG_INSTR(CLOSED_FILE);
if (fileSize > FILE_SIZE)
{
FileCreate();
}
}
}
}
Hi All,
I'm working on a data logger capturing serial at writing it to SD card - which works fine for a period (many hours) but then hangs when trying to open a file on the SD device for writing. I have a watchdog that resets the mbed when this happens but each reset can't get past card initialisation - failing with the "No disk, or could not put SD card in to SPI idle state" message. The watchdog then fires & resets the mbed & this cycle repeats forever. The only thing that resolves this, albeit until the next crash, is a powercycle of the mbed - suggesting perhaps that the SD has found its way into the inactive state.
I'm using the mbed on a CoolComponents breakout board (actually I have 2 mbeds & 2 boards, both behave the same) capturing on UARTs 1 & 2 serial data at 4800baud 8:even:1 - logging to a variety of SD cards, including a Transcend 1GB microSD. All combinations fail eventually. I'm using the latest (as of today) mbed libs & SD card files.
I've looked around the forums & read a few posts on issues with the SD card - none appear to have been thoroughly investigated or resolved (at least in the threads I've read).
Attached is the main loop - it polls the serial ports (in case of any serial irq problems that may exist), formats the data into a timestamped string & writes it to the card. DBG_INSTR() is a macro that sets the state of the LEDs which flicker like mad until a hang when they show the 'OPENING_FILE' LED pattern.
Any input is welcome & invited.
Cheers.