2016-12-21 10 views
0

マイクロコントローラSTM32F401RET6に基づくNucleo F401REボードを使用しています。ボードに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

お使いのPCはSDカードとの通信にHALライブラリを使用していません。私は別のSDカードで試して、あなたがより良い運があるかどうかを見てみましょう。 – staringlizard

答えて

0

(機能SystemClock_Configを参照してください)SDIOクロックが有効な範囲内にあることを確認してください:

/* 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となります周波数は、おそらくあなたがあなたの症状を説明します通信でエラーが発生します(> 50MHzの)高すぎる)= 25MHzの

は()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 */ 

    } 


} 
関連する問題