2016-12-21 28 views
0

Я использую плату Nucleo F401RE на основе микроконтроллера STM32F401RET6. Я подключился к плате слотом Micro SD и заинтересован в записи данных на SD-карту и считывании данных с нее. Я использовал программное обеспечение STM32CubeX для генерации кода и, в частности, библиотеки SD со встроенными функциями. Я попытался написать простой код, который записывает массив в определенный массив и пытается прочитать одни и те же данные послесловия. Код выглядит следующим образом:Запись данных на микро SD-карту с микроконтроллера STM32F401RET6

uint32_t to_send[512] = {1, 2, 3, 4, 5}; 
uint32_t to_receive[512]; 

int main(void) 
{ 

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
    HAL_Init(); 

    /* Configure the system clock */ 
    SystemClock_Config(); 

    /* Initialize all configured peripherals */ 
    MX_GPIO_Init(); 
    MX_USART2_UART_Init(); 
    MX_SDIO_SD_Init(); 

    char buffer[14] = "Hello, world\n"; 
    uint64_t address = 0x00; 
    HAL_SD_ErrorTypedef write_result = HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1); 
    HAL_SD_ErrorTypedef read_result = HAL_SD_ReadBlocks(&hsd, to_receive, 0x00, 512, 1); 
    HAL_UART_Transmit(&huart2, (uint8_t *) &write_result, 1, 1000); 
    HAL_UART_Transmit(&huart2, (uint8_t *) &read_result, 1, 1000); 


    while (1) 
    { 
     //HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000); 
     HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000); 


} 

Хотя, мне не удастся при записи данных, функция HAL_SD_WriteBlocks() возвращает значение SD_CMD_CRC_FAIL, что означает, что: «ответ команды получил (а проверка CRC не удалось)» , Что мне не хватает? Я проверил аппаратную конфигурацию много раз, и микро SD-карта правильно подключена к микроконтроллеру. При необходимости я могу добавить реализацию встроенных функций HAL. Спасибо.

+0

Получаете ли вы эту ошибку независимо от того, какой сектор написан? Попробуйте написать в другой сектор. Попробуйте с другой SD-картой? – staringlizard

+0

Все те же. Я не пытался заменить SD-карту, но я могу прочитать ее на компьютере, поэтому, я думаю, все в порядке. –

+0

Ваш компьютер не использует библиотеку HAL для связи с SD-картой. Я бы попробовал с другой SD-картой, чтобы увидеть, есть ли у вас больше удачи. – staringlizard

ответ

0

Убедитесь, что SDIO часы находится в пределах допустимых пределов (см функции SystemClock_Config):

/* PLL_VCO = (HSE_VALUE or HSI_VALUE/PLL_M) * PLL_N */ 
#define PLL_M  8 
#define PLL_N  336 

/* SYSCLK = PLL_VCO/PLL_P */ 
#define PLL_P  2 

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO/PLLQ */ 
#define PLL_Q  7 

При использовании Определяет выше при инициализации часов (RCC_OscInitTypeDef) SDIO часы будет 336/(7 * 2) = 25МГц

(Учитывая, что PLL_M такое же, как HSE/HSI)

Если частота слишком высока (> 50МГц), то, возможно, вы получите ошибки в сообщении, которое будет объяснить ваши симптомы.

+0

Я не нахожу эти значения определения в любом из встроенных в файле, может ли он быть определен с другим именем? –

+0

Да, они могут или вообще не могут быть определениями. Попробуйте просмотреть код и найдите ту часть, где инициализируются часы (найдите RCC_OscInitTypeDef). Я не уверен, где это происходит, когда вы используете CubeMX для генерации кода. – staringlizard

0
I didnt use usart for my project, i write the value to sd card and read the value , 
you must arrange the code for your expectations, my code is 


#include "main.h" 
#include "stm32f4xx_hal.h" 

/* USER CODE BEGIN Includes */ 

/* USER CODE END Includes */ 

/* Private variables ---------------------------------------------------------*/ 
SD_HandleTypeDef hsd; 


/* USER CODE BEGIN PV */ 
/* Private variables --------------------------------------------------------*/ 
uint8_t to_send[512] = "sener suat sd card"; 
uint8_t to_receive[512]; 
uint8_t sener[3]={7,5,4}; 

/* USER CODE END PV */ 

/* Private function prototypes -----------------------------------------------*/ 
void SystemClock_Config(void); 
static void MX_GPIO_Init(void); 
static void MX_SDIO_SD_Init(void); 
static void MX_USART2_UART_Init(void); 

/* USER CODE BEGIN PFP */ 
/* Private function prototypes -----------------------------------------------*/ 

/* USER CODE END PFP */ 

/* USER CODE BEGIN 0 */ 

/* USER CODE END 0 */ 

int main(void) 
{ 

    /* USER CODE BEGIN 1 */ 

    /* USER CODE END 1 */ 

    /* MCU Configuration----------------------------------------------------------*/ 

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
    HAL_Init(); 

    /* USER CODE BEGIN Init */ 


    /* USER CODE END Init */ 

    /* Configure the system clock */ 
    SystemClock_Config(); 

    /* USER CODE BEGIN SysInit */ 

    /* USER CODE END SysInit */ 

    /* Initialize all configured peripherals */ 
    MX_GPIO_Init(); 
    MX_SDIO_SD_Init(); 

    /* USER CODE BEGIN 2 */ 
    uint32_t address = 0x55; 
    HAL_SD_MspInit(&hsd); 
    HAL_SD_Init(&hsd); 
    HAL_SD_WriteBlocks(&hsd,to_send,address,1,500); 
    HAL_Delay(100); 
    HAL_SD_ReadBlocks(&hsd,to_receive,address,1,500); 
    /* USER CODE END 2 */ 

    /* Infinite loop */ 
    /* USER CODE BEGIN WHILE */ 
    while (1) 
    { 
    /* USER CODE END WHILE */ 
    /* USER CODE BEGIN 3 */ 

    } 


}