He hecho esto antes, pero no recuerdo todos los detalles. Usé Fat filesytem y había algún tipo de enfoque diferente, solía transferir un bloque de datos de 512 bytes. Pero puedo decirte lo que necesitas con seguridad: un búfer circular, el mío era de 16k bytes. Cuando muestrea en ISR se escribe en un búfer, luego se incrementa el puntero de escritura, cuando la diferencia entre el puntero de wr y rd excede los 512 bytes, se escriben esos bytes en una SD y el puntero rd de incremento. De todos modos esto es viejo, sin uso de transferencia DMA, solo un ejemplo. Al crear el búfer curcular, use el tamaño del búfer con potencia de 2, busque las matemáticas utilizadas con los punteros rd y wr, se simplifica gracias a la propiedad de la transferencia de números binarios, en cualquier cálculo que necesite para aplicar la máscara: & (tamaño-1) que es 2 ^ N-1, en mi caso N = 14 - > tamaño del búfer circ = 2 ^ 14 = 16384.
void AddBuffer (char data)
{
CircBuffer[WR_Pointer]=data;
WR_Pointer++;
WR_Pointer= WR_Pointer & 16383;
if (WR_Pointer==RD_Pointer)
{
printf("\r\nBuffer overrun\r\n",0);
stat0_off();
stat1_on();
VICIntEnClr = 0xFFFFFFFF; //clear all interrupts
fat_flush();
while(1);
}
}
char GetBuffer()
{
char res;
if (WR_Pointer==RD_Pointer)
{
res=0; // no data available
printf("\r\nError calling GetBuffer()\r\n",0);
stat0_off();
stat1_on();
VICIntEnClr = 0xFFFFFFFF; //clear all interrupts
fat_flush();
while(1);
}
else
{
res=CircBuffer[RD_Pointer];
RD_Pointer++;
RD_Pointer=RD_Pointer & 16383;
}
return(res);
}
void SD_Card_Log(void)
{
int j;
BufferLength = WR_Pointer-RD_Pointer;
BufferLength = BufferLength & 16383;
if (BufferLength>=512)
{
for (j = 0; j < 512; j++) {
RX_array1[j] = GetBuffer();
}
stat0_off();
stat1_off();
if (fat_write(handle,RX_array1, 512) < 0)
{
while(1) // card failure
{
}
}