¿Cuál es la dirección para enviar datos a la tarjeta micro sd?

-1

Estoy intentando enviar el ángulo calculado (flotante) desde un sensor de giroscopio externo conectado a un tablero de descubrimiento stm32f4 a una tarjeta SD a través de SPI .

Tengo el siguiente código para la inicialización, el envío de datos y la recepción de datos y estoy pensando que puedo enviar datos y luego usar la función de lectura para leer desde la misma dirección y verificar si las dos funciones funcionan correctamente o no, pero aquí es el problema No sé cuál debe ser la dirección de inicio de mi tarjeta micro sd hc . Además, ¿cómo debo aumentar para la siguiente dirección de ángulo si mi dirección de inicio es 0000 dado que el ángulo anterior es de tipo flotante (4 bytes)?

Código de inicialización SPI:

 void mySPI_Init(void){


RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

SPI_InitTypeDef SPI_InitTypeDefStruct;


SPI_InitTypeDefStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitTypeDefStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitTypeDefStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitTypeDefStruct.SPI_CPOL = SPI_CPOL_High;
SPI_InitTypeDefStruct.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitTypeDefStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitTypeDefStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitTypeDefStruct.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_Init(SPI1, &SPI_InitTypeDefStruct);


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE , ENABLE);

GPIO_InitTypeDef GPIO_InitTypeDefStruct;

GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitTypeDefStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitTypeDefStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitTypeDefStruct);

GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitTypeDefStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitTypeDefStruct.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOE, &GPIO_InitTypeDefStruct);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

GPIO_SetBits(GPIOE, GPIO_Pin_3);


SPI_Cmd(SPI1, ENABLE);

}

Función de envío de datos:

void mySPI_SendData(uint8_t adress, uint8_t data){
//uint8_t adress is the address where data has to be sent to
//uint8_t data is the data that has to be sent i.e floating angle

GPIO_ResetBits(GPIOE, GPIO_Pin_3);

while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); 
SPI_I2S_SendData(SPI1, adress);
while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);

while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); 
SPI_I2S_SendData(SPI1, data);
while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);

GPIO_SetBits(GPIOE, GPIO_Pin_3);
}

Función de obtención de datos:

uint8_t mySPI_GetData(uint8_t adress){

GPIO_ResetBits(GPIOE, GPIO_Pin_3); 

adress = 0x80 | adress;

while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); 
SPI_I2S_SendData(SPI1, adress);
while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1); //Clear RXNE bit

while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); 
SPI_I2S_SendData(SPI1, 0x00); //Dummy byte to generate clock
while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE));

GPIO_SetBits(GPIOE, GPIO_Pin_3);

return  SPI_I2S_ReceiveData(SPI1);
}
    
pregunta Zero_Cool

1 respuesta

2
  

No sé cuál debería ser la dirección de inicio de mi tarjeta micro sd hc.

Las tarjetas SD / SDHC son mucho más complejas de acceder. Su mejor apuesta es el software de terceros: vea el código de ejemplo de FATFS en STM32Cube, por ejemplo.

Si realmente desea saberlo: la especificación se puede encontrar en sdcard.org .

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas