SD for DISCO_F746NG basic demo

Dependencies:   BSP_DISCO_F746NG

Committer:
Jerome Coutant
Date:
Wed Nov 20 12:55:12 2019 +0100
Revision:
4:85319532f755
Parent:
3:33086de19b14
Update with STM32Cube_FW_F7_V1.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adustm 0:99e26e18b424 1 #include "mbed.h"
Jerome Coutant 4:85319532f755 2 #include "stm32746g_discovery_sd.h"
adustm 0:99e26e18b424 3
adustm 0:99e26e18b424 4 #define BLOCK_START_ADDR 0 /* Block start address */
adustm 0:99e26e18b424 5 #define NUM_OF_BLOCKS 5 /* Total number of blocks */
adustm 0:99e26e18b424 6 #define BUFFER_WORDS_SIZE ((BLOCKSIZE * NUM_OF_BLOCKS) >> 2) /* Total data size in bytes */
Jerome Coutant 4:85319532f755 7
adustm 0:99e26e18b424 8 uint32_t aTxBuffer[BUFFER_WORDS_SIZE];
adustm 0:99e26e18b424 9 uint32_t aRxBuffer[BUFFER_WORDS_SIZE];
Jerome Coutant 4:85319532f755 10
adustm 0:99e26e18b424 11 /* Private function prototypes -----------------------------------------------*/
adustm 0:99e26e18b424 12 void SD_main_test(void);
adustm 0:99e26e18b424 13 void SD_Detection(void);
adustm 0:99e26e18b424 14
adustm 0:99e26e18b424 15 static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset);
Jerome Coutant 4:85319532f755 16 static uint8_t Buffercmp(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength);
Jerome Coutant 4:85319532f755 17
adustm 0:99e26e18b424 18 int main()
adustm 0:99e26e18b424 19 {
adustm 3:33086de19b14 20 uint8_t SD_state = MSD_OK;
Jerome Coutant 4:85319532f755 21 static uint8_t prev_status = SD_PRESENT;
Jerome Coutant 4:85319532f755 22
Jerome Coutant 4:85319532f755 23 printf("\n\nSD example start:\n");
Jerome Coutant 4:85319532f755 24
Jerome Coutant 4:85319532f755 25 SD_state = BSP_SD_Init();
Jerome Coutant 4:85319532f755 26 if (SD_state != MSD_OK) {
Jerome Coutant 4:85319532f755 27 if (SD_state == MSD_ERROR_SD_NOT_PRESENT) {
Jerome Coutant 4:85319532f755 28 printf("SD shall be inserted before running test\n");
adustm 0:99e26e18b424 29 } else {
Jerome Coutant 4:85319532f755 30 printf("SD Initialization : FAIL.\n");
adustm 0:99e26e18b424 31 }
Jerome Coutant 4:85319532f755 32 printf("SD Test Aborted.\n");
adustm 0:99e26e18b424 33 } else {
Jerome Coutant 4:85319532f755 34 printf("SD Initialization : OK.\n");
adustm 0:99e26e18b424 35
Jerome Coutant 4:85319532f755 36 SD_state = BSP_SD_Erase(BLOCK_START_ADDR, (BLOCK_START_ADDR + NUM_OF_BLOCKS - 1));
adustm 3:33086de19b14 37
adustm 3:33086de19b14 38 /* Wait until SD card is ready to use for new operation */
Jerome Coutant 4:85319532f755 39 while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
adustm 3:33086de19b14 40 }
Jerome Coutant 4:85319532f755 41 if (SD_state != MSD_OK) {
Jerome Coutant 4:85319532f755 42 printf("SD ERASE : FAILED.\n");
Jerome Coutant 4:85319532f755 43 printf("SD Test Aborted.\n");
adustm 0:99e26e18b424 44 } else {
Jerome Coutant 4:85319532f755 45 printf("SD ERASE : OK.\n");
Jerome Coutant 4:85319532f755 46
adustm 0:99e26e18b424 47 /* Fill the buffer to write */
adustm 3:33086de19b14 48 Fill_Buffer(aTxBuffer, BUFFER_WORDS_SIZE, 0x2300);
Jerome Coutant 4:85319532f755 49
Jerome Coutant 4:85319532f755 50 SD_state = BSP_SD_WriteBlocks(aTxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10000);
adustm 3:33086de19b14 51 /* Wait until SD card is ready to use for new operation */
Jerome Coutant 4:85319532f755 52 while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
adustm 3:33086de19b14 53 }
adustm 3:33086de19b14 54
Jerome Coutant 4:85319532f755 55 if (SD_state != MSD_OK) {
Jerome Coutant 4:85319532f755 56 printf("SD WRITE : FAILED.\n");
Jerome Coutant 4:85319532f755 57 printf("SD Test Aborted.\n");
adustm 0:99e26e18b424 58 } else {
Jerome Coutant 4:85319532f755 59 printf("SD WRITE : OK.\n");
Jerome Coutant 4:85319532f755 60
Jerome Coutant 4:85319532f755 61 SD_state = BSP_SD_ReadBlocks(aRxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10000);
adustm 3:33086de19b14 62 /* Wait until SD card is ready to use for new operation */
Jerome Coutant 4:85319532f755 63 while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
adustm 3:33086de19b14 64 }
adustm 3:33086de19b14 65
Jerome Coutant 4:85319532f755 66 if (SD_state != MSD_OK) {
Jerome Coutant 4:85319532f755 67 printf("SD READ : FAILED.\n");
Jerome Coutant 4:85319532f755 68 printf("SD Test Aborted.\n");
adustm 0:99e26e18b424 69 } else {
Jerome Coutant 4:85319532f755 70 printf("SD READ : OK.\n");
Jerome Coutant 4:85319532f755 71 if (Buffercmp(aTxBuffer, aRxBuffer, BUFFER_WORDS_SIZE) > 0) {
Jerome Coutant 4:85319532f755 72 printf("SD COMPARE : FAILED.\n");
Jerome Coutant 4:85319532f755 73 printf("SD Test Aborted.\n");
adustm 0:99e26e18b424 74 } else {
Jerome Coutant 4:85319532f755 75 printf("SD Test : OK.\n");
Jerome Coutant 4:85319532f755 76 printf("SD can be removed.\n");
adustm 0:99e26e18b424 77 }
adustm 0:99e26e18b424 78 }
adustm 0:99e26e18b424 79 }
adustm 0:99e26e18b424 80 }
adustm 0:99e26e18b424 81 }
Jerome Coutant 4:85319532f755 82
adustm 0:99e26e18b424 83 while (1) {
Jerome Coutant 4:85319532f755 84 if (BSP_SD_IsDetected() != SD_PRESENT) {
Jerome Coutant 4:85319532f755 85 if (prev_status != SD_NOT_PRESENT) {
Jerome Coutant 4:85319532f755 86 BSP_SD_Init();
Jerome Coutant 4:85319532f755 87 prev_status = SD_NOT_PRESENT;
Jerome Coutant 4:85319532f755 88 printf("SD removed\n");
Jerome Coutant 4:85319532f755 89 }
Jerome Coutant 4:85319532f755 90 } else if (prev_status != SD_PRESENT) {
Jerome Coutant 4:85319532f755 91 printf("SD detected\n");
Jerome Coutant 4:85319532f755 92 prev_status = SD_PRESENT;
Jerome Coutant 4:85319532f755 93 }
adustm 0:99e26e18b424 94 }
Jerome Coutant 4:85319532f755 95 }
adustm 0:99e26e18b424 96
adustm 0:99e26e18b424 97 /**
adustm 0:99e26e18b424 98 * @brief Fills buffer with user predefined data.
adustm 0:99e26e18b424 99 * @param pBuffer: pointer on the buffer to fill
adustm 0:99e26e18b424 100 * @param uwBufferLenght: size of the buffer to fill
adustm 0:99e26e18b424 101 * @param uwOffset: first value to fill on the buffer
adustm 0:99e26e18b424 102 * @retval None
adustm 0:99e26e18b424 103 */
adustm 0:99e26e18b424 104 static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLength, uint32_t uwOffset)
adustm 0:99e26e18b424 105 {
Jerome Coutant 4:85319532f755 106 uint32_t tmpIndex = 0;
adustm 0:99e26e18b424 107
Jerome Coutant 4:85319532f755 108 /* Put in global buffer different values */
Jerome Coutant 4:85319532f755 109 for (tmpIndex = 0; tmpIndex < uwBufferLength; tmpIndex++) {
Jerome Coutant 4:85319532f755 110 pBuffer[tmpIndex] = tmpIndex + uwOffset;
Jerome Coutant 4:85319532f755 111 }
adustm 0:99e26e18b424 112 }
Jerome Coutant 4:85319532f755 113
adustm 0:99e26e18b424 114 /**
adustm 0:99e26e18b424 115 * @brief Compares two buffers.
adustm 0:99e26e18b424 116 * @param pBuffer1, pBuffer2: buffers to be compared.
adustm 0:99e26e18b424 117 * @param BufferLength: buffer's length
adustm 0:99e26e18b424 118 * @retval 1: pBuffer identical to pBuffer1
adustm 0:99e26e18b424 119 * 0: pBuffer differs from pBuffer1
adustm 0:99e26e18b424 120 */
Jerome Coutant 4:85319532f755 121 static uint8_t Buffercmp(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength)
adustm 0:99e26e18b424 122 {
Jerome Coutant 4:85319532f755 123 while (BufferLength--) {
Jerome Coutant 4:85319532f755 124 if (*pBuffer1 != *pBuffer2) {
Jerome Coutant 4:85319532f755 125 return 1;
Jerome Coutant 4:85319532f755 126 }
Jerome Coutant 4:85319532f755 127
Jerome Coutant 4:85319532f755 128 pBuffer1++;
Jerome Coutant 4:85319532f755 129 pBuffer2++;
adustm 0:99e26e18b424 130 }
adustm 0:99e26e18b424 131
Jerome Coutant 4:85319532f755 132 return 0;
adustm 0:99e26e18b424 133 }
adustm 0:99e26e18b424 134