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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-08T11:24:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=7341&amp;mode</id>
<entry>
<author><name><![CDATA[rafkins22]]></name></author>
<updated>2014-06-08T11:24:06+01:00</updated>
<published>2014-06-08T11:24:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7341&amp;p=83698#p83698</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7341&amp;p=83698#p83698"/>
<title type="html"><![CDATA[STM32f4 discovery-obsługa czujnika ciśnienia I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7341&amp;p=83698#p83698"><![CDATA[
Witam!<br /><br />Od kilku dni męczę się z odbiorem danych z czujnika ciśnienia ASDXRRX100PG2A5 poprzez magistrale I2C - nota katalogowa:<br /><br /><!-- m --><a class="postlink" href="http://www.farnell.com/datasheets/1765461.pdf" >http://www.farnell.com/datasheets/1765461.pdf</a><!-- m --><br /><br />Czujnik połączony jest z płytką STM32F4 discovery poprzez konwerter poziomów logicznych 3,3/5V. Udaje mi się odebrać z niego dane. O ile 2 bajt widać że się zmienia w przedziale 96-130 jak dotknę palcem rurki na czujniku do wprowadzenia ciśnienia, to bajt 1 jest cały czas równy 6 i nic się nie zmienia. Nie mam pojęcia dlaczego tak się dzieje. <br /><br />Funkcja do odczytu danych<br />[syntax=c]unsigned char Bufor&#91;2&#93;={0};<br /><br /><br />void ASDX(signed short * asdx_value)<br />{<br /><br /><br />unsigned int NumByteToReadN, i;<br /><br />/* While the bus is busy */<br />while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));<br /><br />    /* START */<br />    I2C_GenerateSTART(I2C2, ENABLE);<br /><br />    /* Jeżeli START przebegł pomyslnie */<br />    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));<br /><br />    /* Wysłanie adresu czujnik cisnienia 0x50 - ZAPIS */<br />I2C_Send7bitAddress(I2C2, 0x50, I2C_Direction_Transmitter);<br /><br />    /* Potwierdzenie odbioru adresu */<br />    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));<br /><br />    /* Ponowny start */<br />     I2C_GenerateSTART(I2C2,ENABLE);<br /><br />     /* Jezeli START przebiegł pomyslnie */<br />     while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));<br /><br />     /* Wysłanie adresu czujnik cisnienia 0x50 - ODCZYT */<br />     I2C_Send7bitAddress(I2C2, 0x51, I2C_Direction_Receiver);<br /><br />     /* Potwierdzenie odbioru adresu */<br />     while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));<br /><br />     NumByteToReadN=2;  //Read 2 bytes<br />     i=0;<br />     while(NumByteToReadN) {<br />       //Before receiving last byte, disable acknowledge and generate stop<br />       if(NumByteToReadN == 1) {<br />       I2C_AcknowledgeConfig(I2C2, DISABLE);<br />       I2C_GenerateSTOP(I2C2, ENABLE);<br /><br />       }<br /><br />       while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED));<br />       //Odczyt bajtu z ASDX<br />       Bufor&#91;i&#93; = I2C_ReceiveData(I2C2);<br />       //Test on EV7 and clear it<br />       i++;<br />       NumByteToReadN--;<br />     }<br />     //Enable Acknowledge for next transmission<br />     I2C_AcknowledgeConfig(I2C2, ENABLE);<br /><br />     //Zapis danych<br />     *asdx_value=(signed short)((Bufor&#91;0&#93;&lt;&lt;8)|Bufor&#91;1&#93;);<br />}[/syntax]<br /><br />Konfiguracja I2C:<br />[syntax=c]void ASDX_Configuration(void)<br />{ //GPIO and SPI configuration<br /><br />  GPIO_InitTypeDef  GPIO_InitStructure;<br />  I2C_InitTypeDef I2C_InitStructure;<br /><br />  // enable APB1 peripheral clock for I2C2<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);<br />  // enable clock for SCL and SDA pins<br />  //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);<br /><br />  //GPIO Config<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;      //I2C - SCL &amp; SDA<br />  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;<br />  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;<br />  GPIO_Init(GPIOB, &amp;GPIO_InitStructure);<br /><br />  // Connect I2C1 pins to AF<br />  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); // SCL<br />  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2); // SDA<br /><br />  //I2C Config<br />  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;                //I2C mode<br />  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;        //High to low state ratio of SCK, important for &gt;100kHz transmission speed<br />  I2C_InitStructure.I2C_OwnAddress1 = 0x03;                 //I2C address at MCU side (if it works as slave)<br />  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;               //Acknowledge enable<br />  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //Addressing mode<br />  I2C_InitStructure.I2C_ClockSpeed=100000;                  //Clock frequency<br />  I2C_Init(I2C2,&amp;I2C_InitStructure);<br /><br />  I2C_Cmd(I2C2, ENABLE);<br />}[/syntax]<br /><br /><br />Odczyt i wysyłanie na terminal:<br />[syntax=c]ASDX(&amp;asdx_value);<br /><br />uart_putint(Bufor&#91;0&#93;,10);  // = 6 cały czas<br />send_string(&quot;\r\n&quot;);<br />uart_putint(Bufor&#91;1&#93;,10); // zmienia się w przedziale 96-130<br />send_string(&quot;\r\n&quot;);<br />uart_putint(asdx_value,10);<br />send_string(&quot;\r\n&quot;);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=488">rafkins22</a> — 8 cze 2014, o 11:24</p><hr />
]]></content>
</entry>
</feed>