<?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のトピックDMA channel assignment: no error code?</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/DMA-channel-assignment-no-error-code/m-p/526579#M9205</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jb111 on Tue Nov 24 21:47:32 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I have started doing some work with the DMA and came across a potential problem in the LPCOpen driver. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Under the gpdma_18xx_43xx.h header there is the function Chip_GPDMA_GetFreeChannel(). &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If all channels have been assigned then it seems that there is a return of zero. But zero is legitimate channel. There is no way for the user to know if channel zero has been assigned or there are no free channels.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is a quick test I ran:&lt;/SPAN&gt;&lt;BR /&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;void dma_channel_test(){

int ch0 = -1;
int ch1 = -1;
int ch2 = -1;
int ch3 = -1;
int ch4 = -1;
int ch5 = -1;
int ch6 = -1;
int ch7 = -1;
int ch8 = -1;

ch0 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART0_Tx);
ch1 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART0_Rx);
ch2 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART2_Tx);
ch3 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART2_Rx);
ch4 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART3_Tx);
ch5 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART3_Rx);
ch6 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART1_Rx);
ch7 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART1_Tx);
ch8 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_SSP1_Rx);


}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The results were:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;ch0 = 0&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;ch1 = 1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch2 = 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch3 = 3&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch4 = 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch5 = 5&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch6 = 6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch7 = 7&lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;ch8 = 0&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have not looked more indepth than that, just something I came across.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the header and documentation: &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;/**
 * @briefGet a free GPDMA channel for one DMA connection
 * @parampGPDMA: The base of GPDMA on the chip
 * @paramPeripheralConnection_ID: Some chip fix each peripheral DMA connection on a specified channel ( have not used in 17xx/40xx )
 * @returnThe channel number which is selected
 */
uint8_t Chip_GPDMA_GetFreeChannel(LPC_GPDMA_T *pGPDMA,
&amp;nbsp; uint32_t PeripheralConnection_ID);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the source :&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/* Get a free GPDMA channel for one DMA connection */
uint8_t Chip_GPDMA_GetFreeChannel(LPC_GPDMA_T *pGPDMA,
&amp;nbsp; uint32_t PeripheralConnection_ID)
{
uint8_t temp = 0;
for (temp = 0; temp &amp;lt; GPDMA_NUMBER_CHANNELS; temp++) {
if (!Chip_GPDMA_IntGetStatus(pGPDMA, GPDMA_STAT_ENABLED_CH,
 temp) &amp;amp;&amp;amp; (ChannelHandlerArray[temp].ChannelStatus == DISABLE)) {
ChannelHandlerArray[temp].ChannelStatus = ENABLE;
return temp;
}
}
return 0;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 18:16:14 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T18:16:14Z</dc:date>
    <item>
      <title>DMA channel assignment: no error code?</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/DMA-channel-assignment-no-error-code/m-p/526579#M9205</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jb111 on Tue Nov 24 21:47:32 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I have started doing some work with the DMA and came across a potential problem in the LPCOpen driver. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Under the gpdma_18xx_43xx.h header there is the function Chip_GPDMA_GetFreeChannel(). &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If all channels have been assigned then it seems that there is a return of zero. But zero is legitimate channel. There is no way for the user to know if channel zero has been assigned or there are no free channels.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is a quick test I ran:&lt;/SPAN&gt;&lt;BR /&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;void dma_channel_test(){

int ch0 = -1;
int ch1 = -1;
int ch2 = -1;
int ch3 = -1;
int ch4 = -1;
int ch5 = -1;
int ch6 = -1;
int ch7 = -1;
int ch8 = -1;

ch0 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART0_Tx);
ch1 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART0_Rx);
ch2 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART2_Tx);
ch3 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART2_Rx);
ch4 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART3_Tx);
ch5 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART3_Rx);
ch6 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART1_Rx);
ch7 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_UART1_Tx);
ch8 = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, GPDMA_CONN_SSP1_Rx);


}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The results were:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;ch0 = 0&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;ch1 = 1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch2 = 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch3 = 3&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch4 = 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch5 = 5&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch6 = 6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ch7 = 7&lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;ch8 = 0&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have not looked more indepth than that, just something I came across.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the header and documentation: &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;/**
 * @briefGet a free GPDMA channel for one DMA connection
 * @parampGPDMA: The base of GPDMA on the chip
 * @paramPeripheralConnection_ID: Some chip fix each peripheral DMA connection on a specified channel ( have not used in 17xx/40xx )
 * @returnThe channel number which is selected
 */
uint8_t Chip_GPDMA_GetFreeChannel(LPC_GPDMA_T *pGPDMA,
&amp;nbsp; uint32_t PeripheralConnection_ID);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the source :&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/* Get a free GPDMA channel for one DMA connection */
uint8_t Chip_GPDMA_GetFreeChannel(LPC_GPDMA_T *pGPDMA,
&amp;nbsp; uint32_t PeripheralConnection_ID)
{
uint8_t temp = 0;
for (temp = 0; temp &amp;lt; GPDMA_NUMBER_CHANNELS; temp++) {
if (!Chip_GPDMA_IntGetStatus(pGPDMA, GPDMA_STAT_ENABLED_CH,
 temp) &amp;amp;&amp;amp; (ChannelHandlerArray[temp].ChannelStatus == DISABLE)) {
ChannelHandlerArray[temp].ChannelStatus = ENABLE;
return temp;
}
}
return 0;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:16:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/DMA-channel-assignment-no-error-code/m-p/526579#M9205</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:16:14Z</dc:date>
    </item>
  </channel>
</rss>

