|  | @@ -1,479 +0,0 @@
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
 | 
	
		
			
				|  |  | -index 4df41a0..7312d0e 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
 | 
	
		
			
				|  |  | -@@ -178,7 +178,6 @@
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | - /* Includes ------------------------------------------------------------------*/
 | 
	
		
			
				|  |  | - #include "stm32f2xx_hal.h"
 | 
	
		
			
				|  |  | --
 | 
	
		
			
				|  |  | - #ifdef HAL_SD_MODULE_ENABLED
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | - /** @addtogroup STM32F2xx_HAL_Driver
 | 
	
		
			
				|  |  | -@@ -893,7 +892,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
 | 
	
		
			
				|  |  | -                                 SDIO_IT_STBITERR));
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /* Enable SDIO DMA transfer */
 | 
	
		
			
				|  |  | --  __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -+  // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /* Configure DMA user callbacks */
 | 
	
		
			
				|  |  | -   hsd->hdmarx->XferCpltCallback  = SD_DMA_RxCplt;
 | 
	
		
			
				|  |  | -@@ -902,26 +901,29 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
 | 
	
		
			
				|  |  | -   /* Enable the DMA Stream */
 | 
	
		
			
				|  |  | -   HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
 | 
	
		
			
				|  |  | -+  
 | 
	
		
			
				|  |  | -   if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
 | 
	
		
			
				|  |  | -   {
 | 
	
		
			
				|  |  | -     BlockSize = 512;
 | 
	
		
			
				|  |  | -     ReadAddr /= 512;
 | 
	
		
			
				|  |  | --  }
 | 
	
		
			
				|  |  | -+  } else {
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | --  /* Set Block Size for Card */ 
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
 | 
	
		
			
				|  |  | --  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | -+    /* Set Block Size for Card */ 
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | --  /* Check for error conditions */
 | 
	
		
			
				|  |  | --  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
 | 
	
		
			
				|  |  | -+    /* Check for error conditions */
 | 
	
		
			
				|  |  | -+    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | --  if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | --  {
 | 
	
		
			
				|  |  | --    return errorstate;
 | 
	
		
			
				|  |  | -+    if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | -+    {
 | 
	
		
			
				|  |  | -+      return errorstate;
 | 
	
		
			
				|  |  | -+    }
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /* Configure the SD DPSM (Data Path State Machine) */ 
 | 
	
		
			
				|  |  | -@@ -931,6 +933,11 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the
 | 
	
		
			
				|  |  | -+  // data is just discarded before the dpsm is started.
 | 
	
		
			
				|  |  | -+  __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -   SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /* Check number of blocks command */
 | 
	
		
			
				|  |  | -@@ -1017,28 +1024,30 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
 | 
	
		
			
				|  |  | -   HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   /* Enable SDIO DMA transfer */
 | 
	
		
			
				|  |  | --  __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -+  // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -+  
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
 | 
	
		
			
				|  |  | -+  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
 | 
	
		
			
				|  |  | -   {
 | 
	
		
			
				|  |  | -     BlockSize = 512;
 | 
	
		
			
				|  |  | -     WriteAddr /= 512;
 | 
	
		
			
				|  |  | --  }
 | 
	
		
			
				|  |  | -+  } else {
 | 
	
		
			
				|  |  | -+  	/* Set Block Size for Card */ 
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | --  /* Set Block Size for Card */ 
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
 | 
	
		
			
				|  |  | --  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
 | 
	
		
			
				|  |  | --  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | -+    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | --  /* Check for error conditions */
 | 
	
		
			
				|  |  | --  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
 | 
	
		
			
				|  |  | -+    /* Check for error conditions */
 | 
	
		
			
				|  |  | -+    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | --  if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | --  {
 | 
	
		
			
				|  |  | --    return errorstate;
 | 
	
		
			
				|  |  | -+    if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | -+    {
 | 
	
		
			
				|  |  | -+      return errorstate;
 | 
	
		
			
				|  |  | -+    }
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /* Check number of blocks command */
 | 
	
		
			
				|  |  | -@@ -1049,13 +1058,34 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   else
 | 
	
		
			
				|  |  | -   {
 | 
	
		
			
				|  |  | -+    /* MM: Prepare for write */
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
 | 
	
		
			
				|  |  | -+    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | -+    errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
 | 
	
		
			
				|  |  | -+    if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | -+    {
 | 
	
		
			
				|  |  | -+      return errorstate;
 | 
	
		
			
				|  |  | -+    }
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.Argument         = (uint32_t)NumberOfBlocks;
 | 
	
		
			
				|  |  | -+    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCK_COUNT;
 | 
	
		
			
				|  |  | -+    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | -+    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCK_COUNT);
 | 
	
		
			
				|  |  | -+    if (errorstate != SD_OK)
 | 
	
		
			
				|  |  | -+    {
 | 
	
		
			
				|  |  | -+      return errorstate;
 | 
	
		
			
				|  |  | -+    }
 | 
	
		
			
				|  |  | -+  
 | 
	
		
			
				|  |  | -+    /* /MM */
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -     /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
 | 
	
		
			
				|  |  | -     sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | --  
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -   sdio_cmdinitstructure.Argument         = (uint32_t)WriteAddr;
 | 
	
		
			
				|  |  | -   SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -   /* Check for error conditions */
 | 
	
		
			
				|  |  | -   if(NumberOfBlocks > 1)
 | 
	
		
			
				|  |  | -   {
 | 
	
		
			
				|  |  | -@@ -1078,6 +1108,11 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
 | 
	
		
			
				|  |  | -   sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the
 | 
	
		
			
				|  |  | -+  // data is just discarded before the dpsm is started.
 | 
	
		
			
				|  |  | -+  __HAL_SD_SDIO_DMA_ENABLE();
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -   SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   hsd->SdTransferErr = errorstate;
 | 
	
		
			
				|  |  | -@@ -1116,7 +1151,9 @@ HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Ti
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   timeout = Timeout;
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | --  /* Wait until the Rx transfer is no longer active */
 | 
	
		
			
				|  |  | -+  /* Wait until the Rx transfer is no longer active. IE. fifo is empty.
 | 
	
		
			
				|  |  | -+Once FIFO is empty, the DMA will have finished and DmaTransferCplt should
 | 
	
		
			
				|  |  | -+be true */
 | 
	
		
			
				|  |  | -   while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0))
 | 
	
		
			
				|  |  | -   {
 | 
	
		
			
				|  |  | -     timeout--;  
 | 
	
		
			
				|  |  | -@@ -1916,10 +1953,12 @@ HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd)
 | 
	
		
			
				|  |  | -     __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
 | 
	
		
			
				|  |  | -     
 | 
	
		
			
				|  |  | -     /* Test if the switch mode HS is ok */
 | 
	
		
			
				|  |  | --    if ((SD_hs[13]& 2) != 2)
 | 
	
		
			
				|  |  | --    {
 | 
	
		
			
				|  |  | --      errorstate = SD_UNSUPPORTED_FEATURE;
 | 
	
		
			
				|  |  | --    } 
 | 
	
		
			
				|  |  | -+    // MM: These bits (0 to 271) are reserved in the spec I'm looking at ???
 | 
	
		
			
				|  |  | -+    // Should be safe to ignore the result.
 | 
	
		
			
				|  |  | -+    //if ((SD_hs[13]& 2) != 2)
 | 
	
		
			
				|  |  | -+    //{
 | 
	
		
			
				|  |  | -+      //errorstate = SD_UNSUPPORTED_FEATURE;
 | 
	
		
			
				|  |  | -+    //} 
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   return errorstate;
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
 | 
	
		
			
				|  |  | -index ef23c94..c899300 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
 | 
	
		
			
				|  |  | -@@ -76,7 +76,7 @@
 | 
	
		
			
				|  |  | - //#define HAL_SMARTCARD_MODULE_ENABLED   
 | 
	
		
			
				|  |  | - //#define HAL_WWDG_MODULE_ENABLED   
 | 
	
		
			
				|  |  | - #define HAL_PCD_MODULE_ENABLED
 | 
	
		
			
				|  |  | --//#define HAL_HCD_MODULE_ENABLED   
 | 
	
		
			
				|  |  | -+#define HAL_HCD_MODULE_ENABLED
 | 
	
		
			
				|  |  | - #define HAL_GPIO_MODULE_ENABLED
 | 
	
		
			
				|  |  | - #define HAL_DMA_MODULE_ENABLED
 | 
	
		
			
				|  |  | - #define HAL_RCC_MODULE_ENABLED
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
 | 
	
		
			
				|  |  | -index c257924..5261aa9 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
 | 
	
		
			
				|  |  | -@@ -66,12 +66,28 @@ void MX_FSMC_Init(void)
 | 
	
		
			
				|  |  | -   hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
 | 
	
		
			
				|  |  | -   hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
 | 
	
		
			
				|  |  | -   /* Timing */
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // 1 clock to read the address, + 1 for synchroniser skew
 | 
	
		
			
				|  |  | -   Timing.AddressSetupTime = 2;
 | 
	
		
			
				|  |  | -   Timing.AddressHoldTime = 1;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // Writes to device:
 | 
	
		
			
				|  |  | -+  //   1 for synchroniser skew (dbx also delayed)
 | 
	
		
			
				|  |  | -+  //   1 to skip hold time
 | 
	
		
			
				|  |  | -+  //   1 to write data.
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // Reads from device:
 | 
	
		
			
				|  |  | -+  //   3 for syncroniser
 | 
	
		
			
				|  |  | -+  //   1 to write back to fsmc bus.
 | 
	
		
			
				|  |  | -   Timing.DataSetupTime = 4;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  // Allow a clock for us to release signals
 | 
	
		
			
				|  |  | -+  // Need to avoid both devices acting as outputs
 | 
	
		
			
				|  |  | -+  // on the multiplexed lines at the same time.
 | 
	
		
			
				|  |  | -   Timing.BusTurnAroundDuration = 1;
 | 
	
		
			
				|  |  | --  Timing.CLKDivision = 16;
 | 
	
		
			
				|  |  | --  Timing.DataLatency = 17;
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+  Timing.CLKDivision = 16; // Ignored for async
 | 
	
		
			
				|  |  | -+  Timing.DataLatency = 17; // Ignored for async
 | 
	
		
			
				|  |  | -   Timing.AccessMode = FSMC_ACCESS_MODE_A;
 | 
	
		
			
				|  |  | -   /* ExtTiming */
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -@@ -91,7 +107,7 @@ static void HAL_FSMC_MspInit(void){
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   FSMC_Initialized = 1;
 | 
	
		
			
				|  |  | -   /* Peripheral clock enable */
 | 
	
		
			
				|  |  | --  #__FSMC_CLK_ENABLE();
 | 
	
		
			
				|  |  | -+  __FSMC_CLK_ENABLE();
 | 
	
		
			
				|  |  | -   
 | 
	
		
			
				|  |  | -   /** FSMC GPIO Configuration  
 | 
	
		
			
				|  |  | -   PE7   ------> FSMC_DA4
 | 
	
		
			
				|  |  | -@@ -103,9 +119,6 @@ static void HAL_FSMC_MspInit(void){
 | 
	
		
			
				|  |  | -   PE13   ------> FSMC_DA10
 | 
	
		
			
				|  |  | -   PE14   ------> FSMC_DA11
 | 
	
		
			
				|  |  | -   PE15   ------> FSMC_DA12
 | 
	
		
			
				|  |  | --  PD8   ------> FSMC_DA13
 | 
	
		
			
				|  |  | --  PD9   ------> FSMC_DA14
 | 
	
		
			
				|  |  | --  PD10   ------> FSMC_DA15
 | 
	
		
			
				|  |  | -   PD14   ------> FSMC_DA0
 | 
	
		
			
				|  |  | -   PD15   ------> FSMC_DA1
 | 
	
		
			
				|  |  | -   PD0   ------> FSMC_DA2
 | 
	
		
			
				|  |  | -@@ -113,28 +126,31 @@ static void HAL_FSMC_MspInit(void){
 | 
	
		
			
				|  |  | -   PD4   ------> FSMC_NOE
 | 
	
		
			
				|  |  | -   PD5   ------> FSMC_NWE
 | 
	
		
			
				|  |  | -   PD7   ------> FSMC_NE1
 | 
	
		
			
				|  |  | -+  PD8   ------> FSMC_DA13
 | 
	
		
			
				|  |  | -+  PD9   ------> FSMC_DA14
 | 
	
		
			
				|  |  | -+  PD10  ------> FSMC_DA15
 | 
	
		
			
				|  |  | -   PB7   ------> FSMC_NL
 | 
	
		
			
				|  |  | -   PE0   ------> FSMC_NBL0
 | 
	
		
			
				|  |  | -   PE1   ------> FSMC_NBL1
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -+  // MM: GPIO_SPEED_FREQ_MEDIUM is rated up to 50MHz, which is fine as all the
 | 
	
		
			
				|  |  | -+  // fsmc timings are > 1 (ie. so clock speed / 2 is around 50MHz).
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -   /* GPIO_InitStruct */
 | 
	
		
			
				|  |  | --  GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
 | 
	
		
			
				|  |  | -+  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
	
		
			
				|  |  | --  GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
 | 
	
		
			
				|  |  | -+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; //HIGH;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   /* GPIO_InitStruct */
 | 
	
		
			
				|  |  | --  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_5|GPIO_PIN_7;
 | 
	
		
			
				|  |  | -+  GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1 
 | 
	
		
			
				|  |  | -+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
	
		
			
				|  |  | --  GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
 | 
	
		
			
				|  |  | -+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; //HIGH;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 | 
	
		
			
				|  |  | -@@ -143,7 +159,7 @@ static void HAL_FSMC_MspInit(void){
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Pin = GPIO_PIN_7;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
	
		
			
				|  |  | --  GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
 | 
	
		
			
				|  |  | -+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;//HIGH;
 | 
	
		
			
				|  |  | -   GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
	
		
			
				|  |  | -@@ -186,9 +202,6 @@ static void HAL_FSMC_MspDeInit(void){
 | 
	
		
			
				|  |  | -   PE13   ------> FSMC_DA10
 | 
	
		
			
				|  |  | -   PE14   ------> FSMC_DA11
 | 
	
		
			
				|  |  | -   PE15   ------> FSMC_DA12
 | 
	
		
			
				|  |  | --  PD8   ------> FSMC_DA13
 | 
	
		
			
				|  |  | --  PD9   ------> FSMC_DA14
 | 
	
		
			
				|  |  | --  PD10   ------> FSMC_DA15
 | 
	
		
			
				|  |  | -   PD14   ------> FSMC_DA0
 | 
	
		
			
				|  |  | -   PD15   ------> FSMC_DA1
 | 
	
		
			
				|  |  | -   PD0   ------> FSMC_DA2
 | 
	
		
			
				|  |  | -@@ -196,18 +209,18 @@ static void HAL_FSMC_MspDeInit(void){
 | 
	
		
			
				|  |  | -   PD4   ------> FSMC_NOE
 | 
	
		
			
				|  |  | -   PD5   ------> FSMC_NWE
 | 
	
		
			
				|  |  | -   PD7   ------> FSMC_NE1
 | 
	
		
			
				|  |  | -+  PD8   ------> FSMC_DA13
 | 
	
		
			
				|  |  | -+  PD9   ------> FSMC_DA14
 | 
	
		
			
				|  |  | -+  PD10  ------> FSMC_DA15
 | 
	
		
			
				|  |  | -   PB7   ------> FSMC_NL
 | 
	
		
			
				|  |  | -   PE0   ------> FSMC_NBL0
 | 
	
		
			
				|  |  | -   PE1   ------> FSMC_NBL1
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | --  HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
 | 
	
		
			
				|  |  | -+  HAL_GPIO_DeInit(GPIOE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | --  HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4 
 | 
	
		
			
				|  |  | --                          |GPIO_PIN_5|GPIO_PIN_7);
 | 
	
		
			
				|  |  | -+  HAL_GPIO_DeInit(GPIOD, GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1 
 | 
	
		
			
				|  |  | -+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/main.c a/STM32CubeMX/SCSI2SD-V6/Src/main.c
 | 
	
		
			
				|  |  | -index 48e1f9a..a80e078 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/main.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/main.c
 | 
	
		
			
				|  |  | -@@ -32,12 +32,10 @@
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | - /* Includes ------------------------------------------------------------------*/
 | 
	
		
			
				|  |  | - #include "stm32f2xx_hal.h"
 | 
	
		
			
				|  |  | --#include "dma.h"
 | 
	
		
			
				|  |  | - #include "sdio.h"
 | 
	
		
			
				|  |  | - #include "spi.h"
 | 
	
		
			
				|  |  | --#include "tim.h"
 | 
	
		
			
				|  |  | - #include "usart.h"
 | 
	
		
			
				|  |  | - #include "usb_device.h"
 | 
	
		
			
				|  |  | - #include "gpio.h"
 | 
	
		
			
				|  |  | - #include "fsmc.h"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@@ -87,14 +87,10 @@ int main(void)
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   /* Initialize all configured peripherals */
 | 
	
		
			
				|  |  | -   MX_GPIO_Init();
 | 
	
		
			
				|  |  | --  MX_DMA_Init();
 | 
	
		
			
				|  |  | --  SystemClock_Config();
 | 
	
		
			
				|  |  | -   MX_FSMC_Init();
 | 
	
		
			
				|  |  | -   MX_SDIO_SD_Init();
 | 
	
		
			
				|  |  | -   MX_SPI1_Init();
 | 
	
		
			
				|  |  | --  MX_TIM4_Init();
 | 
	
		
			
				|  |  | --  MX_USART3_UART_Init();
 | 
	
		
			
				|  |  | --  MX_USB_DEVICE_Init();
 | 
	
		
			
				|  |  | -+  MX_USART3_UART_Init(); // Not used, but we don't want the pins floating.
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   /* USER CODE BEGIN 2 */
 | 
	
		
			
				|  |  | -   mainInit();
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
 | 
	
		
			
				|  |  | -index e8b2ad8..0f9a34b 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
 | 
	
		
			
				|  |  | -@@ -36,7 +36,6 @@
 | 
	
		
			
				|  |  | - #include "sdio.h"
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | - #include "gpio.h"
 | 
	
		
			
				|  |  | --#include "dma.h"
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | - /* USER CODE BEGIN 0 */
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -@@ -59,9 +58,6 @@ void MX_SDIO_SD_Init(void)
 | 
	
		
			
				|  |  | -   hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
 | 
	
		
			
				|  |  | -   hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
 | 
	
		
			
				|  |  | -   hsd.Init.ClockDiv = 0;
 | 
	
		
			
				|  |  | --  HAL_SD_Init(&hsd, &SDCardInfo);
 | 
	
		
			
				|  |  | --
 | 
	
		
			
				|  |  | --  HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | - }
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -@@ -143,6 +140,7 @@ void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
 | 
	
		
			
				|  |  | -     __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -     /* Peripheral interrupt init*/
 | 
	
		
			
				|  |  | -+	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 | 
	
		
			
				|  |  | -     HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
 | 
	
		
			
				|  |  | -     HAL_NVIC_EnableIRQ(SDIO_IRQn);
 | 
	
		
			
				|  |  | -   /* USER CODE BEGIN SDIO_MspInit 1 */
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/spi.c a/STM32CubeMX/SCSI2SD-V6/Src/spi.c
 | 
	
		
			
				|  |  | -index cfb19ce..25e0745 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/spi.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/spi.c
 | 
	
		
			
				|  |  | -@@ -54,6 +54,7 @@ void MX_SPI1_Init(void)
 | 
	
		
			
				|  |  | -   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
 | 
	
		
			
				|  |  | -   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
 | 
	
		
			
				|  |  | -   hspi1.Init.NSS = SPI_NSS_SOFT;
 | 
	
		
			
				|  |  | -+  // (96MHz / 2) / 4 = 12MHz. FPGA device allows up to 25MHz write
 | 
	
		
			
				|  |  | -   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
 | 
	
		
			
				|  |  | -   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
	
		
			
				|  |  | -   hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
 | 
	
		
			
				|  |  | -index e6b7783..b7ab0a3 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
 | 
	
		
			
				|  |  | -@@ -50,14 +50,6 @@ void HAL_MspInit(void)
 | 
	
		
			
				|  |  | -   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -   /* System interrupt init*/
 | 
	
		
			
				|  |  | --  /* MemoryManagement_IRQn interrupt configuration */
 | 
	
		
			
				|  |  | --  HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
 | 
	
		
			
				|  |  | --  /* BusFault_IRQn interrupt configuration */
 | 
	
		
			
				|  |  | --  HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
 | 
	
		
			
				|  |  | --  /* UsageFault_IRQn interrupt configuration */
 | 
	
		
			
				|  |  | --  HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
 | 
	
		
			
				|  |  | --  /* DebugMonitor_IRQn interrupt configuration */
 | 
	
		
			
				|  |  | --  HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
 | 
	
		
			
				|  |  | -   /* SysTick_IRQn interrupt configuration */
 | 
	
		
			
				|  |  | -   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -diff --git b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
 | 
	
		
			
				|  |  | -index 272d388..07387ca 100755
 | 
	
		
			
				|  |  | ---- b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
 | 
	
		
			
				|  |  | -+++ a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
 | 
	
		
			
				|  |  | -@@ -108,7 +108,18 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)
 | 
	
		
			
				|  |  | -     PA11     ------> USB_OTG_FS_DM
 | 
	
		
			
				|  |  | -     PA12     ------> USB_OTG_FS_DP 
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | --    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
 | 
	
		
			
				|  |  | -+	// HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
 | 
	
		
			
				|  |  | -+	// MM: Don't let pins float.
 | 
	
		
			
				|  |  | -+	GPIO_InitTypeDef GPIO_InitStruct;
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Pin = GPIO_PIN_9;
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Pull = GPIO_PULLDOWN;
 | 
	
		
			
				|  |  | -+	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
	
		
			
				|  |  | -+
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
	
		
			
				|  |  | -+	GPIO_InitStruct.Pull = GPIO_PULLDOWN;
 | 
	
		
			
				|  |  | -+	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -     /* Peripheral interrupt Deinit*/
 | 
	
		
			
				|  |  | -     HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
 | 
	
		
			
				|  |  | -@@ -294,9 +305,11 @@ USBD_StatusTypeDef  USBD_LL_Init (USBD_HandleTypeDef *pdev)
 | 
	
		
			
				|  |  | -   hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
 | 
	
		
			
				|  |  | -   HAL_PCD_Init(&hpcd_USB_OTG_FS);
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -+  // Sum of all FIFOs must be <= 320.
 | 
	
		
			
				|  |  | -   HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
 | 
	
		
			
				|  |  | -   HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
 | 
	
		
			
				|  |  | --  HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80);
 | 
	
		
			
				|  |  | -+  HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
 | 
	
		
			
				|  |  | -+  HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x40);
 | 
	
		
			
				|  |  | -   }
 | 
	
		
			
				|  |  | -   return USBD_OK;
 | 
	
		
			
				|  |  | - }
 |