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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-01T13:44:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=19509&amp;mode</id>
<entry>
<author><name><![CDATA[Elektro_maniak]]></name></author>
<updated>2017-11-01T13:44:10+01:00</updated>
<published>2017-11-01T13:44:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19509&amp;p=198150#p198150</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19509&amp;p=198150#p198150"/>
<title type="html"><![CDATA[STMPE811, reset bufora FIFO]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19509&amp;p=198150#p198150"><![CDATA[
Hej,<br /><br />Od dwóch dni walczę z układem STMPE811. Wzoruję się na artykułach Mirka oraz na rozdziale z zielonej książki.<br /><br />Dostaję tylko jedno przerwanie z układu w momencie, gdy w buforze FIFO jest jedna próbka (czyli tak jak ustawiłem).<br /><br />Wyniki odczytuję oraz robię reset flagi FIFO Threshold interrupt (do rejestru STMPE811_INT_STA wysyłam wartość 0x02). Nie resetuje to jednak stanu bufora. Bufor napełnia się do jego maksymalnej wartości 127 (odczytane z rejestru FIFO_SIZE) i nie zgłasza dalej przerwań (bo niby jak ma zgłaszać, skoro jest ustawione przerwanie na wystąpienie tylko jednej próbki a bufor jest napełniony). Układ wisi z napełnionym buforem do czasu, aż go ręcznie nie opróżnię bądź zresetuje (zakomentowane linijki przy obsłudze przerwania). <br /><br />Takie zachowanie układu wydaje mi się poprawne, ale dlaczego w bibliotekach Mirka nie ma tego uwzględnionego? Jest tylko pod koniec wysyłanie do INT_STA wartości 0x02, ale to nie rozwiązuje mojego problemu. Co źle rozumuję? Byłem pewny, że wyczyści to stan bufora i znowu zostanie zgłoszone przerwanie a tak to układ wisi i czeka. Czy ta konfiguracja nie ogranicza wielkości bufora do 1? <br /><br />Przy każdorazowym ręcznym resecie (0x01 do STMPE811_FIFO_STA a potem 0x00) układ działa OK, ale nie wydaje mi się, aby to było poprawne rozwiązanie, zważywszy na fakt, że Mirek tego nie robi a działa mu poprawnie.<br /><br />Mikrokontroler STM32F103RET6<br /><br />Schemat połączenia:<br /><a href="https://obrazkiforum.atnel.pl/2202/45ba06a7a03df73f8e052562e9732b63.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2202/45ba06a7a03df73f8e052562e9732b63.png" alt="Obrazek" /></a><br /><br />Kod obsługi:<br />[syntax=c]#include &quot;stm32f103xe.h&quot;<br /><br />#include &quot;stmpe811.h&quot;<br /><br />#include &quot;../COMMON/common.h&quot;<br />#include &quot;../I2C/i2c.h&quot;<br />#include &quot;../UART/uart.h&quot;<br /><br />STMPE811_data STMPE811_xyz;<br />volatile uint8_t STMPE811_dataReady;<br /><br />void STMPE811_init(void)<br />{<br />STMPE811_dataReady = 0;<br /><br />uint8_t buff&#91;2&#93;;<br />I2C1_bufferRead(STMPE811_ADDR, 0x00, 2, buff);<br /><br />uint16_t CHIP_ID = buff&#91;0&#93; &lt;&lt; 8 | buff&#91;1&#93;;<br /><br />if ( CHIP_ID != STMPE811_CHIP_ID )<br />{<br />while(1)<br />{<br />//UART4_puts(&quot;Brak STMPE811\r\n&quot;);<br />LED_RED_TOGGLE;<br />delay_ms(500);<br />}<br />} else LED_BLUE_ON;<br /><br />// konfiguracja STMPE811<br />uint8_t val&#91;2&#93;;<br />// zalaczenie zegara dla ADC, Touch Screen<br />val&#91;0&#93; = STMPE811_SYS_CTRL2;<br />val&#91;1&#93; = 0x0C; // TSC &amp; ADC - CLK ON<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// zalaczenie przerwania od kolejki FIFO<br />val&#91;0&#93; = STMPE811_INT_EN;<br />val&#91;1&#93; = 0x02; // Enable FIFO_TH interrupt    0x02<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// ustawienie czasu probkowania oraz rozdzielczosci ADC<br />val&#91;0&#93; = STMPE811_ADC_CTRL1;<br />val&#91;1&#93; = 0x48; // Sample time 80, ADC 12bit mode<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />delay_ms(5);<br /><br />// ustawienie częstotliwości ADC<br />val&#91;0&#93; = STMPE811_ADC_CTRL2;<br />val&#91;1&#93; = 0x01; // ADC Freq = 3,25MHz<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// ustawienie GPIO touch screen na ADC<br />val&#91;0&#93; = STMPE811_GPIO_ALT_FUNCT;<br />val&#91;1&#93; = 0x00;// Set GPIO as touch screen and ADC<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />//<br />val&#91;0&#93; = STMPE811_TSC_CFG;<br />val&#91;1&#93; = 0x9A;// panel drive settling time = 500us, touch detect delay = 500us, average control = 4 samples<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// ile minimum probek w buforze FIFO, by wygenerowac przerwanie<br />val&#91;0&#93; = STMPE811_FIFO_TH;<br />val&#91;1&#93; = 0x01;// fifo threshold = 1 (can't be 0)<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// reset FIFO<br />val&#91;0&#93; = STMPE811_FIFO_STA;<br />val&#91;1&#93; = 0x01;// fifo reset<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />val&#91;0&#93; = STMPE811_FIFO_STA;<br />val&#91;1&#93; = 0x00;// fifo put out of reset mode<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// fractional part<br />val&#91;0&#93; = STMPE811_TSC_FRACTION_Z;<br />val&#91;1&#93; = 0x07;// fractional part is 7, whole part is 1<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// maximum current on the touchscreen controller (TSC) driving channel<br />val&#91;0&#93; = STMPE811_TSC_I_DRIVE;<br />val&#91;1&#93; = 0x01;// max current limit = 50 mA<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// 4-wire touchscreen controller (TSC) setup.<br />val&#91;0&#93; = STMPE811_TSC_CTRL;<br />val&#91;1&#93; = 0x01;// no window tracking, X,Y and Z aquisition<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// wyczyszczenie flag przerwan<br />val&#91;0&#93; = STMPE811_INT_STA;<br />val&#91;1&#93; = 0xff;// clear all interrupts<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />// wlaczenie przerwan<br />val&#91;0&#93; = STMPE811_INT_CTRL;<br />val&#91;1&#93; = 0x03;// en global INT, edge, failing<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br /><br />// konfiguracja przerwania zewnetrznego<br /><br />// pin przerwania w stmpe811 jest typu open drain, nalezy ustawic podciagniecie do VCC<br />// przerwanie jest generowane przy opadajacym zboczu<br /><br />RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN;<br /><br />// PD2 - input with pull-up/pull-down<br />//GPIOD-&gt;CRL &amp;=~ GPIO_CRL_MODE2;<br />GPIOD-&gt;CRL &amp;=~ GPIO_CRL_CNF2_0;<br />GPIOD-&gt;CRL |=  GPIO_CRL_CNF2_1;<br /><br />GPIOD-&gt;ODR |= GPIO_ODR_ODR2; // podciagniecie do VCC<br /><br />// konfiguracja przerwania zewnętrznego<br />AFIO-&gt;EXTICR&#91;0&#93; |=  AFIO_EXTICR1_EXTI2_PD;<br /><br />EXTI-&gt;IMR |= EXTI_IMR_MR2;<br /><br />// reakcja na zbocze  opadające<br />EXTI-&gt;FTSR |= EXTI_FTSR_FT2;<br /><br />// załączenie przerwania zewnętrznego<br />NVIC_EnableIRQ(EXTI2_IRQn);<br /><br />}<br /><br />uint8_t STMPE811_getData(void)<br />{<br />static uint8_t stbuf&#91;5&#93;;<br />uint32_t tmp=0;<br /><br />if (!STMPE811_dataReady) return 0;<br /><br />// read INT_STA (interrupt status register)<br />I2C1_bufferRead(STMPE811_ADDR, STMPE811_INT_STA, 2, stbuf);<br /><br />// check FIFO Threshold interrupt<br />if( stbuf&#91;0&#93; &amp; 0x02 )<br />{<br />// read TSC_DATA_X - address = 0x4d (2 bytes)<br />// read TSC_DATA_Y - address = 0x4f (2 bytes)<br />// read TSC_DATA_Z - address = 0x51 (1 byte)<br />I2C1_bufferRead(STMPE811_ADDR, STMPE811_TSC_DATA_X, 5, stbuf);<br /><br />STMPE811_xyz.X = ( (stbuf&#91;0&#93; &lt;&lt; 8) | (stbuf&#91;1&#93;) );<br />STMPE811_xyz.Y = ( (stbuf&#91;2&#93; &lt;&lt; 8) | (stbuf&#91;3&#93;) );<br />STMPE811_xyz.Z = stbuf&#91;4&#93;;<br /><br />// konwersja ADC na wspolrzedne X<br />tmp = ( (uint32_t)STMPE811_xyz.X * (STMPE811_TSC_WIDTH + 10) ) &gt;&gt; 12;<br />STMPE811_xyz.X = (STMPE811_TSC_WIDTH + 10) - tmp;<br /><br />// konwersja ADC na wspolrzedne Y<br />tmp = ( (uint32_t)STMPE811_xyz.Y * (STMPE811_TSC_HEIGHT + 10) ) &gt;&gt; 12;<br />STMPE811_xyz.Y = (STMPE811_TSC_HEIGHT + 10) - tmp;<br /><br />uint8_t val&#91;2&#93;;<br />val&#91;0&#93; = STMPE811_INT_STA;<br />val&#91;1&#93; = 0x02;<br />I2C1_bufferWrite(STMPE811_ADDR, 2, val); // reset FIFO Threshold interrupt<br /><br />// reset FIFO<br />//val&#91;0&#93; = STMPE811_FIFO_STA;<br />//val&#91;1&#93; = 0x01;// fifo reset<br />//I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />//val&#91;0&#93; = STMPE811_FIFO_STA;<br />//val&#91;1&#93; = 0x00;// fifo put out of reset mode<br />//I2C1_bufferWrite(STMPE811_ADDR, 2, val);<br /><br />STMPE811_dataReady = 0;<br />return 1;<br />}<br /><br />return 0;<br />}<br /><br /><br />__attribute__((interrupt)) void EXTI2_IRQHandler(void)<br />{<br />if (EXTI-&gt;PR &amp; EXTI_PR_PR2) // PD2<br />{<br />EXTI-&gt;PR = EXTI_PR_PR2;<br /><br />LED_GREEN_TOGGLE;<br />STMPE811_dataReady = 1;<br />}<br />}[/syntax]<br /><br /><br />Bardzo dziękuję za cenne rady i wskazówki<br /><br />Pozdrawiam<br />Elektro_maniak<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2202">Elektro_maniak</a> — 1 lis 2017, o 13:44</p><hr />
]]></content>
</entry>
</feed>