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?