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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-22T21:53:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=12091&amp;mode</id>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2015-06-22T21:53:24+01:00</updated>
<published>2015-06-22T21:53:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132550#p132550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132550#p132550"/>
<title type="html"><![CDATA[Re: STM32F051 - 1Wire z wykorzystaniem USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132550#p132550"><![CDATA[
Po co ci cały ten układ, jak w twoim stmie możesz ustawić pin tx jako open-drain i połączyć z rxem i gotowe <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Co do kodu to kiedyś to wykorzystałem co prawda na lpc812. Wrzucam kod który działał jednak jest napisany na szybko &quot;by tylko działało&quot; z przerobieniem na stma se poradzisz, looknij tylko do noty LPC812. Jak już mówiłem kod jest paskudny, i aż wstyd go publikować <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />[syntax=c]uint8_t reset_1w(void){<br />uint8_t tmp, ret_val = 1;<br />change_brg(391);<br />tmp = send_rcv_uart(0xf0);<br />change_brg(33);<br />if(tmp == 0xf0) ret_val = 0;<br />if(tmp == 0) ret_val = 2;<br />return ret_val;<br />}<br /><br />void send_1w(uint8_t data){<br />for(uint8_t i = 0; i &lt; 8; i++){<br />if(data &amp; 1) send_rcv_uart(0xff);<br />else send_rcv_uart(0);<br />data &gt;&gt;= 1;<br />}<br />}<br /><br />uint8_t rcv_1w(void){<br />uint8_t t_data = 0;<br />for(uint8_t i = 1; i != 0; i &lt;&lt;= 1){<br />if(send_rcv_uart(0xff) == 0xff) t_data |= i;<br />}<br />return t_data;<br />}<br />void usart0_init(){<br />LPC_USART0-&gt;CFG = (1&lt;&lt;0) | (1&lt;&lt;2);<br />change_brg(391);<br />}<br /><br />void change_brg(uint16_t brg){<br />LPC_USART0-&gt;CFG &amp;= ~(1&lt;&lt;0);<br />LPC_USART0-&gt;BRG = brg;<br />LPC_USART0-&gt;CFG |= (1&lt;&lt;0);<br />}<br /><br />uint8_t send_rcv_uart(uint8_t data){<br />uint8_t tmp;<br />while(!(LPC_USART0-&gt;STAT &amp; (1&lt;&lt;2)));<br />LPC_USART0-&gt;TXDATA = data;<br />while(!(LPC_USART0-&gt;STAT &amp; (1&lt;&lt;0)));<br />tmp = LPC_USART0-&gt;RXDATA;<br />return tmp;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 22 cze 2015, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[damiandoles]]></name></author>
<updated>2015-06-22T15:27:29+01:00</updated>
<published>2015-06-22T15:27:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132504#p132504</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132504#p132504"/>
<title type="html"><![CDATA[STM32F051 - 1Wire z wykorzystaniem USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12091&amp;p=132504#p132504"><![CDATA[
Witam, pracuję nad implementacją protokołu 1Wire wykorzystując moduł USART - w necie niby sporo dokumentów i poradników na ten temat jednak średnio coś mi wychodzi. We większości skorzystałem z kodu zamieszczonego na elektrodzie (nie wiem czy moge podać link, ale chętnie to zrobię). Procesor STM32f051 na płytce Discovery a środowisko Eclipse Luna. Sam moduł USART działa i wielokrotnie go wykorzystywałem. Na oscyloskopie linia DQ jest ciągle w stanie wysokim, nie widzę żadnego przebiegu wysyłanego z pinu TX USARTu. Schemat &quot;konwerterka&quot; 1wire-usart czyli de facto zaimplementowanie wyjścia open drain na TX wziąłem z:<br /><br /><!-- m --><a class="postlink" href="http://www.maximintegrated.com/en/app-notes/index.mvp/id/214" >http://www.maximintegrated.com/en/app-n ... mvp/id/214</a><!-- m --><br /><br />i wygląda on tak:<br /><br /><a href="http://obrazki.elektroda.pl/1442722000_1434897050.png"  class="postlink"><img src="http://obrazki.elektroda.pl/1442722000_1434897050_thumb.jpg" alt="Obrazek" /></a><br /><br />--- GND1 i GND2 zawrte jakby co<br /><br />Tranzystory dałem BSS138 (mosfet typu N(:<br />0.22 A, 50 V. RDS(ON) = 3.5Ω @ VGS = 10 V<br />RDS(ON) = 6.0Ω @ VGS = 4.5 V<br /><br />[syntax=c]#include &quot;stm32f0xx.h&quot;<br />#include &quot;stm32f0xx_gpio.h&quot;<br />#include &quot;stm32f0xx_usart.h&quot;<br /><br />// usart2<br /><br />#define USART_PCLK24000000ul<br />#define USART_BAUDRATE_115200115200ul<br />#define USART_BAUDRATE_96009600ul<br />#define USART_BRR__115200(USART_PCLK/USART_BAUDRATE_115200)<br />#define USART_BRR__9600(USART_PCLK/USART_BAUDRATE_9600)<br /><br />uint8_t reset_1w(void)<br />{<br />uint8_t tmp = 0;<br /><br />USART2-&gt;BRR = USART_BRR__9600; //  0x0341;   // BAUD = 9600<br />while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);<br />USART_SendData(USART2,0xF0);// sygnal reset<br />while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);<br />tmp = USART_ReceiveData(USART2);// opowiedz na reset = 0xE0- dziala<br /><br />while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); // transmisja moze trwac wiec czekamy na TC<br />USART2-&gt;BRR = USART_BRR__115200; // 0x0045;  // BAUD = 115200111<br />if(tmp==0xe0)<br />{<br />tmp=1;<br />}<br />else<br />{<br />USART2-&gt;ISR = 0x00C0;<br />}<br />return tmp;<br />}<br /><br />void send_1w(uint8_t dana)<br />{<br />  uint8_t u;<br />  uint8_t xxx;<br /><br />  for(u=0; u&lt;8; u++)<br />  {<br />   xxx=0x01&amp;dana;<br />   if (xxx==0)<br />   {      // wysylanie 0<br />while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);<br />USART_SendData(USART2,0x00);<br />while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);<br />USART_ReceiveData(USART2);<br />   }<br />   else<br />   {<br />while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);<br />USART_SendData(USART2,0xFF);<br />while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);<br />USART_ReceiveData(USART2);<br />   }<br />   dana&gt;&gt;=1;<br />  }<br />} <br /><br />unsigned char receive_1w(void)<br />{<br />  uint8_t u, tmp, xxx=0x00;<br /> <br />  for(u=0; u&lt;8; u++)<br />  {<br />    xxx&gt;&gt;=1;             //x=x&gt;&gt;1;<br />while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);<br />USART_SendData(USART2,0xFF);<br />while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);<br />tmp = USART_ReceiveData(USART2);<br />    if(tmp==0xff)<br />    xxx=xxx+0x80;<br />  }<br />  return xxx;<br />}<br /><br />void UsartInit2(void)<br />{<br />    /* Enable GPIO clock */<br />    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);<br /><br />    /* Enable USART clock */<br />    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);<br /><br />    /* Connect PXx to USARTx_Tx */<br />    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);<br /><br />    /* Connect PXx to USARTx_Rx */<br />    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);<br /><br />    /* Configure USART Tx, Rx as alternate function push-pull */<br />    GPIO_InitTypeDef GPIO_InitStructure;<br />    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;<br />    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;<br />    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;<br />    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;<br />    GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);<br />USART_ClockInitTypeDef USART_ClockInitStructure;<br />USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;<br />USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;<br />USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;<br />USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;<br /> <br />USART_InitTypeDef USART_InitStructure;<br /> USART_InitStructure.USART_BaudRate = 9600; // ;<br />USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />USART_InitStructure.USART_Parity = USART_Parity_No ;<br />USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br /> <br />    USART_Init(USART2, &amp;USART_InitStructure);<br />USART_ClockInit(USART2, &amp;USART_ClockInitStructure);<br /><br />USART2-&gt;CR2 &amp;= ~USART_CR2_LINEN;<br />USART2-&gt;CR2 &amp;= ~USART_CR2_CLKEN;<br />    USART2-&gt;CR3 &amp;= ~USART_CR3_SCEN; //scen<br />USART2-&gt;CR3 &amp;= ~USART_CR3_IREN; //iren<br /><br />USART_HalfDuplexCmd(USART2, ENABLE );<br />USART_Cmd(USART2, ENABLE );<br />}[/syntax]<br />Myślę, że może być zamiast tych 2N7002, co zatem robię nie tak ? Program umiera na linijce:<br />[syntax=c]while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);[/syntax]<br /><br />podczas komendy reset...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1669">damiandoles</a> — 22 cze 2015, o 15:27</p><hr />
]]></content>
</entry>
</feed>