This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM的SD卡读写程序

Other Parts Discussed in Thread: TM4C123GH6PM

急求一份TM4C123GH6PM的SD卡读写程序,谢谢。

  • 下载Tivaware,安装后你可以在以下路径找到此例程:

    C:\ti\TivaWare_C_Series-2.1.1.71\examples\boards\dk-tm4c123g\sd_card

  • 您好,请问我对例程里的显示部分做了如下注释是否有影响,如果没有影响,为何我在串口输入ls命令为何总是返回Command returned error code FR_NOT_READY,是我硬件连接的问题吗?我是按照spi接线接的。麻烦解答一下,谢谢。
    int
    main(void)
    {
        int nStatus;
        FRESULT iFResult;
    //    tRectangle sRect;
    
        //
        // Enable lazy stacking for interrupt handlers.  This allows floating-point
        // instructions to be used within interrupt handlers, but at the expense of
        // extra stack usage.
        //
        ROM_FPULazyStackingEnable();
    
        //
        // Set the system clock to run at 50MHz from the PLL.
        //
        ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                           SYSCTL_XTAL_16MHZ);
    
        //
        // Enable the peripherals used by this example.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    
        //
        // Configure SysTick for a 100Hz interrupt.  The FatFs driver wants a 10 ms
        // tick.
        //
        ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100);
        ROM_SysTickEnable();
        ROM_SysTickIntEnable();
    
        //
        // Enable Interrupts
        //
        ROM_IntMasterEnable();
    
        //
        // Initialize the UART as a console for text I/O.
        //
        ConfigureUART();
    
        //
        // Initialize the display driver.
        //
    //    CFAL96x64x16Init();
    //
    //    //
    //    // Initialize the graphics context.
    //    //
    //    GrContextInit(&g_sContext, &g_sCFAL96x64x16);
    //
    //    //
    //    // Fill the top part of the screen with blue to create the banner.
    //    //
    //    sRect.i16XMin = 0;
    //    sRect.i16YMin = 0;
    //    sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1;
    //    sRect.i16YMax = 9;
    //    GrContextForegroundSet(&g_sContext, ClrDarkBlue);
    //    GrRectFill(&g_sContext, &sRect);
    //
    //    //
    //    // Change foreground for white text.
    //    //
    //    GrContextForegroundSet(&g_sContext, ClrWhite);
    //
    //    //
    //    // Put the application name in the middle of the banner.
    //    //
    //    GrContextFontSet(&g_sContext, g_psFontFixed6x8);
    //    GrStringDrawCentered(&g_sContext, "sd_card", -1,
    //                         GrContextDpyWidthGet(&g_sContext) / 2, 4, 0);
    //
    //    //
    //    // Show some instructions on the display
    //    //
    //    GrContextFontSet(&g_sContext, g_psFontFixed6x8);
    //    GrStringDrawCentered(&g_sContext, "Connect a", -1,
    //                         GrContextDpyWidthGet(&g_sContext) / 2, 20, false);
    //    GrStringDrawCentered(&g_sContext, "terminal", -1,
    //                         GrContextDpyWidthGet(&g_sContext) / 2, 30, false);
    //    GrStringDrawCentered(&g_sContext, "to UART0.", -1,
    //                         GrContextDpyWidthGet(&g_sContext) / 2, 40, false);
    //    GrStringDrawCentered(&g_sContext, "115000,N,8,1", -1,
    //                         GrContextDpyWidthGet(&g_sContext) / 2, 50, false);
    
        //
        // Print hello message to user.
        //
        UARTprintf("\n\nSD Card Example Program\n");
        UARTprintf("Type \'help\' for help.\n");
  • 屏蔽显示代码没有什么影响。

  • // PA3--CS
    // PA2--clk
    // PA5--MOSI
    // PA4--MISO

    您好,请问我这样接线是否有问题?如果没问题是否就是我SD卡硬件电路的问题,麻烦解答,谢谢。

  • // GPIO for SSI pins
    #define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE
    #define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA
    #define SDC_SSI_CLK GPIO_PIN_2
    #define SDC_SSI_TX GPIO_PIN_5
    #define SDC_SSI_RX GPIO_PIN_4
    #define SDC_SSI_FSS GPIO_PIN_3
    #define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | \
    SDC_SSI_FSS)

    程序定义是如此,应该跟你定义是一样

  • 您好,硬件问题解决了,例程也跑通了。但如果我想改变SSI0为SSI3,除了对一下部分修改外,还需对什么地方修改么?还望解答,谢谢。

    sd_card.c:
    
    //
    // Enable the peripherals used by this example.
    //
    //ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
    
    -----------------------------------------------------------------------------------
    
    mmc-dk-tm4c123g.c:
    
    /* Peripheral definitions for DK-TM4C123G board */
    // SSI port
    //#define SDC_SSI_BASE SSI0_BASE
    //#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI0
    
    // GPIO for SSI pins
    //#define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE
    //#define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA
    //#define SDC_SSI_CLK GPIO_PIN_2
    //#define SDC_SSI_TX GPIO_PIN_5
    //#define SDC_SSI_RX GPIO_PIN_4
    //#define SDC_SSI_FSS GPIO_PIN_3
    //#define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | \
    SDC_SSI_FSS)
    
    /* Peripheral definitions for DK-TM4C123G board */
    // SSI port
    #define SDC_SSI_BASE SSI3_BASE
    #define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI3
    
    // GPIO for SSI pins
    #define SDC_GPIO_PORT_BASE GPIO_PORTD_BASE
    #define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOD
    #define SDC_SSI_CLK GPIO_PIN_0
    #define SDC_SSI_TX GPIO_PIN_3
    #define SDC_SSI_RX GPIO_PIN_2
    #define SDC_SSI_FSS GPIO_PIN_1
    #define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | \
    SDC_SSI_FSS)
  • 您好,我之前不知道什么原因,修改端口成功了一次,之后又是异常,所以我觉得端口的修改还是有问题,所以还是麻烦您帮我解答一下SSI0改为SSI3代码更改的问题,谢谢。

  • SSI0和SSI3模块是一样,应该是程序中配置哪些还有没有更改过来。先用SSI0调通,然后熟悉我们的代码再修改。

  • 您好,SSI0已经调通了,但是PA2-PA4这几个端口我已经用到别的模块了,所以需要改变到其他端口。我做如上修改,将SSI0改到SSI3,并没有成功,所以我怀疑是还有部分需要修改的代码我没有找到,所以麻烦您指导一下,谢谢。

  • 还是我自己来解答吧。想把端口从SSI0挪到SSI3,作如下处理即可:

    #include "driverlib/pin_map.h"//添加这个头文件
    #if 0
    /* Peripheral definitions for DK-TM4C123G board */
    // SSI port
    #define SDC_SSI_BASE            SSI0_BASE
    #define SDC_SSI_SYSCTL_PERIPH   SYSCTL_PERIPH_SSI0
    
    // GPIO for SSI pins
    #define SDC_GPIO_PORT_BASE      GPIO_PORTA_BASE
    #define SDC_GPIO_SYSCTL_PERIPH  SYSCTL_PERIPH_GPIOA
    #define SDC_SSI_CLK             GPIO_PIN_2
    #define SDC_SSI_TX              GPIO_PIN_5
    #define SDC_SSI_RX              GPIO_PIN_4
    #define SDC_SSI_FSS             GPIO_PIN_3
    #define SDC_SSI_PINS            (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK |      \
                                     SDC_SSI_FSS)
    #endif
    
    #if 1
    /* Peripheral definitions for DK-TM4C123G board */
    // SSI port
    #define SDC_SSI_BASE            SSI3_BASE
    #define SDC_SSI_SYSCTL_PERIPH   SYSCTL_PERIPH_SSI3
    
    // GPIO for SSI pins
    #define SDC_GPIO_PORT_BASE      GPIO_PORTD_BASE
    #define SDC_GPIO_SYSCTL_PERIPH  SYSCTL_PERIPH_GPIOD
    #define SDC_SSI_CLK             GPIO_PIN_0
    #define SDC_SSI_TX              GPIO_PIN_3
    #define SDC_SSI_RX              GPIO_PIN_2
    #define SDC_SSI_FSS             GPIO_PIN_1
    #define SDC_SSI_PINS            (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK |      \
                                     SDC_SSI_FSS)
    #endif
    
    static
    void power_on (void)
    {
        /*
         * This doesn't really turn the power on, but initializes the
         * SSI port and pins needed to talk to the card.
         */
    
        /* Enable the peripherals used to drive the SDC on SSI */
        ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH);
        ROM_SysCtlPeripheralEnable(SDC_GPIO_SYSCTL_PERIPH);
    
        /*
         * Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS)
         * signal is directly driven to ensure that we can hold it low through a
         * complete transaction with the SD card.
         */
        ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK);
        ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_FSS);
    
        /*
         * Set the SSI output pins to 4MA drive strength and engage the
         * pull-up on the receive line.
         */
        MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_RX, GPIO_STRENGTH_4MA,
                             GPIO_PIN_TYPE_STD_WPU);
        MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS,
                             GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
    #if 1
    
        GPIOPinConfigure(GPIO_PD1_SSI3FSS);
        GPIOPinConfigure(GPIO_PD2_SSI3RX);
        GPIOPinConfigure(GPIO_PD0_SSI3CLK);
        GPIOPinConfigure(GPIO_PD3_SSI3TX);
    #endif
    
        /* Configure the SSI0 port */
        ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(),
                               SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8);
        ROM_SSIEnable(SDC_SSI_BASE);
    
        /* Set DI and CS high and apply more than 74 pulses to SCLK for the card */
        /* to be able to accept a native command. */
        send_initial_clock_train();
    
        PowerFlag = 1;
    }
  • 你的代码写的不错,很规范。尤其是代码屏蔽的部分和修改,用#define 和 #end if实现,确实是很巧妙的。值得借鉴一下!