Hi everyone,
I'm trying to port the code from TivaWare_C_Series-2.0.1.11577/examples/boards/dk-tm4c123g/sd-card/sd_card.c to work on my TM4C123GXL Launchpad. I'm using functions from /port/mmc-dk-tm4c123g.c. I've checked the pins and have all the pull up resistors in. However, the code gets stuck when i try to f_open and when i tried to use the code from this topic http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/335963/1178721.aspx#1178721, but i am unable to use functions such as power_on or wait_ready. this brings to me to my question if I did not do my linkers proper or something like that. below are my current code.
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "inc/hw_memmap.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "utils/ustdlib.h"
#include "third_party/fatfs/src/ff.h"
#include "third_party/fatfs/src/diskio.h"
//*****************************************************************************
//
// Defines the size of the buffers that hold the path, or temporary data from
// the SD card. There are two buffers allocated of this size. The buffer size
// must be large enough to hold the longest expected full path name, including
// the file name, and a trailing null character.
//
//
// The following are data structures used by FatFs.
//
//*****************************************************************************
static FATFS g_sFatFs;
static DIR g_sDirObject;
static FILINFO g_sFileInfo;
static FIL g_sFileObject;
//*****************************************************************************
//
// A structure that holds a mapping between an FRESULT numerical code, and a
// string representation. FRESULT codes are returned from the FatFs FAT file
// system driver.
//
//*****************************************************************************
typedef struct
{
FRESULT iFResult;
char *pcResultStr;
}
tFResultString;
//*****************************************************************************
//
// A macro to make it easy to add result codes to the table.
//
//*****************************************************************************
#define FRESULT_ENTRY(f) { (f), (#f) }
//*****************************************************************************
//
// A table that holds a mapping between the numerical FRESULT code and it's
// name as a string. This is used for looking up error codes for printing to
// the console.
//
//*****************************************************************************
tFResultString g_psFResultStrings[] =
{
FRESULT_ENTRY(FR_OK),
FRESULT_ENTRY(FR_DISK_ERR),
FRESULT_ENTRY(FR_INT_ERR),
FRESULT_ENTRY(FR_NOT_READY),
FRESULT_ENTRY(FR_NO_FILE),
FRESULT_ENTRY(FR_NO_PATH),
FRESULT_ENTRY(FR_INVALID_NAME),
FRESULT_ENTRY(FR_DENIED),
FRESULT_ENTRY(FR_EXIST),
FRESULT_ENTRY(FR_INVALID_OBJECT),
FRESULT_ENTRY(FR_WRITE_PROTECTED),
FRESULT_ENTRY(FR_INVALID_DRIVE),
FRESULT_ENTRY(FR_NOT_ENABLED),
FRESULT_ENTRY(FR_NO_FILESYSTEM),
FRESULT_ENTRY(FR_MKFS_ABORTED),
FRESULT_ENTRY(FR_TIMEOUT),
FRESULT_ENTRY(FR_LOCKED),
FRESULT_ENTRY(FR_NOT_ENOUGH_CORE),
FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES),
FRESULT_ENTRY(FR_INVALID_PARAMETER),
};
//*****************************************************************************
//
// A macro that holds the number of result codes.
//
//*****************************************************************************
#define NUM_FRESULT_CODES (sizeof(g_psFResultStrings) / \
sizeof(tFResultString))
//*****************************************************************************
//
// This function returns a string representation of an error code that was
// returned from a function call to FatFs. It can be used for printing human
// readable error messages.
//
//*****************************************************************************
const char * StringFromFResult(FRESULT iFResult)
{
uint_fast8_t ui8Idx;
//
// Enter a loop to search the error code table for a matching error code.
//
for(ui8Idx = 0; ui8Idx < NUM_FRESULT_CODES; ui8Idx++)
{
//
// If a match is found, then return the string name of the error code.
//
if(g_psFResultStrings[ui8Idx].iFResult == iFResult)
{
return(g_psFResultStrings[ui8Idx].pcResultStr);
}
}
//
// At this point no matching code was found, so return a string indicating
// an unknown error.
//
return("UNKNOWN ERROR CODE");
}
//*****************************************************************************
//
// This is the handler for this SysTick interrupt. FatFs requires a timer tick
// every 10 ms for internal timing purposes.
//
//*****************************************************************************
void SysTickHandler(void)
{
disk_timerproc();
}
//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void __error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
//*****************************************************************************
//
// Configure the UART and its pins. This must be called before UARTprintf().
//
//*****************************************************************************
void ConfigureUART(void)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 38400, 16000000);
}
//*****************************************************************************
//
// The program main function. It performs initialization, then runs a command
// processing loop to read commands from the console.
//
//*****************************************************************************
int main(void)
{
int nStatus;
FRESULT iFResult;
ROM_FPULazyStackingEnable();
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100);
ROM_SysTickEnable();
ROM_SysTickIntEnable();
ROM_IntMasterEnable();
ConfigureUART();
UARTprintf("\n\nSD Card Example Program\n");
iFResult = f_mount(0, &g_sFatFs);
if(iFResult != FR_OK)
{
UARTprintf("f_mount error: %s\n", StringFromFResult(iFResult)); //no error message here
return(1);
}
/*power_on();
BOOL a = wait_ready();
DSTATUS errd;
if(a) {
send_initial_clock_train();
errd = disk_initialize(0);
UARTprintf("\nInitialising disk 0. Status = %i\n", errd);
}*/
FIL fil;
uint32_t count = 8*512;
iFResult = f_open(&fil, "testfile.txt", FA_CREATE_NEW|FA_WRITE); //code breaks here
SysCtlDelay(SysCtlClockGet()/3);
if(iFResult != FR_OK) {UARTprintf("fresult: %s\n", StringFromFResult(iFResult)); }
else{UARTprintf("\n Opened SD card\n");}
iFResult = f_write(&fil, "Hello world", 11, &count);
if(iFResult != FR_OK) {UARTprintf("Error writing to file: %s\n", StringFromFResult(iFResult));}
iFResult = f_close(&fil);
f_mount(0, NULL);
}