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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-11T15:15:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=14484&amp;mode</id>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2016-02-11T15:15:52+01:00</updated>
<published>2016-02-11T15:15:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153343#p153343</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153343#p153343"/>
<title type="html"><![CDATA[Re: STM32F103 (nucleo) I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153343#p153343"><![CDATA[
Moim zdaniem (nie znam SPL`a) masz nie ustawione I2C.ARM To nie AVR<br /><br />Tutaj masz co i jak:http://forbot.pl/blog/artykuly/programowanie/kurs-stm32-12-i2c-w-praktyce-akcelerometr-id10644<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 11 lut 2016, o 15:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kubavit]]></name></author>
<updated>2016-02-10T14:32:50+01:00</updated>
<published>2016-02-10T14:32:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153259#p153259</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153259#p153259"/>
<title type="html"><![CDATA[STM32F103 (nucleo) I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14484&amp;p=153259#p153259"><![CDATA[
Cześć,<br />Przenoszę obsługę czujnika HIH6030 z AVR na STM32. Na Atmedze działał poprawnie, więc adresy i wysyłane sekwencje są w odpowiedniej kolejności. Problem polega na tym, że po ponownym wysłaniu bitu startu i próbie zapisu ( i2c_write_byte( (HIH6030_ADDR &lt;&lt; 1) | 0x01 ) ) program się zawiesza i czeka na odpowiednią flagę w pętli while. Załączam kod i schemat podłączonego układu.<br /><br />plik I2C.C<br />[syntax=c]#include &quot;main.h&quot;<br /><br />/* I2C init */<br />void I2Cinit(void)<br />{<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB);<br />/* Enable clock for alternative functions */<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br />/* Enable clock for I2C1 */<br />RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);<br /><br />GPIO_InitTypeDef gpio;<br />I2C_InitTypeDef i2c;<br /><br />/* init GPIO stricture for SDA &amp; SCL */<br />GPIO_StructInit(&amp;gpio);<br />gpio.GPIO_Pin = I2C1_SDA_PINx | I2C1_SCL_PINx;<br />/* Outputs must be Open Drain - no pullup ! */<br />gpio.GPIO_Mode = GPIO_Mode_AF_OD;<br />gpio.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_Init(I2C1_REGx, &amp;gpio);<br /><br />/* init I2C structure */<br />I2C_StructInit(&amp;i2c);<br />i2c.I2C_Mode = I2C_Mode_I2C;<br />/* 100 kHz speed - max 400 kHz but depends on wire's length */<br />/* the longer wires are, the lowest speed shuold be used*/<br />/* to avoid transmission errors */<br />i2c.I2C_ClockSpeed = 100000;<br />I2C_Init(I2C1, &amp;i2c);<br />I2C_Cmd(I2C1, ENABLE);<br />}<br /><br />/* I2C start */<br />void i2c_start(void)<br />{<br />I2C_GenerateSTART(I2C1, ENABLE);<br />while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);<br />}<br /><br />/* I2C send address */<br />void i2c_write_addr(uint8_t addr, I2C_Dir_T mode)<br />{<br />switch(mode)<br />{<br />case I2C_WriteData:<br />{<br />I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);<br />while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);<br />break;<br />}<br />case I2C_ReadData:<br />{<br />I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Receiver);<br />while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS);<br />break;<br />}<br />default:<br />break;<br />}<br />}<br />/* I2C write */<br />void i2c_write_byte(uint8_t data)<br />{<br />I2C_SendData(I2C1, data);<br />while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);<br />}<br /><br />/* I2C read byte */<br />uint8_t i2c_read_byte(void)<br />{<br />while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);<br />return I2C_ReceiveData(I2C1);<br />}<br /><br />/* I2C stop */<br />void i2c_stop(void)<br />{<br />I2C_GenerateSTOP(I2C1, ENABLE);<br />}[/syntax]<br /><br />plik I2C.H<br />[syntax=c]#ifndef I2C_H_<br />#define I2C_H_<br /><br />#define I2C1_SDA_PINx(GPIO_Pin_7)<br />#define I2C1_SCL_PINx(GPIO_Pin_6)<br />#defineI2C1_REGx(GPIOB)<br /><br />typedef enum I2C_Dir_Tag<br />{<br />I2C_WriteData,<br />I2C_ReadData<br />} I2C_Dir_T;<br /><br />void I2Cinit(void);<br />void i2c_start(void);<br />void i2c_stop(void);<br />uint8_t i2c_read_byte(void);<br />void i2c_write_byte(uint8_t data);<br />void i2c_write_addr(uint8_t addr, I2C_Dir_T mode);<br /><br /><br />#endif /* I2C_H_ */[/syntax]<br /><br />plik HIH6030.C<br />[syntax=c]#include &quot;main.h&quot;<br /><br />uint8_t buffer&#91;2&#93;;<br /><br />static void _hih_request_measurement(void)<br />{<br />i2c_start();<br />i2c_write_byte( (HIH6030_ADDR) &lt;&lt; 1 );<br />i2c_stop();<br />_delay_ms(50);<br />}<br />void hih_read_temp(void)<br />{<br />uint16_t HumidBuffer&#91;2&#93;;<br />uint16_t TemperatureBuffer&#91;2&#93;;<br />uint8_t lsbHumid, msbHumid, lsbTemp, msbTemp;<br />long temperature, humidity;<br />long conv_temp, conv_humid;<br /><br />/* request measurement */<br />_hih_request_measurement();<br /><br />i2c_start();<br /><br />I2C_AcknowledgeConfig(I2C1, ENABLE);<br /><br />i2c_write_byte( (HIH6030_ADDR &lt;&lt; 1) | 0x01 );<br /><br />HumidBuffer&#91;0&#93; = i2c_read_byte();<br />HumidBuffer&#91;1&#93; = i2c_read_byte();<br />TemperatureBuffer&#91;0&#93; = i2c_read_byte();<br />TemperatureBuffer&#91;1&#93; = i2c_read_byte();<br /><br />I2C_AcknowledgeConfig(I2C1, DISABLE);<br /><br />i2c_stop();<br /><br />/* humidity conversion */<br />msbHumid = (HumidBuffer&#91;0&#93; &amp; 0x3F);<br />lsbHumid = HumidBuffer&#91;1&#93;;<br />humidity = (msbHumid &lt;&lt; 8) | lsbHumid;<br />conv_humid =  (humidity * 100) &gt;&gt; 14;<br /><br />/* temperature conversion */<br />msbTemp = TemperatureBuffer&#91;0&#93;;<br />lsbTemp = TemperatureBuffer&#91;1&#93;;<br />temperature = ( (msbTemp &lt;&lt; 6) | (lsbTemp &gt;&gt; 2) );<br />conv_temp = ( (temperature * 165) &gt;&gt; 14 ) - 40;<br />}[/syntax]<br /><br />plik HIH_6030.H<br />[syntax=c]#ifndef BMP180_H_<br />#define BMP180_H_<br /><br />#define HIH6030_ADDR(0x27)<br /><br />void hih_read_temp(void);<br /><br />#endif /* HIH6030_H_ */[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />P.S. Dodaję zdj schematu<br /><br /><a href="https://obrazkiforum.atnel.pl/6741/3f2373dd3c98b151e9f4d356ecb4f247.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/6741/3f2373dd3c98b151e9f4d356ecb4f247.JPG" alt="Obrazek" /></a><br /><br />linie SDA i SCL są podłączone do pinów PB7 i PB6<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6741">kubavit</a> — 10 lut 2016, o 14:32</p><hr />
]]></content>
</entry>
</feed>