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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-02-06T21:37:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=2282&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-02-06T21:37:50+01:00</updated>
<published>2013-02-06T21:37:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27064#p27064</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27064#p27064"/>
<title type="html"><![CDATA[Re: Sprzętowa obsługa SPI w RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27064#p27064"><![CDATA[
No i bardzo fajny mod <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lut 2013, o 21:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2013-02-06T19:59:56+01:00</updated>
<published>2013-02-06T19:59:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27055#p27055</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27055#p27055"/>
<title type="html"><![CDATA[Sprzętowa obsługa SPI w RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2282&amp;p=27055#p27055"><![CDATA[
Witam.<br /><br />Do jednego z moich projektów potrzebowałem komunikacji z modułem ISM poprzez SPI, gdzie ta komunikacja odbywała się sprzętowo. Z racji tej, że w przykładach dołączonej do książki układ RFM12 był obsługiwany przez programowe SPI, zmodyfikowałem dwie funkcje w pliku rf12.c<br /><br />[syntax=c]<br />/*! Inicjalizacja modułu transcievera RFM12 */<br />void rf12_init( void ) {<br />// inicjalizacja pinów soft-SPI<br />RF_DDR |= (1&lt;&lt;SDI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />RF_DDR &amp;= ~(1&lt;&lt;SDO);<br />RF_PORT |= (1&lt;&lt;CS);<br /><br />#if SPI_hardware<br /><br />#if CS != 4<br />RF_PORT |= (1&lt;&lt;PB4);<br />#endif<br /><br />#if F_CPU &lt;= 10000000<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR);<br />#else<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR) | (1&lt;&lt;SPR0);<br />#endif<br /><br />#endif<br /><br />#if RF12_UseIRQ == 1<br />RF_PORT |= (1&lt;&lt;SDO);<br />#endif<br /><br />_delay_ms(100);// oczekiwanie na reset modułu<br /><br />#if RF12_UseIRQ == 1<br />// jeśli obsługa na przerwaniach<br />RF12_status.Rx = 0;<br />RF12_status.Tx = 0;<br />RF12_status.New = 0;<br /><br />// inicjalizacja przerwania asynchronicznego INT2<br />RF_IRQDDR &amp;= ~(1&lt;&lt;IRQ);<br />RF_PORT |= (1&lt;&lt;IRQ);<br />GICR |= (1&lt;&lt;INT2);<br />MCUCSR &amp;= ~(1&lt;&lt;ISC2);// zbocze opadające<br /><br />// inicjalizacja przerwania synchronicznego INT0 / INT1<br />//RF_IRQDDR &amp;= ~(1&lt;&lt;IRQ);<br />//RF_PORT |= (1&lt;&lt;IRQ);<br />//GICR |= (1&lt;&lt;INT0); //(1&lt;&lt;INT1);<br />//MCUCR &amp;= (1&lt;&lt;ISC01); //(1&lt;&lt;ISC11);// zbocze opadające<br /><br />#endif<br /><br />}<br /><br /><br />/*! Transmisja słowa do i z modułu RFM12 */<br />uint16_t rf12_trans(uint16_t val)<br />{<br />uint16_t ret_val = 0;<br /><br />RF_PORT &amp;= ~(1&lt;&lt;CS);<br /><br />#if !SPI_hardware<br />uint8_t i;<br />for (i=0; i&lt;16; i++)<br />{<br />if (val &amp; 0x8000) RF_PORT |= (1&lt;&lt;SDI);<br />else RF_PORT &amp;= ~(1&lt;&lt;SDI);<br /><br />ret_val &lt;&lt;= 1;<br />if (RF_PIN&amp;(1&lt;&lt;SDO)) ret_val |= 1;<br />RF_PORT |= (1&lt;&lt;SCK);<br />val &lt;&lt;= 1;<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />RF_PORT &amp;= ~(1&lt;&lt;SCK);<br />}<br />RF_PORT |= (1&lt;&lt;CS);<br /><br /><br />#else<br />RF_PORT &amp;= ~(1&lt;&lt;CS);<br /><br />SPDR = (uint8_t)((val&gt;&gt;8) &amp; 0x00ff);;<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />ret_val = SPDR&lt;&lt;8;<br /><br />SPDR = (uint8_t)((val) &amp; 0x00ff);<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br /><br />ret_val|= SPDR;<br /><br />#endif<br /><br />RF_PORT |= (1&lt;&lt;CS);<br />return ret_val;<br />}<br />[/syntax]<br /><br />oraz w pliku rf12.h dodałem:<br /><br />[syntax=c]<br />/*****************************************************************/<br />/*!<br /> * SPI_hardware = 1 - spi sprzętowe<br /> * SPI_hardware = 0 - spi programowe<br /> */<br />#define SPI_hardware 1<br />[/syntax]<br /><br />Dzięki powyższemu możliwa jest zmiana na obsługę programową bądź sprzętową SPI.<br /><br />Sprawdzałem przy dwóch wartościach kwarcu - 6 i 16 MHz - działa.<br /><br />Jedynie czego nie rozumiem to dlaczego muszę mieć aktywowany pin 4 portu b (SS) kiedy do niego nie jest podłączony nSEL urządzenia. Dlatego umieściłem taki mały warunek dla kompilatora, który rozpoznaje czy nSEL jest podpięty do SS uC czy nie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 6 lut 2013, o 19:59</p><hr />
]]></content>
</entry>
</feed>