0
\$\begingroup\$

I have to read a file 100kB big using FatFs in a microcontroller to send it via an AT TCP-IP modem. An obvious method would be doing f_open() calls, but I am curious how to use the f_forward function. The example code looks like this:

/*------------------------------------------------------------------------*/
/* Sample code of data transfer function to be called back from f_forward */
/*------------------------------------------------------------------------*/

UINT out_stream (   /* Returns number of bytes sent or stream status */
    const BYTE *p,  /* Pointer to the data block to be sent */
    UINT btf        /* >0: Transfer call (Number of bytes to be sent). 0: Sense call */
)
{
    UINT cnt = 0;


    if (btf == 0) {     /* Sense call */
        /* Return stream status (0: Busy, 1: Ready) */
        /* When once it returned ready to sense call, it must accept a byte at least */
        /* at subsequent transfer call, or f_forward will fail with FR_INT_ERR. */
        if (FIFO_READY) cnt = 1;
    }
    else {              /* Transfer call */
    do {    /* Repeat while there is any data to be sent and the stream is ready */
            FIFO_PORT = *p++;
            cnt++;
        } while (cnt < btf && FIFO_READY);
    }

    return cnt;
}


/*------------------------------------------------------------------------*/
/* Sample code using f_forward function                                   */
/*------------------------------------------------------------------------*/

FRESULT play_file (
    char *fn        /* Pointer to the audio file name to be played */
)
{
    FRESULT rc;
    FIL fil;
    UINT dmy;

    /* Open the audio file in read only mode */
    rc = f_open(&fil, fn, FA_READ);
    if (rc) return rc;

    /* Repeat until the file pointer reaches end of the file */
    while (rc == FR_OK && !f_eof(&fil)) {

        /* some processes... */

        /* Fill output stream periodicaly or on-demand */
        rc = f_forward(&fil, out_stream, 1000, &dmy);
    }

    /* Close the file and return */
    f_close(&fil);
    return rc;
}

I cant understand how to use this example. What is FIFO_READY and FIFO_PORT ? How do I extract the data I need and print it using printf(..)? Could somebody explain in more detail how to use this example ?

\$\endgroup\$
  • \$\begingroup\$ Your teacher could not help you? Obviously this device has a hardware based FiFO for both transmit and receive, so you will need to get the datasheet to that device. \$\endgroup\$ – Sparky256 Feb 6 at 4:14
  • \$\begingroup\$ I do not have a teacher (¿?). The MCU is a atxmega128A4u. I think I know understand, the FIFO device could be, for example the UART. Is this correct ? \$\endgroup\$ – Tomás Arturo Herrera Castro Feb 6 at 19:10

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.