STM32F4xx 의 SDIO 통신방식으로 u-SD Card 를 다뤄 보겠습니다.
여러가지 예제를 보고 그대로 했는데도 자꾸 실수를 하는 바람에,
동작 시키기까지 하루 종일 걸렸네요. ^^
SD 카드 모듈은 Waveshare 에서 만든 그냥 u-SD Card 모듈인데, 엘레파츠에서 샀습니다.
Nucleo 보드와 SD Card 모듈의 H/W 연결은 다음과 같습니다.
실제 연결한 그림입니다. 사진을 잘 못 찍어서 이렇네요. ^^
SDIO의 큐브에서 설정은 다음과 같습니다. SDIO 를 넣었더니 clock 설정에서 APB1 peripheral clocks(MHz) 가 42MHz 이하로 줄여야 한다고 에러가 나서 42MHz로 맞추다 보니 시스템 클럭은 84MHz로 줄어 버렸습니다.
SDIO 4Bit 핀아웃은 다음과 같습니다. 데이터버스 4개,CLK,CMD 로 총 6개의 I/O 가 사용되고 경우에 따라서 CD(Card Detect) 입력을 1개 쓸 수도 있습니다. 일단은 테스트니까, CD는 사용 안했습니다.
프로그램은 그냥 Polling으로 처리했습니다. 나중에 DMA를 사용하면 아주 빠르다고 하네요.
프로그램은
1. SD card 초기화하고,
2. 텍스트 파일을 1개 만들어서 ,
3. 파일에 스트링을 몇자 쓰고 ,
4. 파일을 닫아서,
5. PC에서 SD Card를 읽어서 확인해 봤습니다.
다른 것은 별 어려움이 없었는데, 4Bit Wire로 바꾸는 것이 좀 어려웠습니다.
어딘가에서 바뀔 수도 있는지 모르겠는데, BSP_SD_Init(); 함수를 실행해야 4비트 방식으로 바뀌는 것인데..
프로그램 어디에도 BSP_SD_Init();함수를 실행하지를 않아서 SD Card 초기화 하고 나서 main()함수안에 BSP_SD_Init(); 함수를 실행하도록 수정했습니다.
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t i;
char tx_buf[100];
uint8_t file_path[13] = "testfile.txt";
file_path[12] = '\0';
uint8_t testBuffer[16] = "SD write success";
UINT testBytes;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* 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_DMA_Init();
MX_TIM3_Init();
MX_USART2_UART_Init();
MX_I2C1_Init();
MX_SDIO_SD_Init();
MX_FATFS_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
for (i=0;i<10;i++)
{
sprintf(tx_buf,"UART Test ... [%3d] \n\r",i);
HAL_UART_Transmit(&huart2,(uint8_t *)tx_buf,cus_Size_of(tx_buf),3);
}
HAL_TIM_Base_Start_IT(&htim3);
BSP_SD_Init();
:
:
:
}
다음은 이 프로그램에 의해 UART로 response 를 출력해 본 내용입니다. (제가 디버그용으로 UART를 주로 쓰는 편이라..)
response 가 0 이면 정상입니다.
다음은 SD card 내용과 그안에 만들어진 텍스트 파일의 내용입니다.
소스파일 첨부 합니다.
'STM32F4' 카테고리의 다른 글
[STM32F4xx] Nucleo 보드 테스트 #9(SPI Polling:KEIL) (0) | 2016.12.01 |
---|---|
[STM32F4xx] Nucleo 보드 테스트 #8(SDIO CLK 설정:KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #6(I2C 2/2 인터럽트:KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #5(I2C 1/2 :KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #4(UART2 Interrupt:KEIL) (0) | 2016.12.01 |