diff --git a/source/drivers/qspi/v0/qspi.c b/source/drivers/qspi/v0/qspi.c
index 02ee31fbb7..888f3cfa89 100644
--- a/source/drivers/qspi/v0/qspi.c
+++ b/source/drivers/qspi/v0/qspi.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2021 Texas Instruments Incorporated
+ *  Copyright (C) 2021-23 Texas Instruments Incorporated
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
@@ -880,6 +880,10 @@ static int32_t QSPI_spiMemMapRead(QSPI_Handle handle)
     uintptr_t temp_addr;
     int32_t status = SystemP_SUCCESS;
     uint32_t dummyBytes, dummyBits;
+    uint32_t dmaOffset;
+    uint32_t nonAlignedBytes;
+    uint8_t *pDmaDst  = NULL;
+    uint32_t dmaLen;
 
     if(handle != NULL)
     {
@@ -938,14 +942,13 @@ static int32_t QSPI_spiMemMapRead(QSPI_Handle handle)
 
         if (attrs->dmaEnable == true)
         {
-            /* Check if the qspi memory address is 16 bit aligned. */
-            uint32_t dmaOffset  = (transaction->addrOffset + 0x3) & (~0x3);
-            uint32_t nonAlignedBytes = dmaOffset - transaction->addrOffset;
-            uint8_t *pDmaDst = (pDst + nonAlignedBytes);
-            uint32_t dmaLen = count - nonAlignedBytes;
+            /* Check if the qspi memory address is 4 byte aligned. */
+            dmaOffset  = (transaction->addrOffset + 0x3) & (~0x3);
+            nonAlignedBytes = dmaOffset - transaction->addrOffset;
+            pDmaDst = (uint8_t *)(pDst + nonAlignedBytes);
+            dmaLen = count - nonAlignedBytes;
             while(nonAlignedBytes != 0)
             {
-                /* Do the normal memory to memory transfer. Copy will be in bytes */
                 *pDst = *pSrc;
                 pDst++;
                 pSrc++;
@@ -953,9 +956,24 @@ static int32_t QSPI_spiMemMapRead(QSPI_Handle handle)
             }
             if (dmaLen != 0)
             {
-                /* Get the next multiple of 4 */
-                dmaLen = (dmaLen + 3 ) & (~0x3);
+                /* calculate the nonAligned bytes at the end */
+                nonAlignedBytes = dmaLen - ((dmaLen ) & (~0x3));
+
+                /* Get the previous multiple of 4 of dmaLen as edma transfer can only be done with length in multiple of 4*/
+                dmaLen = (dmaLen ) & (~0x3);
                 QSPI_edmaTransfer(pDmaDst, pSrc, dmaLen, handle);
+
+                pDst += dmaLen;
+                pSrc += dmaLen;
+
+                /* Do the normal memory to memory transfer of nonAligned bytes at the end. */
+                while(nonAlignedBytes != 0)
+                {
+                    *pDst = *pSrc;
+                    pDst++;
+                    pSrc++;
+                    nonAlignedBytes--;
+                }
             }
         }
         else
