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:
- Uso del periférico SPI-A en modo maestro de 4 hilos
- Frecuencia inicial de reloj SPI: 1 MHz (fase de inicialización)
- Formato de datos: MSB primero, polaridad CPOL=0, fase CPHA=0
- 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);
}