<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=16970&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-12-03T18:35:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=16970&amp;mode</id>
<entry>
<author><name><![CDATA[Elektro_maniak]]></name></author>
<updated>2016-12-03T18:35:32+01:00</updated>
<published>2016-12-03T18:35:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176392#p176392</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176392#p176392"/>
<title type="html"><![CDATA[Re: STM32F103, I2C - DMA, rejestry, zwis przy generowaniu ST]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176392#p176392"><![CDATA[
Czytałem, ale pominąłem ten zapisek: (2.13.1)<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">Workaround 1<br />Use the I2C with DMA in general, except when the Master is receiving a single byte.<br /></div><br /><br />teraz już wszystko jasne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Próbowałem odebrać tylko jeden bajt. Przy większej ilości nie ma żadnych zwiech, wszystko ładnie pracuje.<br />Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2202">Elektro_maniak</a> — 3 gru 2016, o 18:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elektro_maniak]]></name></author>
<updated>2016-12-03T17:02:45+01:00</updated>
<published>2016-12-03T17:02:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176380#p176380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176380#p176380"/>
<title type="html"><![CDATA[STM32F103, I2C - DMA, rejestry, zwis przy generowaniu STOP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16970&amp;p=176380#p176380"><![CDATA[
Witajcie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Bawię się ostatnio I2C w STM32F103RBT6 korzystając z transferu DMA oraz używając tylko i wyłącznie rejestrów (bez bibliotek SPL czy HAL)<br /><br />Przerabiam przykładowy kod, który udostępnia ST (I2C example). Przy DMA występuje zwis, gdyż prawdopodobnie niepoprawnie jest generowany sygnał stopu.<br /><br />Przedstawiam kod:<br /><br />[syntax=c]uint32_t I2C1_bufferRead(uint8_t slaveAddress, uint8_t registerAddress, uint32_t numByteToRead, uint8_t* pBuffer)<br />{<br />uint32_t temp = 0;<br /><br />//I2Cx-&gt;CR2 |= I2C_IT_ERR;<br />// ---------------------------<br />UART2_puts(&quot;1&quot;);<br /><br />// START<br />I2C1-&gt;CR1 |= I2C_CR1_START;<br />while( !(I2C1-&gt;SR1 &amp; I2C_SR1_SB) ); // tutaj następuje zwiecha nr 2 (po ponownym wywołaniu I2C_bufferRead i zwieszce nr 1 pod koniec)<br /><br />UART2_puts(&quot;2&quot;);<br /><br />// Write slaveAddress<br />I2C1-&gt;DR = slaveAddress;<br />while( !(I2C1-&gt;SR1 &amp; I2C_SR1_ADDR) );<br />temp = I2C1-&gt;SR2;<br /><br />// Write registerAddress<br />while( !(I2C1-&gt;SR1 &amp; I2C_SR1_TXE));<br />I2C1-&gt;DR = registerAddress;<br /><br />// STOP<br />while( !(I2C1-&gt;SR1 &amp; I2C_SR1_BTF) );<br />I2C1-&gt;CR1 |= I2C_CR1_STOP;<br /><br />// --------------------------<br />// Configure I2Cx DMA channel<br />DMA1_Channel7-&gt;CCR = 0 ;<br />DMA1_Channel7-&gt;CPAR = (uint32_t)&amp;(I2C1-&gt;DR);<br />DMA1_Channel7-&gt;CMAR = (uint32_t) pBuffer;<br />DMA1_Channel7-&gt;CNDTR = (uint32_t) numByteToRead;<br />DMA1_Channel7-&gt;CCR = DMA_CCR_PL | DMA_CCR_MINC | DMA_CCR_EN;<br /><br />// Set Last bit to have a NACK on the last received byte<br />I2C1-&gt;CR2 |= I2C_CR2_LAST;<br /><br />// Enable I2C DMA requests<br />I2C1-&gt;CR2 |= I2C_CR2_DMAEN;<br /><br />// Send START condition<br />I2C1-&gt;CR1 |= I2C_CR1_START;<br />// Wait until SB flag is set: EV5<br />while (!(I2C1-&gt;SR1 &amp; I2C_SR1_SB));<br /><br />I2C1-&gt;DR = slaveAddress | 1;<br /><br />// Wait until ADDR is set: EV6<br />while (!(I2C1-&gt;SR1 &amp; I2C_SR1_ADDR));<br />temp = I2C1-&gt;SR2;<br /><br />// Wait until DMA end of transfer<br />while ( !(DMA1-&gt;ISR &amp; DMA_ISR_TCIF7) );<br />// Disable the DMA1 Channel 7<br />DMA1_Channel7-&gt;CCR &amp;=~ DMA_CCR_EN;<br />DMA1-&gt;IFCR |= DMA_IFCR_CTCIF7; // DMA transfer complete flag<br /><br />UART2_puts(&quot;3&quot;);<br />// Program the STOP<br /><br />// Make sure that the STOP bit is cleared by Hardware before CR1 write access<br />I2C1-&gt;CR1 |= I2C_CR1_STOP;<br />while ( (I2C1-&gt;CR1 &amp; I2C_CR1_STOP)); // tutaj następuje zwiecha nr 1<br />// przy zakomentowaniu petli wszystko dziala OK za pierwszym razem, po resecie procka nastepuje zwiecha juz przy<br />// pierwszym wywolaniu funkcji przy generowaniu START<br /><br />UART2_puts(&quot;4&quot;);<br /><br />return temp;<br />}[/syntax]<br /><br />Znaki w terminalu przy odkomentowaniu linii while ( (I2C1-&gt;CR1 &amp; I2C_CR1_STOP)); :<br />- pierwsze uruchomienie - 1 2 3 - zwis przy while ( (I2C1-&gt;CR1 &amp; I2C_CR1_STOP));<br />- po resecie uC - 1 - zwis przy while( !(I2C1-&gt;SR1 &amp; I2C_SR1_SB) );<br /><br />Znaki w terminalu przy zakomentowanej linii while ( (I2C1-&gt;CR1 &amp; I2C_CR1_STOP)); :<br />- pierwsze uruchomienie - 1 2 3 4 - poprawnie odczytany bajt<br />- po resecie Uc - 1 - zwis przy while( !(I2C1-&gt;SR1 &amp; I2C_SR1_SB) );<br /><br />Ponadto, flaga BUSY cały czas zajęta. Wniosek -&gt; źle jest generowany sygnał stopu i w związku z tym, nie może zostać na nowo wygenerowany start.<br /><br />Bardzo prosiłbym o pomoc.<br />Dziękuję i pozdrawiam<br /><br />Elektro_maniak<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2202">Elektro_maniak</a> — 3 gru 2016, o 17:02</p><hr />
]]></content>
</entry>
</feed>