Lectura de datos desde tarjeta SD mediante SPI en TMS320F28335

Configuración de conexión física

TMS320F28335       Módulo SD  
-------------------------
SPISTE (GPIO34) → CS  
SPISIMO (GPIO32) → SCLK  
SPICLKO (GPIO33) → MOSI  
SPISOMI (GPIO31) → MISO  
GND → GND  
VCC → VDD  

Parámetros clave:

  1. Uso del periférico SPI-A en modo maestro de 4 hilos
  2. Frecuencia inicial de reloj SPI: 1 MHz (fase de inicialización)
  3. Formato de datos: MSB primero, polaridad CPOL=0, fase CPHA=0
  4. Habilitación de verificación CRC por hardware (dependiente de versión SD)

Inicailización del periférico SPI

#include "F28x_Project.h"

#define BASE_SPI 0x00007000  
#define CS_ACTIVAR() GpioDataRegs.GPACLEAR.bit.GPIO34 = 1  
#define CS_DESACTIVAR() GpioDataRegs.GPASET.bit.GPIO34 = 1

void Configurar_SPI() {
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.SPIAENCLK = 1;
    EDIS;

    SpiaRegs.SPICCR.bit.SPICHAR = 0b1111;
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPIBRR = 15;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;

    EALLOW;
    GPIO_SetupPinMux(34, GPIO_MUX_CPU1A, 0);
    GPIO_SetupPinMux(32, GPIO_MUX_CPU1A, 0);
    GPIO_SetupPinMux(33, GPIO_MUX_CPU1A, 0);
    GPIO_SetupPinMux(31, GPIO_MUX_CPU1A, 1);
    EDIS;
}

Secuencia de inicialización SD

#define CMD_RESET 0x40  
#define CMD_VOLTAGE 0x48  
#define ACMD_INIT 0x60

uint8_t Inicializar_SD() {
    uint8_t respuesta;
    CS_ACTIVAR();
    Enviar_SPI(CMD_RESET, 0, 0x95);
    respuesta = Recibir_SPI();

    CS_DESACTIVAR();
    CiclosEspera(1000);

    for(int n = 0; n < 100; n++) {
        CS_ACTIVAR();
        Enviar_SPI(0x77, 0, 0x65);
        if (Recibir_SPI() == 0x01) {
            Enviar_SPI(ACMD_INIT, 0x40000000, 0xE5);
            respuesta = Recibir_SPI();
            if(!respuesta) break;
        }
        CS_DESACTIVAR();
        CiclosEspera(1);
    }

    return !respuesta;
}

Ipmlementación del protocolo SPI

uint8_t Recibir_SPI() {
    while(!(SpiaRegs.SPISTS.bit.RXFULL));
    return SpiaRegs.SPIRXBUF >> 8;
}

void Enviar_SPI(uint8_t comando, uint32_t argumento, uint8_t crc) {
    SpiaRegs.SPITXBUF = comando;
    while(!SpiaRegs.SPISTS.bit.TXEMPTY);

    uint8_t bytes[] = {
        (argumento >> 24) & 0xFF,
        (argumento >> 16) & 0xFF,
        (argumento >> 8) & 0xFF,
        argumento & 0xFF
    };

    SpiaRegs.SPITXBUF = bytes[0];
    SpiaRegs.SPITXBUF = bytes[1];
    SpiaRegs.SPITXBUF = bytes[2];
    SpiaRegs.SPITXBUF = bytes[3];
    
    SpiaRegs.SPITXBUF = crc;
}

Acceso a datos mediante FAT

FATFS sistema;
FIL fich;
uint16_t leidos;

void LeerFicheroSD(char* nombre) {
    FRESULT res = f_mount(&sistema, "", 1);
    if (res != FR_OK) return;

    res = f_open(&fich, nombre, FA_OPEN_EXISTING | FA_READ);
    if (res) return;
    
    uint8_t bloque[512];
    do {
        res = f_read(&fich, bloque, sizeof(bloque), &leidos);
    } while (res == FR_OK && leidos > 0);

    f_close(&fich);
    f_mount(0, "", 0);
}

Etiquetas: TMS320F28335 SPI SDCard FATFS EmbeddedSystems

Publicado el 10-9 12:31