Interfaz de tarjeta SD con Pic Mcu - Parte_1

3

Estoy intentando conectar la tarjeta micro SD con PIC MCU utilizando el modo SPI del protocolo SD.

Siendo un principiante, traté de obtener la respuesta R1 de la tarjeta SD enviando el comando '0' a través de SPI, es decir,

0x40
0x00
0x00
0x00
0x00
0x95

Pero no obtengo la respuesta como 0x01 (en modo inactivo) ..

El código fuente es el siguiente (el MCU PIC que estoy usando es PIC32mx360f512l )

/*********************************************************************
 *
 *                 PIC32 - SD card interface
 *
 *********************************************************************
 *
 * Dependencies:    p32xxxx.h
 *
 *
 * Processor:       PIC32
 *
 * Complier:        MPLAB C32
 *                  MPLAB IDE v8.0+
 * Company:         Microchip Technology Inc.
 *
 * Software License Agreement
 *
 *
 ********************************************************************/


#include <p32xxxx.h>
#include <plib.h>

// Config settings
// POSCMOD = HS, FNOSC = PRIPLL, FWDTEN = OFF
// PLLIDIV = DIV_2, PLLMUL = MUL_16
// PBDIV = 8 (default)
// Main clock = 8MHz /2 * 16    = 80MHz
// Peripheral clock = 80MHz /8  =  10MHz

// Configuration Bit settings
// SYSCLK = 80 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK = 10 MHz
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
// WDT OFF
// Other options are don't care
//
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8

#define SYS_FREQ            (40000000L)
void initialize();
void delay(double k);
void write_byte();


int delay_count,loop;
double d1,d2,d3;
int loop_var01 = 0;
int loop_var02 = 0;
int loop_var03 = 0;
int success_flag=0;
int i , j , k , l , m , n , o;
unsigned char  char_01,char_02 , char_03 , char_04 , char_05 , char_06 ,char_07, response_01;
char read_byte();
void toggle_clock();


int main(void)
{
    int delay;
    delay = 250;
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    initialize();
    if(TRISDbits.TRISD2 == 1)       // if rd2 ie., DO is 1, check for flags

    while( 1)
    {
    }

}

void initialize()
{

// initialize the port pin directions
TRISDbits.TRISD0 = 0;
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD2 = 1;
TRISDbits.TRISD3 = 0;

// initialize the SPI card to SPI mode
delay(10);
PORTDbits.RD3 = 1;
PORTDbits.RD1 = 1;


// do this a minimum of 74 times
for(loop_var01=0;loop_var01<80;loop_var01++)
{
 toggle_clock();
}
PORTDbits.RD1 = 0;

write_byte(0x44);
write_byte(0x00);
write_byte(0x00);
write_byte(0x00);
write_byte(0x00);
write_byte(0x95);


response_01 = read_byte();

if (response_01 == 0x01)
    success_flag=1;

else
    success_flag=0;  

}

//write byte ++++++++++++++++++++++++++++++++++

  void write_byte(char_02)
  {
    for(n=7;n>=0;n--)
    {
      if (char_02 & (1<<n))
         {PORTDbits.RD3 = 1;}
      else 
         {PORTDbits.RD3 = 0;}
      toggle_clock();
     } 

  }

//read byte +++++++++++++++++++++++++++++++++++

  char read_byte()
  {
    while(PORTDbits.RD2)   // read the DO input till the the bit becomes 0
    {  
     toggle_clock();
    }

    for (n=0;n<7;n++)
    { if (PORTDbits.RD2)
         { char_03 |=(1<<n); }
      else
         { char_03 &=~(1<<n); }
      toggle_clock();
    }
    return char_03;

  }

//toggle clock +++++++++++++++++++++++++++++++++
void toggle_clock()
{
delay(100000);
PORTDbits.RD0 = 0;
delay(100000);
PORTDbits.RD0 = 1;
delay(100000);
}

//delay ++++++++++++++++++++++++++++++++++++++++
void delay(double k)
{ 
  for(k=0;k<delay_count;k++)
  { for (l=0;l<1000;l++){}}
}

Por favor, ayúdame a averiguar por qué recibo correo no deseado o no recibo

Subpregunta:

¿Cómo pasar el siguiente comando (por ejemplo, command24)?

Quiero decir, ¿cuál es el valor hexadecimal para el comando 24? Aprendí que cada comando debe comenzar con 01 seguido de 'seis bis' correspondientes al número de comando (en este caso es 24) ??

¿Qué se debe llenar dentro de las comillas 0x "" para el comando 24?

¿Cómo pasar argumentos? ¿Cuál es su valor hexadecimal? ¿Es 0x00 de nuevo o algo más?

    
pregunta V V Rao

1 respuesta

1

Podría intentar conectar un analizador lógico al bus. Esto le permitirá volver a verificar la sincronización de su bus SPI y asegurarse de que está enviando lo que cree que está enviando desde el PIC a la tarjeta SD.

Si no tiene un analizador lógico, hay muchos analizadores de bus en el mercado por ~ $ 100 que funcionan muy bien para depurar protocolos seriales como SPI e I2C.
enlace
enlace

    
respondido por el mjh2007

Lea otras preguntas en las etiquetas