STM32 SDIO detallado

Tabla de contenido

01. Introducción a SDIO

02, características SDIO

03, reloj SDIO

04, comando y respuesta SDIO

05, transmisión de datos en bloque SDIO

06, código


1. Introducción a SDIO

SDIO, nombre completo: entrada y salida digital segura, es decir, interfaz de entrada y salida digital segura. Se desarrolla sobre la base de la interfaz de la tarjeta SD. Puede ser compatible con tarjetas SD anteriores y se puede conectar a dispositivos de interfaz SDIO, como Bluetooth, WIFI y cámaras.

Una diferencia importante entre las especificaciones de las tarjetas SDIO y SD es la adición de estándares de baja velocidad. La aplicación de destino de las tarjetas de baja velocidad es admitir capacidades de E / S de baja velocidad con un gasto mínimo de hardware. Las tarjetas de baja velocidad admiten aplicaciones como módems, lectores de códigos de barras y receptores GPS.

El controlador SDIO de STM32 admite tarjetas multimedia (tarjetas MMC), tarjetas de memoria SD, tarjetas SDI / O y dispositivos CE-ATA.

Diagrama de bloques SDIO

SDIO_D0 se utiliza para la transmisión de datos después del reinicio. Después de la inicialización, el host puede cambiar el ancho del bus de datos (establecido por el comando ACMD6)

Si se conecta una tarjeta multimedia al bus, SDIO_D0, SDIO_D [3: 0] o SDIO_D [7: 0] se pueden utilizar para la transmisión de datos.      

La versión MMC V3.31 y las versiones anteriores del protocolo solo admiten líneas de datos de 1 bit, por lo que SDIO_D0 solo se puede usar (por razones de versatilidad, en el programa solo necesitamos detectar la tarjeta MMC y configurarla en datos de bus de 1 bit)

02, características SDIO

① Totalmente compatible con la versión 4.2 de la especificación del sistema de tarjetas multimedia. Se admiten tres modos de bus de datos diferentes: 1 bit (predeterminado), 4 bits y 8 bits.

②Totalmente compatible con la versión anterior de las especificaciones del sistema de tarjetas multimedia (compatibilidad con versiones posteriores).

③Totalmente compatible con la especificación de la tarjeta de memoria SD versión 2.0.

④Compatible con la especificación de tarjeta SDI / O versión 2.0: Admite dos modos de bus de datos diferentes: 1 bit (predeterminado) y 4 bits.

⑤ Totalmente compatible con la función CE-ATA (totalmente compatible con el protocolo digital CE-ATA versión 1.1). La velocidad de transmisión de datos puede alcanzar los 48 MHz en el modo de bus de 8 bits.

⑥Señal de habilitación de salida de comando y datos, utilizada para controlar el controlador bidireccional externo.

03, reloj SDIO

  1. Reloj de tarjeta (SDIO_CK): cada ciclo de reloj transmite 1 bit de comando o datos en las líneas de comando y datos. Para tarjetas SD o SD I / O, la frecuencia del reloj puede variar de 0MHz a 25MHz.

  2. Reloj del adaptador SDIO (SDIOCLK): este reloj se utiliza para controlar el adaptador SDIO y se puede utilizar para generar el reloj SDIO_CK. SDIOCLK proviene de PLL48CK (48Mhz).

Reloj de interfaz de bus APB2 (PCLK2): este reloj se utiliza para controlar la interfaz de bus APB2 de SDIO, y su frecuencia es PCLK2 = 84Mhz.

Fórmula de cálculo SDIO_CK: SDIO_CK = SDIOCLK / (2 + CLKDIV)

Nota: Cuando se inicializa la tarjeta SD, SDIO_CK no puede exceder los 400 Khz. Una vez completada la inicialización, se puede configurar en la frecuencia máxima (pero no puede exceder la frecuencia operativa máxima de la tarjeta SD)

04, comando y respuesta SDIO

mando

  1. Los comandos SDIO se dividen en dos partes: comandos relacionados con la aplicación (ACMD) y comandos comunes (CMD). Al enviar ACMD, primero se debe enviar CMD55.

  2. Todos los comandos y respuestas SDIO se transmiten en el pin SDIO_CMD. La longitud del comando se fija en 48 bits. El formato del comando SDIO se muestra en la siguiente tabla:

Entre ellos: Además del índice de comando y los parámetros que debemos configurar, los demás son controlados automáticamente por el hardware SDIO. El índice de comando (como CMD0, CMD1, etc.) lo establece el registro SDIO_CMD, y los parámetros de comando los establece el registro SDIO_ARG

