<?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>topic I2C with DMA, strange byte counter behavior in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295932#M12192</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm working on a DMA-enabled I2C driver for &lt;SPAN style="color: #51626f; font-family: arial, sans-serif; font-size: 12px;"&gt;MKL25Z&lt;/SPAN&gt; (Freedom Board). &lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;My problem is this: first, I coufigure DMA to send two bytes; then I start a DMA/I2C transfer by writing the slave address to I2C Data register; after the transfer completes (DMA interrupt fires), only one byte of the two appears to have been sent (total 2/3: slave address and first data byte).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I verify this a)&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt; by watching I2C SCL with a scope; b)&lt;/SPAN&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt; by comparing behavior with DMA-less I2C code -- I configure an accelerometer to generate interrupts.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, if I write N + 1 to DMA BCR where N is the number of bytes to be transferred, the correct number of bytes is transferred.&lt;/P&gt;&lt;P&gt;Also, errata id 5746 for mask 1N97F seems remotely related: "&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;When using the PIT to trigger DMA transfers using cycle steal mode,&lt;EM&gt; two data transfers per request&lt;/EM&gt; &lt;/SPAN&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;are generated".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'd much appreciate a solution to this.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The setup code is this:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_13974854683026553" jivemacro_uid="_13974854683026553" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC4 |= SIM_SCGC4_I2C0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC4 |= SIM_SCGC5_PORTE;&lt;/P&gt;
&lt;P&gt;// enable DMA and DMAMUX clocks&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC7 |= 1 &amp;lt;&amp;lt; 8;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC6 |= 1 &amp;lt;&amp;lt; 1;&lt;/P&gt;
&lt;P&gt;// I2C SDA and SCL&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[24] = PORTx_PCRn_MUX(5);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[25] = PORTx_PCRn_MUX(5);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;F = 0x20;&lt;/P&gt;
&lt;P&gt;// enable interrupts and DMA, all interrupt conditions generate DMA requests&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 = I2Cx_C1_IICEN | I2Cx_C1_DMAEN | I2Cx_C1_IICIE;&lt;/P&gt;
&lt;P&gt;// enable channel 0 with 8 bit source and dest, cycle-steal mode (one byte per I2C request)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DCR = DMA_DCRn_SSIZE(1) | DMA_DCRn_DSIZE(1) | DMA_DCRn_CS&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | DMA_DCRn_EINT | DMA_DCRn_D_REQ;&lt;/P&gt;
&lt;P&gt;// DMAMUX ch. 0 with I2C0 as source&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX-&amp;gt;CHCFG[0] = DMAMUX_CHCFGn_ENBL | DMAMUX_CHCFGn_SOURCE(22);&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Transmission code:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro _jivemacro_uid_13974862295561159 jive_macro_code" jivemacro_uid="_13974862295561159" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DSR_BCR = DMA_DSR_BCRn_BCR(txbytes + 1); // &amp;lt;--- txbytes = 2; if I leave the +1 out, only one byte is transferred&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].SAR = txbuf; // a buffer with two bytes&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DAR = &amp;amp;I2C0-&amp;gt;D;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DCR |= DMA_DCRn_SINC | DMA_DCRn_ERQ; // increment source address, listen to requests from I2C&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;// transmission/master mode&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_TX;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_MST;&lt;/P&gt;
&lt;P&gt;// writing slave address; when this completes, TCF flag is set, IICIF is set, DMA transaction begins&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;D = (addr &amp;lt;&amp;lt; 1);&lt;/P&gt;
&lt;P&gt;// wait until DMA interrupt has fired&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMA interrupt handler code:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_13974864819005382 jive_text_macro jive_macro_code" jivemacro_uid="_13974864819005382" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp; DMA-&amp;gt;ch[0].DSR_BCR |= DMA_DSR_BCRn_DONE; // clear all status flags&lt;/P&gt;
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 14 Apr 2014 14:53:16 GMT</pubDate>
    <dc:creator>age</dc:creator>
    <dc:date>2014-04-14T14:53:16Z</dc:date>
    <item>
      <title>I2C with DMA, strange byte counter behavior</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295932#M12192</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm working on a DMA-enabled I2C driver for &lt;SPAN style="color: #51626f; font-family: arial, sans-serif; font-size: 12px;"&gt;MKL25Z&lt;/SPAN&gt; (Freedom Board). &lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;My problem is this: first, I coufigure DMA to send two bytes; then I start a DMA/I2C transfer by writing the slave address to I2C Data register; after the transfer completes (DMA interrupt fires), only one byte of the two appears to have been sent (total 2/3: slave address and first data byte).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I verify this a)&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt; by watching I2C SCL with a scope; b)&lt;/SPAN&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt; by comparing behavior with DMA-less I2C code -- I configure an accelerometer to generate interrupts.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, if I write N + 1 to DMA BCR where N is the number of bytes to be transferred, the correct number of bytes is transferred.&lt;/P&gt;&lt;P&gt;Also, errata id 5746 for mask 1N97F seems remotely related: "&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;When using the PIT to trigger DMA transfers using cycle steal mode,&lt;EM&gt; two data transfers per request&lt;/EM&gt; &lt;/SPAN&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;are generated".&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'd much appreciate a solution to this.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The setup code is this:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_13974854683026553" jivemacro_uid="_13974854683026553" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC4 |= SIM_SCGC4_I2C0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC4 |= SIM_SCGC5_PORTE;&lt;/P&gt;
