<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックRe: LPC18xx SD write DMA buffer overrun</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543577#M12727</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by joepbrown on Fri Nov 27 14:50:42 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;For anyone that has used the USB MSC code provided with LPCOpen, specifically the SCSI code -- The device will not work on linux. Linux, by default, will send SCSI reads and writes in 240-block chunks. This will overrun the disk cache for reads and writes in the SCSI read/write code. To fix this, you have to break the reads/writes into pieces.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the original &lt;/SPAN&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;SCSI_Command_ReadWrite_10()&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t * const MSInterfaceInfo, const bool IsDataRead)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t BlockAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t TotalBlocks;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlockAddress = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[2] &amp;lt;&amp;lt; 24)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[3] &amp;lt;&amp;lt; 16)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[4] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[5]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalBlocks = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[7] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[8];
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsDataRead == DATA_READ)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll need to do something like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t * const MSInterfaceInfo, const bool IsDataRead)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t BlockAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t TotalBlocks;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t Remainder;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t RemainderAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t status = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlockAddress = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[2] &amp;lt;&amp;lt; 24)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[3] &amp;lt;&amp;lt; 16)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[4] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[5]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalBlocks = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[7] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[8];
&amp;nbsp;&amp;nbsp;&amp;nbsp; Remainder = TotalBlocks - 128;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RemainderAddress = BlockAddress + 128;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsDataRead == DATA_READ)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (TotalBlocks &amp;lt;= 128)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first 128
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,128);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, 128,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remainder
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, RemainderAddress,Remainder);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, Remainder,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (TotalBlocks &amp;lt;= 128)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; debug("Write %d @ 0x%08x\n", TotalBlocks, BlockAddress);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first 128
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, 128,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,128);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remainder
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, Remainder,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, RemainderAddress,Remainder);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There will only ever be, at most, two reads or writes since the SCSI parameter maxes our at 256. Hopefully this helps someone else out.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 18:27:04 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T18:27:04Z</dc:date>
    <item>
      <title>LPC18xx SD write DMA buffer overrun</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543575#M12725</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by joepbrown on Thu Oct 22 13:27:06 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;This is directly related to this topic on the lpc43xx: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=https%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fforum%2Flpcopen-v202-sdmmcspeedc-hard-faults" rel="nofollow noopener noreferrer" target="_blank"&gt;https://www.lpcware.com/content/forum/lpcopen-v202-sdmmcspeedc-hard-faults&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This is also all in the current LPCOpen library.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There a bug in the DMA setup of the SDMMC card write handling where if the number of bytes exceeds 4096*17 the function that sets up the DMA for the SD write will overrun and corrupt the callback function pointers (and a bunch of other stuff) and cause the device to hardfault.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The SDMMC card info struct contains an array that is passed to the SDMMC DMA for data transfer. The array is defined as &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;typedef struct _sdif_device {
pSDMMC_DMA_T mci_dma_dd[1 + (0x10000 / MCI_DMADES1_MAXTR)];
} sdif_device;&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;MCI_DMADES1_MAXTR &lt;/STRONG&gt;&lt;SPAN&gt;is defined as 4096, so the array length is 17. In &lt;/SPAN&gt;&lt;STRONG&gt;Chip_SDIF_DmaSetup&lt;/STRONG&gt;&lt;SPAN&gt;, if the size passed in is greater than 17*4096, the &lt;/SPAN&gt;&lt;STRONG&gt;psdif_dev[]&lt;/STRONG&gt;&lt;SPAN&gt; array will overrun and corrupt the callback pointers in the g_card_info structure.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The way I found this issue was using the USB masstorage driver from LPCOpen on a linux machine. Windows seems to never write more than 128 blocks at a time (128*512B), but once I plugged my device into a linux machine it attempted to write 240 blocks, which caused the overrun.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm not quite sure how to fix this problem. I've tried hardcoding a larger array size for mci_dma_dd, but it causes the SD card writes to hang (the DMA write complete interrupt never fires?).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Has anyone else run into this problem on the lpx18xx?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:27:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543575#M12725</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:27:02Z</dc:date>
    </item>
    <item>
      <title>Re: LPC18xx SD write DMA buffer overrun</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543576#M12726</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by joepbrown on Thu Oct 22 14:24:04 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Just a little more info:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The root problem is that 0x10000 is the max size of the AHB SRAM buffer the USB uses for transfers, so the DMA array makes sense.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;A more appropriate question may be how, in the SCSI driver in LPCOpen, can I limit the total number of blocks written, or somehow tell the linux machine not to send more than 128 blocks?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:27:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543576#M12726</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:27:03Z</dc:date>
    </item>
    <item>
      <title>Re: LPC18xx SD write DMA buffer overrun</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543577#M12727</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by joepbrown on Fri Nov 27 14:50:42 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;For anyone that has used the USB MSC code provided with LPCOpen, specifically the SCSI code -- The device will not work on linux. Linux, by default, will send SCSI reads and writes in 240-block chunks. This will overrun the disk cache for reads and writes in the SCSI read/write code. To fix this, you have to break the reads/writes into pieces.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the original &lt;/SPAN&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;SCSI_Command_ReadWrite_10()&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t * const MSInterfaceInfo, const bool IsDataRead)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t BlockAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t TotalBlocks;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlockAddress = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[2] &amp;lt;&amp;lt; 24)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[3] &amp;lt;&amp;lt; 16)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[4] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[5]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalBlocks = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[7] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[8];
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsDataRead == DATA_READ)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You'll need to do something like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t * const MSInterfaceInfo, const bool IsDataRead)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t BlockAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t TotalBlocks;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t Remainder;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t RemainderAddress;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t status = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlockAddress = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[2] &amp;lt;&amp;lt; 24)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[3] &amp;lt;&amp;lt; 16)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[4] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[5]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalBlocks = (MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[7] &amp;lt;&amp;lt; 8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + MSInterfaceInfo-&amp;gt;State.CommandBlock.SCSICommandData[8];
&amp;nbsp;&amp;nbsp;&amp;nbsp; Remainder = TotalBlocks - 128;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RemainderAddress = BlockAddress + 128;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsDataRead == DATA_READ)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (TotalBlocks &amp;lt;= 128)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first 128
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, BlockAddress,128);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, 128,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remainder
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_ReadBlocks((void*) disk_cache, RemainderAddress,Remainder);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsINReady(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber, (uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, Remainder,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (TotalBlocks &amp;lt;= 128)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, TotalBlocks,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; debug("Write %d @ 0x%08x\n", TotalBlocks, BlockAddress);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,TotalBlocks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first 128
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, 128,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, BlockAddress,128);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remainder
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Endpoint_Streaming(MSInterfaceInfo-&amp;gt;Config.PortNumber,(uint8_t*) disk_cache, VIRTUAL_MEMORY_BLOCK_SIZE, Remainder,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!Endpoint_IsOUTReceived(MSInterfaceInfo-&amp;gt;Config.PortNumber));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = Chip_SDMMC_WriteBlocks((void*) disk_cache, RemainderAddress,Remainder);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There will only ever be, at most, two reads or writes since the SCSI parameter maxes our at 256. Hopefully this helps someone else out.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:27:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC18xx-SD-write-DMA-buffer-overrun/m-p/543577#M12727</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:27:04Z</dc:date>
    </item>
  </channel>
</rss>