respuesta

  1. Generalmente, cuando la tarjeta SD recibe una línea de comando, habrá una respuesta (excepto para CMD0) Esta respuesta también se llama respuesta. La interfaz SDIO de STM32 admite dos tipos de respuesta: respuesta corta (48 bits) y respuesta larga (136 bits)

  2. El formato de respuesta corta STM32 SDIO (48 bits) se muestra en la siguiente tabla:

  1. El formato STM32 SDIO de respuesta larga (136 bits) se muestra en la siguiente tabla

Independientemente de si se trata de una respuesta corta o una respuesta larga, el hardware filtrará automáticamente el bit de inicio, el bit de transmisión, CRC7 y la información del bit final. Para respuestas cortas, el índice de comando se almacena en el registro SDIO_RESPCMD y los parámetros se almacenan en el registro SDIO_RESP1. Para la respuesta larga, solo se deja el campo de bits CID / CSD y se almacena en 4 registros, incluido SDIO_RESP1 ~ SDIO_RESP4.

Respuesta de la tarjeta SD

La tarjeta SD tiene 6 tipos de respuestas (R1, R1b, R2, R3, R6, R7). Tomemos R1 como ejemplo para presentarlos brevemente. La respuesta R1 (comando de respuesta ordinaria) es una respuesta corta y su longitud es de 48 bits, como se muestra en la siguiente tabla:

Después de recibir la respuesta R1, podemos leer el índice de comando y la información del estado de la tarjeta del registro SDIO_RESPCMD y el registro SDIO_RESP1, respectivamente. Para la introducción de otras respuestas, consulte el CD: "SD Card 2.0 Protocol.pdf"

05, transmisión de datos en bloque SDIO

Operación de lectura de bloque de datos múltiples

La comunicación entre SDIO y la tarjeta SD se transmite generalmente en forma de bloques de datos, y la operación de lectura de bloques de datos SDIO (múltiples) se muestra en la siguiente figura.

Después de recibir el comando del maestro, el esclavo comienza a enviar bloques de datos al maestro. Todos los bloques de datos tienen verificación CRC (procesamiento automático por hardware). Cuando se lee un solo bloque de datos, puede detenerse después de recibir 1 bloque de datos. No Necesita enviar un comando de parada (CMD12). Pero cuando se leen varios bloques de datos, la tarjeta SD siempre enviará datos al host hasta que reciba el comando STOP (CMD12) enviado por el host.

Operación de escritura de varios bloques de datos

Operación de escritura de bloque de datos SDIO (multi), como se muestra en la siguiente figura

La operación de escritura del bloque de datos es básicamente similar a la operación de lectura del bloque de datos, excepto que cuando se escribe el bloque de datos, se agrega un juicio de ocupado y el nuevo bloque de datos debe enviarse cuando la tarjeta SD no está ocupada. La señal de ocupado aquí es SDIO_D0 bajo por SD Kara para indicar que está ocupado, y el hardware SDIO se controla automáticamente y no necesita nuestro software para procesarlo.

Nota: Cuando la frecuencia SDIO_CK es demasiado rápida, puede provocar que falle la comunicación de la tarjeta SD. En este momento, se recomienda reducir SDIO_CK e intentarlo.

06, código

El controlador del controlador SDIO de STM32 todavía es muy complicado. ST proporciona el archivo del controlador stm32f2x_sdio_sd.c. Nuestro grupo necesita modificar el controlador GPIO correspondiente.

/**
  * @brief  Initializes the SD Card and put it into StandBy State (Ready for 
  *         data transfer).
  * @param  None
  * @retval None
  */
void SD_LowLevel_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  /* GPIOC and GPIOD Periph clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | SD_DETECT_GPIO_CLK, ENABLE);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);

  /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure PD.02 CMD line */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Configure PC.12 pin: CLK pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  /*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
  /*GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);*/

  /* Enable the SDIO APB2 Clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);

  /* Enable the DMA2 Clock */
  RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);
}

Utilice la configuración predeterminada, como DMA.

Las interfaces funcionales que necesitamos utilizar son

SD_Error SD_Init(void);
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);
SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);

Descarga de verificación

 

Controlador SDIO y dirección de código abierto de PCB de hardware:

https://github.com/strongercjd/STM32F207VCT6

 

Haga clic para ver el álbum donde se encuentra este artículo, tutorial STM32F207

 

Preste atención a la cuenta oficial y reciba actualizaciones de artículos lo antes posible . El área de comentarios no se puede ver a tiempo, puedes ir a la cuenta oficial para comunicarte si necesitas comunicarte

 

Supongo que te gusta

Origin blog.csdn.net/Firefly_cjd/article/details/109406313
Recomendado
Clasificación