&lt;P&gt;// enable DMA and DMAMUX clocks&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC7 |= 1 &amp;lt;&amp;lt; 8;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM-&amp;gt;SCGC6 |= 1 &amp;lt;&amp;lt; 1;&lt;/P&gt;
&lt;P&gt;// I2C SDA and SCL&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[24] = PORTx_PCRn_MUX(5);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE-&amp;gt;PCR[25] = PORTx_PCRn_MUX(5);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;F = 0x20;&lt;/P&gt;
&lt;P&gt;// enable interrupts and DMA, all interrupt conditions generate DMA requests&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 = I2Cx_C1_IICEN | I2Cx_C1_DMAEN | I2Cx_C1_IICIE;&lt;/P&gt;
&lt;P&gt;// enable channel 0 with 8 bit source and dest, cycle-steal mode (one byte per I2C request)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DCR = DMA_DCRn_SSIZE(1) | DMA_DCRn_DSIZE(1) | DMA_DCRn_CS&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | DMA_DCRn_EINT | DMA_DCRn_D_REQ;&lt;/P&gt;
&lt;P&gt;// DMAMUX ch. 0 with I2C0 as source&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX-&amp;gt;CHCFG[0] = DMAMUX_CHCFGn_ENBL | DMAMUX_CHCFGn_SOURCE(22);&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Transmission code:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro _jivemacro_uid_13974862295561159 jive_macro_code" jivemacro_uid="_13974862295561159" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DSR_BCR = DMA_DSR_BCRn_BCR(txbytes + 1); // &amp;lt;--- txbytes = 2; if I leave the +1 out, only one byte is transferred&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].SAR = txbuf; // a buffer with two bytes&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DAR = &amp;amp;I2C0-&amp;gt;D;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DCR |= DMA_DCRn_SINC | DMA_DCRn_ERQ; // increment source address, listen to requests from I2C&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;// transmission/master mode&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_TX;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_MST;&lt;/P&gt;
&lt;P&gt;// writing slave address; when this completes, TCF flag is set, IICIF is set, DMA transaction begins&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;D = (addr &amp;lt;&amp;lt; 1);&lt;/P&gt;
&lt;P&gt;// wait until DMA interrupt has fired&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMA interrupt handler code:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_13974864819005382 jive_text_macro jive_macro_code" jivemacro_uid="_13974864819005382" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp; DMA-&amp;gt;ch[0].DSR_BCR |= DMA_DSR_BCRn_DONE; // clear all status flags&lt;/P&gt;
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 Apr 2014 14:53:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295932#M12192</guid>
      <dc:creator>age</dc:creator>
      <dc:date>2014-04-14T14:53:16Z</dc:date>
    </item>
    <item>
      <title>Re: I2C with DMA, strange byte counter behavior</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295933#M12193</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Firstly, I think the PortE clock enable is incorrect, pls change as following:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;SIM-&amp;gt;SCGC4 |= SIM_SCGC5_PORTE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TO&lt;BR /&gt;SIM-&amp;gt;SCGC5 |= SIM_SCGC5_PORTE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regarding you question, it is complicated to use IIC to test. I suggest you transfer data between two memory address to test BCR function, and check if the actual data number transferred is less than 1.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 Apr 2014 09:10:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295933#M12193</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2014-04-15T09:10:29Z</dc:date>
    </item>
    <item>
      <title>Re: I2C with DMA, strange byte counter behavior</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295934#M12194</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have tested the BCR with the following code from memory to memory, the DMA transfer the BCR bytes exactly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint16_t A[100],B[100];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;int main(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int counter = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //transfer 100 data from A to B&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(counter=0; counter&amp;lt;100; counter++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A[counter]=250+counter;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM_SCGC4 |= 0xC0;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM_SCGC5 |= 0x3E00;&amp;nbsp; //enable Port all&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM_SCGC7 |= 1 &amp;lt;&amp;lt; 8;&amp;nbsp; //DMA enable&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM_SCGC6 |= 1 &amp;lt;&amp;lt; 1;&amp;nbsp; //DMA mux enable&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_SAR0 =(uint32_t)&amp;amp;A[0];&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_DAR0 =(uint32_t)&amp;amp;B[0];&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_DCR0 =0x006C0000; //disable interrupt&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_DSR_BCR0=200; //200 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_DCR0 |=0x10000; //start DMA&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(DMA_DSR_BCR0&amp;amp;0x1000000)) {}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm("nop"); //set break point to check the A and B array&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(;;)&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 Apr 2014 10:02:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295934#M12194</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2014-04-15T10:02:33Z</dc:date>
    </item>
    <item>
      <title>Re: I2C with DMA, strange byte counter behavior</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295935#M12195</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;Hi age,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;I think it might be a problem with the IIC DMA requests. The IIC module triggers the DMA in the following cases:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;• While FACK = 0, a data byte is received, either address or data is transmitted. (ACK/NACK automatic)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;• While FACK = 0, the first byte received matches the A1 register or is general call address.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;If any address matching occurs, IAAS and TCF are set. If the direction of transfer is known from master to slave, then it is not required to check the SRW. With this assumption, DMA can also be used in this case. In other cases, if the master reads data from the slave, then it is required to rewrite the C1 register operation. With this assumption, DMA cannot be used.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;When FACK = 1, an address or a data byte is transmitted.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;I would need to check your whole project, but I think the IIC triggering might be causing some double write to the I2C0_D register before the last one was sent. Your DMA configuration is right. Attached you will find my test code. I used your DMA configuration, only replaced the I2C module with a TPM, but if you set a breakpoint in the TPM ISR you will see that the DMA does copy all the bytes in the buffer to the destination register.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; font-family: Arial, sans-serif;"&gt;Saludos &lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 Apr 2014 16:16:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295935#M12195</guid>
      <dc:creator>santiago_lopez</dc:creator>
      <dc:date>2014-04-15T16:16:45Z</dc:date>
    </item>
    <item>
      <title>Re: I2C with DMA, strange byte counter behavior</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295936#M12196</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;STRONG style="font-size: 12px; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #3d3d3d;"&gt;&lt;SPAN style="padding-right: 3px; color: #6a737b; font-size: 1.1em; font-style: inherit; font-family: inherit; font-weight: inherit;"&gt;xiangjun.rong,&lt;/SPAN&gt;&lt;SPAN style="font-size: 12px;"&gt; &lt;/SPAN&gt;&lt;STRONG style="font-size: 12px; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #3d3d3d;"&gt;&lt;SPAN style="padding-right: 3px; color: #6a737b; font-size: 1.1em; font-style: inherit; font-family: inherit; font-weight: inherit;"&gt;Santiago_Lopez&lt;/SPAN&gt;&lt;SPAN style="padding-right: 3px; color: #6a737b; font-style: inherit; font-size: 1.1em; font-family: inherit; font-weight: inherit;"&gt;,&amp;nbsp; &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;SPAN style="padding-right: 3px; color: #6a737b; font-style: inherit; font-size: 1.1em; font-family: inherit; font-weight: inherit;"&gt;thank you for your responses. I have solved my problem, and quite subtle it was; I was disabling the I2C module on DMA interrupt, right after the DMA transfer to the data register was complete. However, at that time I2C hadn't yet sent the last byte (and nowhere it is said it would).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_13977335327614562" jivemacro_uid="_13977335327614562" modifiedtitle="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_DMAEN;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DSR_BCR = DMA_DSR_BCRn_BCR(txbytes);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].SAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint32_t) txbuf;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (uint32_t) &amp;amp;(I2C0-&amp;gt;D);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA-&amp;gt;ch[0].DCR&amp;nbsp;&amp;nbsp;&amp;nbsp; |= DMA_DCRn_SINC | DMA_DCRn_ERQ | DMA_DCRn_START;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for DMA here&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((I2C0-&amp;gt;S &amp;amp; I2Cx_S_TCF) == 0); // &amp;lt;== this line. when DMA is done, I2C is not yet done!&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="font-size: 9pt; line-height: 12pt;"&gt;
&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="font-size: 9pt; line-height: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 &amp;amp;= ~I2Cx_C1_DMAEN;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rxbytes != 0)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 |= I2Cx_C1_RSTA;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0-&amp;gt;C1 &amp;amp;= ~(I2Cx_C1_MST | I2Cx_C1_TX); // &amp;lt;== disable I2C after a transfer is complete&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 17 Apr 2014 11:20:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/I2C-with-DMA-strange-byte-counter-behavior/m-p/295936#M12196</guid>
      <dc:creator>age</dc:creator>
      <dc:date>2014-04-17T11:20:37Z</dc:date>
    </item>
  </channel>
</rss>

