<?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=20746&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-05-22T21:18:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=20746&amp;mode</id>
<entry>
<author><name><![CDATA[sputnik]]></name></author>
<updated>2018-05-22T21:18:38+01:00</updated>
<published>2018-05-17T20:21:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20746&amp;p=207886#p207886</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20746&amp;p=207886#p207886"/>
<title type="html"><![CDATA[STM32F0 I2C2 Problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20746&amp;p=207886#p207886"><![CDATA[
Witam,<br />Mam problem z uruchomieniem modułu I2C2 w procesorze STM32F030CCT6. Korzystam z narzędzia CubeMx i bibliotek HAL. Problem polega na tym, iż moduł I2C2 (I2C2, a nie I2C1, to ważne) po inicjalizacji nie rusza - linia SDA zostaje podciągnięta pod VCC (i pozostaje w takim stanie), a linia SCL zostaje ściągnięta na stałe do masy. Problem nie zależy od częstotliwości  I2C (obojętne, czy 100/400kHz). Kod inicjalizacyjny to standardowy kod generowany przez CubeMx:<br /><br />[syntax=c]void MX_I2C2_Init(void)<br />{<br /><br />  hi2c2.Instance = I2C2;<br />  hi2c2.Init.Timing = 0x00B0DBFF;<br />  hi2c2.Init.OwnAddress1 = 0;<br />  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;<br />  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;<br />  hi2c2.Init.OwnAddress2 = 0;<br />  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;<br />  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;<br />  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;<br />  if (HAL_I2C_Init(&amp;hi2c2) != HAL_OK)<br />  {<br />    _Error_Handler(__FILE__, __LINE__);<br />  }<br /><br />    /**Configure Analogue filter <br />    */<br />  if (HAL_I2CEx_ConfigAnalogFilter(&amp;hi2c2, I2C_ANALOGFILTER_DISABLE) != HAL_OK)<br />  {<br />    _Error_Handler(__FILE__, __LINE__);<br />  }<br /><br />    /**Configure Digital filter <br />    */<br />  if (HAL_I2CEx_ConfigDigitalFilter(&amp;hi2c2, 0) != HAL_OK)<br />  {<br />    _Error_Handler(__FILE__, __LINE__);<br />  }<br /><br />}<br /><br />void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)<br />{<br /><br />  GPIO_InitTypeDef GPIO_InitStruct;<br />  if(i2cHandle-&gt;Instance==I2C2)<br />  {<br />  /* USER CODE BEGIN I2C2_MspInit 0 */<br />  /* USER CODE END I2C2_MspInit 0 */<br />  <br />    /**I2C2 GPIO Configuration    <br />    PA11     ------&gt; I2C2_SCL<br />    PA12     ------&gt; I2C2_SDA <br />    */<br />    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;<br />    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;<br />    GPIO_InitStruct.Pull = GPIO_PULLUP;<br />    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;<br />    GPIO_InitStruct.Alternate = GPIO_AF5_I2C2;<br />    HAL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);<br /><br />    /* I2C2 clock enable */<br />    __HAL_RCC_I2C2_CLK_ENABLE();<br />  /* USER CODE BEGIN I2C2_MspInit 1 */<br /><br />  /* USER CODE END I2C2_MspInit 1 */<br />  }<br />}[/syntax]<br />W programie próbuję wpisać cokolwiek do PCF8563 w trybie pooling (wycinek kodu):<br />[syntax=c]#define PCF8583_ADDR (0x51 &lt;&lt; 1)// Adres RTC<br />#define PCF8583_TIME_ADDR 0x02            // rejestr czasu<br />HAL_I2C_Mem_Write(&amp;hi2c2, PCF8583_ADDR, PCF8583_TIME_ADDR, 3, bufor, 3, 100);[/syntax]<br /><br />Analizując datasheet natknąłem się na informację, iż I2C2 nie ma niezależnego zegara(jak I2C1), a taktowany jest bezpośrednio z PCLK.<br /><a href="https://obrazkiforum.atnel.pl/17197/03fd64a36a78fac4e7a5a11dc7f46590.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/17197/03fd64a36a78fac4e7a5a11dc7f46590.jpg" alt="Obrazek" /></a><br /><br />U mnie PCLK wynosi 48MHz. W dalszej części dokumentacji są podane również kryteria, co do okresu :<br /><a href="https://obrazkiforum.atnel.pl/17197/4a2b2459987270c90531216bd53fca9f.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/17197/4a2b2459987270c90531216bd53fca9f.jpg" alt="Obrazek" /></a><br />Jednak korzystajac z podanych Tlow i Thigh (kolejno 4uS i 0,6uS), wychodzi, iż wszytskie podane warunki zostały spełnione. Częstotliwość taktowania w moim przypadku to 48MHz, więc okres to ok.20ns.<br /><br />Jeżeli chodzi o same piny SDA i SCL, to są one sprawne - w trybie normalnego wyjścia cyfrowego działają poprawnie. Na magistrali nie ma żadnego zwarcia, układy peryferyjne (w moim przypadku pamięć EEPROM M24C64 i PCF8563) są zlutowane poprawnie. Podciągnięcie do VCC przez rezystory 10k.<br />Musi tu być problem z inicjalizacją, bo wcześniej testowałem ten sam scenariusz, ale z innym procesorem (również z rodziny F0) i I2C1 i wszytsko banglało. Bardzo proszę o pomoc <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=17197">sputnik</a> — 17 maja 2018, o 20:21</p><hr />
]]></content>
</entry>
</feed>