2016-12-21 2 views
0

마이크로 컨트롤러 STM32F401RET6 기반의 Nucleo F401RE 보드를 사용하고 있습니다. 보드에 마이크로 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

PC가 HAL 라이브러리를 사용하여 SD 카드와 통신하지 않습니다. 나는 당신에게 더 나은 운이 있는지보기 위해 또 다른 SD 카드를 가지고 시험해 볼 것이다. – staringlizard

답변

0

당신의 SDIO 시계가 유효 범위 내에 있는지 확인하십시오 (기능 SystemClock_Config 참조) 시계 (RCC_OscInitTypeDef)를 초기화 할 때 위의 정의를 사용하는 경우

/* 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 

SDIO 시계가 될 것입니다 336/(7 * 2) =

25MHz의

은 (아마도 당신은 당신의 증상을 설명 할 것입니다 통신 오류를 얻을 것이다) 주파수가 너무 높은 (>의 50MHz 인 경우 PLL_M이

)가 HSE/HSI와 동일한 점을 감안.

+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 */ 

    } 


} 
관련 문제