Este proyecto explica cómo conectar la tarjeta SD con un microcontrolador AVR . En este proyecto, utilizamos un microcontrolador ATMEGA16. El microcontrolador funciona con una fuente de alimentación de 5 V con una frecuencia de cristal integrada de 8 MHz. Una tarjeta SDSC de 2 GB de Transcend, pero el código funcionará con la mayoría de las tarjetas SD. La tarjeta SD está formateada con FAT32. El objetivo final de este proyecto es leer un archivo del sistema de archivos FAT32 desde la tarjeta SD.
La tarjeta SD se formateó como FAT32 antes de la interfaz. El código generalizado para FAT32 está escrito para interactuar con la tarjeta SD. En este proyecto se explican explicaciones sobre el sistema de archivos FAT32 y cómo acceder a archivos desde ese sistema de archivos.
La siguiente sección explica en detalle el funcionamiento de la tarjeta SD.
TARJETA SD
La tarjeta SD consta de dos secciones semiconductoras básicas, un ' núcleo de memoria ' y un ' controlador de tarjeta SD '.
El 'núcleo de memoria' es la región de la memoria flash donde se guardan los datos del archivo real. Cuando formateemos la tarjeta SD, se escribirá un sistema de archivos en esta región. Esta es la región donde existe el sistema de archivos.
El 'controlador de tarjeta SD' ayuda a comunicar el 'núcleo de memoria' con dispositivos externos como microcontroladores. Puede responder a ciertos conjuntos de comandos SD estándar y leer o escribir datos desde el núcleo de la memoria al dispositivo externo.
La capacidad del "núcleo de memoria" se denomina tamaño de la tarjeta SD. Además del 'núcleo de memoria', existen ciertos registros asociados con el 'controlador de tarjeta SD'. Estos registros almacenan el estado de la tarjeta SD. El contenido de estos registros es de sólo lectura.
La tarjeta SD se puede conectar al microcontrolador mediante un bus de datos en serie. Se puede conectar mediante 'bus SD' o 'bus SPI'. El 'bus SD' está diseñado para alta velocidad, mientras que el bus SPI sólo puede funcionar a velocidades mucho más bajas. El microcontrolador puede leer o escribir datos en el núcleo de la memoria y leer los registros mediante comandos SD estándar enviados a través de estos buses serie.
En este proyecto, la interfaz de la tarjeta de memoria se realiza mediante el bus SPI. Ciertos comandos no están disponibles para el modo de interfaz SPI y además la velocidad será menor que la del modo SD. Pero este tipo de interfaz es mucho más simple, especialmente debido a que la mayoría de los microcontroladores tienen un módulo de hardware SPI integrado.
Esta sección resume que la tarjeta SD tiene un chip controlador interno, una región de memoria central. El controlador interno puede decodificar los comandos y proporcionar una interfaz en serie, mientras que la región del núcleo de la memoria es donde se implementa el sistema de archivos.
Con base en este conocimiento, la siguiente sección intenta explicar el concepto de capa funcional de la tarjeta SD.
(encabezado = Capas funcionales de la tarjeta SD)
CAPAS FUNCIONALES DE LA TARJETA SD
La parte interna de la tarjeta SD se puede explicar con ayuda del concepto de capa funcional. Básicamente hay tres capas.
1) Capa de interfaz serie
dos) Capa de comando SD
3) Capa del sistema de archivos
Se puede considerar que la 'capa de interfaz serie' y la 'capa de comando SD' residen dentro del 'controlador SD' y la 'capa de sistema de archivos' se puede encontrar dentro del 'núcleo de memoria'. Como el objetivo final de este proyecto es leer un archivo del sistema de archivos FAT32 desde la tarjeta SD, es necesario acceder a las tres capas correctamente.
1) CAPA DE INTERFAZ SERIE
Esta capa proporciona una interfaz serie de la tarjeta SD con el microcontrolador. En este proyecto se utiliza el bus SPI para la interfaz serie. El siguiente diagrama muestra cómo conectar más de una tarjeta SD con un microcontrolador.
En este tipo de interfaz el microcontrolador se llama 'Host' y la tarjeta SD se llama 'Esclava'. El microcontrolador inicia todas las transferencias de datos. El reloj también está controlado por el microcontrolador. El microcontrolador es libre de elegir entre tarjetas SD activando el pin CS (Chip Select) respectivo.
Los datos se transmiten desde el microcontrolador a la tarjeta SD mediante el canal MOSI (Salida maestra y entrada esclava) y los datos se transfieren desde la tarjeta SD al microcontrolador mediante el canal MISO (Entrada maestra y salida esclava).
La configuración de pines de una tarjeta SD para el modo de interfaz SPI se muestra en la siguiente figura.
El microcontrolador utilizado en este proyecto funciona con una fuente de alimentación de 5 V, pero la tarjeta SD solo admite hasta 3,3 V. Los niveles lógicos de 5V y 3,3V son diferentes y pueden causar problemas. Un dispositivo de nivel lógico de 3,3 V puede leer el 0 lógico de un dispositivo de 5 V como 1 lógico. Del mismo modo, el dispositivo de nivel lógico de 5 V puede leer tanto el 0 lógico como el 1 lógico de un dispositivo de nivel lógico de 3,3 V solo como 0 lógico. Este problema se puede solucionar utilizando un convertidor de nivel bidireccional introducido entre los pines SPI del microcontrolador y la tarjeta SD.
A continuación se muestra el diagrama de circuito para la interfaz serie de una tarjeta SD con el microcontrolador, incluido el convertidor de nivel.
El programador es 'USBasp' que también es un dispositivo SPI. Está conectado al bus SPI junto con la tarjeta SD. LM1117 se utiliza para suministrar energía de 3,3 V a la tarjeta SD y también al lado de bajo voltaje del convertidor de nivel. El convertidor de nivel es un dispositivo de cuatro canales con un MOSFET que controla cada canal. Este tipo de convertidor de nivel es adecuado para buses SPI, I2C. La imagen del convertidor de nivel utilizado en este proyecto se muestra a continuación.
La imagen de la tarjeta SD AVR configurada
(encabezado = capa de comando SD)
dos) CAPA DE COMANDO SD
La tarjeta SD sólo acepta un conjunto de comandos SD estándar. Usando estos comandos, un microcontrolador puede leer los registros de la tarjeta SD y también leer/escribir el 'Memory Core'.
Hay seis registros básicos que se encuentran en las tarjetas SD, cuyos detalles se muestran en la siguiente figura:
Todos los comandos SD admitidos en modo SPI tienen una longitud de 6 bytes. El MSB se transmite primero y el comando real ocupa el primer byte. El byte de comando va seguido de sus argumentos de 4 bytes. El último byte es el byte CRC correspondiente a los bytes de comando y argumento.
La estructura de un bloque de comando en el modo de interfaz SPI de una tarjeta SD se muestra en la siguiente figura
CRC solo es necesario para algunos comandos en modo SPI. El CRC utilizado es el CRC de 7 bits, con un polinomio generador dado por
x 7 + x 3 + 1
El cálculo del CRC se presenta a continuación;
G(x) = x 7 + x 3 + 1
M(x) = (bit inicial) ? x 39 + (bit de host) ? x 38 +…+ (último bit antes de CRC) ? x0
CRC (6…0) = Resto ( (M(x) ? x 7 ) / G(x) )
El CRC de 7 bits forma los primeros siete bits del último byte del comando y el octavo bit (bit final) siempre debe estar establecido en uno.
Usando las ecuaciones anteriores y la condición del bit final, el byte CRC para el comando 0 y el comando 8 se calcula como 0x95 y 0x87 respectivamente. Para todos los demás comandos, casi todas las tarjetas SD ignoran el CRC.
Los comandos SD estándar, sus argumentos, tipo de respuesta y descripción se muestran en la siguiente figura.
RESPUESTA AL MANDO
En el modo SPI, la tarjeta SD responde a todos los comandos entrantes utilizando tres tipos básicos de respuesta de comando, R1, R2 y R3. Cada bit del bloque de respuesta contiene algunos detalles específicos sobre el estado de la tarjeta SD.
Respuesta – R1
Respuesta – R2
Respuesta – R3
La respuesta R3 solo está disponible para el comando 58 (READ_OCR).
COMANDOS PARA ESCRIBIR DATOS
Los datos se pueden escribir en el 'Núcleo de memoria' de la tarjeta SD usando los siguientes comandos seguidos de los datos reales;
WRITE_BLOCK : escribe datos en un solo bloque
WRITE_MULTIPLE_BLOCK : escribe datos en varios bloques
ESCRIBIR_BLOQUE
En una tarjeta SD, un bloque siempre se considera ubicaciones de memoria consecutivas de 512 bytes. Supongamos que es necesario escribir un bloque de la ubicación de memoria 2000 con algunos datos usando el comando WRITE_BLOCK. El paquete de comandos debería ser similar al que se muestra a continuación;
1er byte (comando) – 0x18
2 y para el quinto byte (argumento) – 0x000007d0 (Incluso si no hay argumentos para otros comandos, este campo debe establecerse en cero)
6to byte (CRC): cualquier valor
Una vez que se envía el comando, el microcontrolador debería recibir la respuesta R1. Todos los bits de la respuesta deben ser cero. Después de recibir el byte de respuesta R1 con un valor cero, el microcontrolador puede enviar los datos para escribirlos en la tarjeta SD. La longitud de los datos debe ser de 512 bytes, incluso si los datos reales tienen menos bytes.
Los datos de 512 bytes deben ir precedidos por un byte de token de datos y deben terminar con un byte CRC de 16 bits. Estos 1 + 512 + 2 = 515 bytes forman un paquete de datos. El token de datos es un byte con todos los bits excepto el LSB configurado en 1 (0xFE). El formato del paquete de datos se muestra a continuación:
Para escribir el siguiente bloque de datos, se debe enviar nuevamente el comando WRITE_BLOCK.
ESCRIBIR_MULTIPLE_BLOCK
El comando WRITE_MULTIPLE_BLOCK se diferencia de WRITE_BLOCK en que este comando debe enviarse solo una vez y los siguientes paquetes de datos de 512 bytes se escribirán en los bloques de memoria consecutivos.
RESPUESTA DE DATOS
Para cada bloque de datos escrito, la tarjeta SD envía un byte de respuesta al microcontrolador. El contenido del byte de respuesta se proporciona de la siguiente manera:
(encabezado= Comandos para leer datos e inicializar la tarjeta)
COMANDOS PARA LECTURA DE DATOS
Los datos se pueden leer desde la tarjeta SD 'Memory Core' usando los siguientes comandos;
READ_SINGLE_BLOCK : lee datos de un solo bloque
READ_MULTIPLE_BLOCK : lee datos de varios bloques
READ_SINGLE_BLOCK
En una tarjeta SD, un bloque siempre se considera ubicaciones de memoria consecutivas de 512 bytes. Supongamos que es necesario leer un bloque de la ubicación de memoria número 2000 utilizando el comando READ_SINGLE_BLOCK. El paquete de comandos debería ser similar al que se muestra a continuación;
1er byte (comando) – 0x11
2 y para el quinto byte (argumento) – 0x000007d0 (Incluso si no hay argumentos para otros comandos, este campo debe establecerse en cero)
6to byte (CRC): cualquier valor
Una vez que se envía el comando, el microcontrolador debería recibir la respuesta R1. Todos los bits de la respuesta deben ser cero. Después de recibir el byte de respuesta R1 de valor cero, el microcontrolador puede leer los datos de la tarjeta SD. La tarjeta SD enviará datos de 512 bytes en respuesta a cada comando READ_SINGLE_BLOCK.
FICHA DE DATOS
La lectura de datos de 512 bytes debe ir precedida de un byte de token de datos y debe finalizar con un byte CRC de 16 bits. Estos 1 + 512 + 2 = 515 bytes forman un paquete de datos. El token de datos es un byte con todos los bits excepto el LSB configurado en 1 (0xFE). El formato del paquete de datos se muestra a continuación:
Si ocurre algún problema durante el proceso de lectura, el microcontrolador solo recibirá un token de error de datos de un solo byte. Los bits del token de error de datos representan el tipo de error que ocurrió. El token de error de datos se muestra a continuación:
Para leer el siguiente bloque de datos, se debe enviar nuevamente el comando READ_SINGLE_BLOCK.
READ_MULTIPLE_BLOCK
El comando READ_MULTIPLE_BLOCK difiere de READ_SINGLE_BLOCK en que este comando debe enviarse solo una vez y las ubicaciones de memoria consecutivas de 512 bytes se leerán continuamente.
COMANDOS PARA INICIALIZAR LA TARJETA DE MEMORIA
Antes de que la tarjeta de memoria pueda responder a estos comandos, debe inicializarse en modo SPI. Ciertos comandos deben enviarse uno tras otro para inicializar la tarjeta SD. La tarjeta SD estará en modo de interfaz SD al reiniciar. Por lo tanto, el primer comando enviado a la tarjeta SD debe incluir el byte CRC correcto.
Los pasos necesarios para iniciar la tarjeta SD en modo SPI usando comandos son los siguientes:
Una vez inicializada la tarjeta SD, podemos comenzar a usar los comandos de lectura y escritura. Comandos de capa de comando SD como READ_SINGLE_BLOCK, READ_MULTIPLE_BLOCK, WRITE_BLOCK, etc. se utilizan principalmente para interactuar con la capa del sistema de archivos.
La siguiente sección explica las características del sistema de archivos FAT32 y muestra cómo se pueden leer los datos en esta implementación del sistema de archivos.
(encabezado = capa del sistema de archivos)
3) CAPA DEL SISTEMA DE ARCHIVOS
Esta sección explica en detalle la implementación del sistema de archivos FAT32 de la tarjeta SD. El sistema de archivos FAT32 se escribe en 'Memory Core' cuando se formatea. FAT32 significa Tabla de asignación de archivos 32, lo que significa que tiene una tabla de asignación de archivos de 32 bits.
Todos los datos de un archivo se mezclan en el núcleo de memoria y la FAT (tabla de asignación de archivos) mantiene la ubicación del siguiente bloque correspondiente a la ubicación del bloque actual.
SECTORES
El Memory Core tiene ubicaciones de memoria de 8 bits (1 byte). Las ubicaciones de memoria consecutivas de 8 bits se agrupan en 'Sectores'. Un sector FAT32 generalmente tiene 512 bytes por sector. La agrupación de bytes de memoria para formar Sectores se muestra en la siguiente figura.
CONJUNTOS
Los sectores consecutivos se agrupan para formar 'grupos'. La cantidad de sectores por clúster depende del tamaño de todo el sistema de archivos. La agrupación de Sectores para formar Clústeres se muestra en la siguiente figura.
ALMACENAMIENTO ENVASADO
Todos los datos de un archivo se mezclan en el Memory Core como grupos de datos. La siguiente figura muestra cómo los datos de tres archivos llamados A, B, C se mezclan en Memory Core. FAT (Tabla de asignación de archivos) mantiene la ubicación del siguiente clúster correspondiente a la ubicación del clúster actual del archivo.
FORMATO DEL SISTEMA DE ARCHIVOS FAT32
El sistema de archivos FAT32 se almacena o escribe dentro del Memory Core en un formato definido específico. Hay ciertos sectores definidos al comienzo del núcleo de memoria seguidos de clústeres. El formato de un sistema de archivos FAT32 se muestra a continuación:
El primer sector es el MBR (Master Boot Record), que sigue a una cantidad significativa de sectores no utilizados. A los sectores no utilizados les siguen los sectores reservados, entre los cuales el primer sector es el sector BOOT. A los sectores reservados les siguen los sectores FAT. La cantidad de sectores FAT depende del tamaño del sistema de archivos. A los sectores FAT les siguen algunos sectores ocultos. A los sectores ocultos les siguen los clústeres.
MBR
El MBR (Master Boot Record) es el primer sector del 'Memory Core' y tiene como objetivo almacenar información sobre las particiones dentro del sistema de archivos. MBR puede contener detalles de cuatro particiones fundamentales. MBR tiene un sector y los bytes importantes de MBR se muestran a continuación.
Los bytes de información de partición tienen 16 bytes de longitud y cada uno de ellos contiene información importante sobre las particiones correspondientes. El último byte del MBR es el byte de firma que contiene un valor específico (0xAA55 para FAT32) que se puede usar para verificar si el sector es MBR o no. El primer número de sector de cuatro bytes de la partición se puede leer desde el bit 8 al 11 de los bytes de información de la partición, como se muestra a continuación:
SECTOR INICIO
El sector de arranque es el primer sector dentro de una partición. Este sector contiene todos los detalles valiosos sobre el sistema de archivos dentro de esa partición en particular.
Los primeros dos bytes son bytes de verificación que juntos contienen un valor específico, generalmente 0xE9 o 0xEB. Los bytes 11 y 12 , cuando se leen juntos, dan la cantidad de bytes por sector para el sistema de archivos. FAT32 generalmente tiene 512 bytes por sector. El decimotercer byte contiene el número de sectores por clúster para el sistema de archivos. Los bytes 14 y 15 juntos leen el número de sectores reservados antes de las FAT, comenzando al principio de la partición. El bit 16 contiene el valor de la cantidad de FAT en el sistema de archivos. Los 4 bytes del byte 27 al 30 se pueden leer juntos para obtener el número de sectores ocultos entre las FAT y el primer grupo de la partición. Los 4 bytes del byte 43 al 46 contienen la dirección del clúster raíz, que es el primer clúster de la partición (normalmente 2). Los bytes 47 y 48 se pueden leer juntos para obtener la ubicación del sector donde se almacena la información del archivo (sector de directorio).
SECTOR INFORMACIÓN FS
El número de sector del sector de información FS se obtiene de los bytes 47 y 48 del sector de arranque. Contiene el estado actual de los Clústeres. Puede contener el valor del número total de clústeres actualmente libres y también el número de clúster del siguiente clúster libre dentro del sistema de archivos, como se muestra a continuación:
SECTOR DIRECTORIO FS
Es el primer sector dentro del primer grupo del sistema de archivos. El primer Clúster siempre comienza con el Clúster número 2. También es el primer Sector de Datos de la partición. El directorio FS tiene 32 bytes y, por lo tanto, hay 16 directorios FS por sector de directorio FS. El número de sector del primer sector del directorio FS se puede encontrar usando la siguiente ecuación:
DIR_SECTOR_NUM = NO. DE SECTORES RESERVADOS + NO. DE GRASA + NO.
Cada directorio FS contiene detalles importantes sobre un único archivo, como se muestra en la siguiente figura:
Los primeros 11 bytes contienen el nombre del archivo y el undécimo byte contiene el atributo del archivo. El atributo byte se utiliza para verificar un archivo válido. El contenido de bytes del atributo se muestra en la siguiente figura:
Los bytes 20 y 21 juntos contienen los bytes superiores del primer número de grupo del archivo, mientras que los bytes 26 y 27 contienen los bytes inferiores del primer número de grupo del archivo. Los últimos cuatro bytes contienen el tamaño del archivo.
LA LÓGICA PARA LEER UN ARCHIVO DEL SISTEMA DE ARCHIVOS FAT32
Se puede leer un archivo con un nombre específico desde el sistema de archivos formateado FAT32 usando la lógica que se muestra a continuación; Mire más de cerca y verá que todo el proceso finalmente termina con una lectura del Sector. Esta lectura del sector central de la memoria de la tarjeta SD se puede obtener utilizando el comando READ_SINGLE_BLOCK desde la capa de comando SD únicamente.
(encabezado= Usando FAT32)
USO DE FAT32 (TABLA DE ASIGNACIÓN DE ARCHIVOS 32)
FAT32 son sectores en los que cada 32 bits consecutivos juntos contienen el número de clusters. Simplemente cada 32 bits apunta a un grupo específico. Dado que un clúster suele tener 512 bytes, habrá 128 punteros de clúster dentro del sector. Esto forma la tabla de asignación de archivos 32 FAT32.
El siguiente número de puntero de grupo dentro de FAT32 correspondiente a un número de grupo actual se puede calcular utilizando la siguiente ecuación
NÚMERO DE SECTOR DE GRASA PARA EL SIGUIENTE PUNTERO DE GRUPO = NÚMERO DE PARTICIÓN DEL PRIMER SECTOR
+ NÚMERO DE SECTORES RESERVADOS
+ ((NÚMERO DE GRUPO ACTUAL * 4)
/BYTES POR SECTOR)
La siguiente figura muestra el método para leer un archivo que ha sido codificado en la memoria flash 'Memory Core' usando FAT32.
El amarillo indica los clústeres que tienen datos de archivos específicos y los punteros de clúster correspondientes dentro de FAT32. Las líneas rojas indican la búsqueda del siguiente puntero del clúster correspondiente al clúster actual y la línea verde indica la búsqueda del siguiente clúster utilizando el número de clúster almacenado en los punteros del clúster FAT32.
LOS DETALLES DE CODIFICACIÓN
Como hay tres capas funcionales, a saber, la capa de interfaz serie, la capa de comando SD y la capa de sistema de archivos, la codificación también se realiza para cada una de las capas por separado y luego se combina. Las capas de código se muestran en la siguiente figura:
El microcontrolador lee y escribe datos utilizando la capa del sistema de archivos. La capa del sistema de archivos interactúa con la capa de comando SD usando solo el comando READ_SINGLE_BLOCK. La capa de comando SD interactúa con la capa de interfaz serie mediante llamadas a funciones de transmisión SPI y recepción SPI. Todo el sistema de microcontrolador interactúa con la tarjeta SD mediante la interfaz de bus SPI.
Se han utilizado punteros de función para una interacción efectiva entre diferentes capas. Se utilizaron estructuras y asignación de memoria dinámica para almacenar y acceder a 512 bytes de datos a la vez.