Guest User

Untitled

a guest
Jan 22nd, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.63 KB | None | 0 0
  1. // ***********************************************************************
  2. //
  3. // Demo program pro vyuku predmetu APPS (09/2012)
  4. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  5. // email:petr.olivka@vsb.cz
  6. //
  7. // Priklad pouzit vyvojoveho nastroje AVR-KIT:
  8. // ovladani sbernice I2C
  9. //
  10. // ***********************************************************************
  11.  
  12. // nejprve hlavickovy soubor AVR-KITu
  13. #include "../avrkit/avrkit.h"
  14.  
  15. #include <stdio.h>
  16. #include <avr/io.h>
  17.  
  18. // ***********************************************************************
  19.  
  20. // Vyber portu, kam je pripojena sbernice I2C
  21. #define I2C_PORT PORTC
  22. #define I2C_DDR DDRC
  23. #define I2C_PIN PINC
  24.  
  25. // Piny signalu SCL a SDA
  26. #define SCL_PIN PINC3
  27. #define SDA_PIN PINC5
  28.  
  29. // Prototypy vsech potrebnych funkci pro sbernici I2C
  30.  
  31. // nastaveni signalu SDA
  32. void I2C_SDA( char value );
  33.  
  34. // cteni signalu SDA
  35. char I2C_getSDA( void );
  36.  
  37. // nastaveni signalu SCL
  38. void I2C_SCL( char value );
  39.  
  40. // inicializace sbernice
  41. void I2C_Init();
  42.  
  43. // oznameni zacatku komunikace
  44. void I2C_Start();
  45.  
  46. // oznameni ukonceni komunikace
  47. void I2C_Stop();
  48.  
  49. // odeslani potvrzovaci bitu ACK
  50. void I2C_Ack();
  51.  
  52. // odeslani potvrzovaciho bitu NACK
  53. void I2C_NAck();
  54.  
  55. // prijem potvrzovaciho bitu
  56. char I2C_getACK();
  57.  
  58. // odeslani 8 bitove hodnoty, vraci ACK
  59. char I2C_Vystup( unsigned char value );
  60.  
  61. // precteni 8 bitove hodnoty
  62. unsigned char I2C_Vstup();
  63.  
  64. //************************************************************************
  65.  
  66. int main()
  67. {
  68.   // inicializace prostredi
  69.   avrkit_init();
  70.  
  71.   printf( "AVR-KIT ready...\n\n" );
  72.  
  73.   // uvedeni sbernice do klidoveho stavu
  74.   I2C_Init();
  75.  
  76.   // zacatek komunikace
  77.  
  78.   for(unsigned int i = 2;i<=256;i+=2)
  79.   {
  80.       I2C_Start();
  81.       if(I2C_Vystup(i)==0)
  82.       {
  83.          
  84.           printf("%d \n", i);
  85.       }
  86.       I2C_Stop();
  87.   }
  88.  
  89.  
  90.   // adresovani registru PCF8574
  91.   // adresa se sklada ze 3 casti!
  92.   //ack = I2C_Vystup( HWADR_PCF8574 | A012 | R_W );
  93.   // kontrola ack
  94.   // ....
  95.   // zapis 8 bitu do registru
  96.   //I2C_Vystup( libovolne_8_bitove_cislo )
  97.   // nyni sviti pozadovane LED
  98.  
  99.   // konec komunikace
  100.  
  101.  
  102.  
  103.  
  104. }
  105.  
  106.  
  107.  
  108. //************************************************************************
  109. //************************************************************************
  110. // sbernice I2C (low level) - ovladani signalu SDA a SCL
  111.  
  112. void I2C_delay() { delay_ms( 1 ); }
  113.  
  114. // nastaveni signalu SDA
  115. void I2C_SDA( char value )
  116. {
  117.   if ( value ) I2C_PORT |= ( 1 << SDA_PIN );
  118.   else         I2C_PORT &= ~( 1 << SDA_PIN );
  119.   I2C_delay();
  120. }
  121.  
  122. // cteni signalu SDA
  123. char I2C_getSDA( void )
  124. {
  125.   char r = ( I2C_PIN & ( 1 << SDA_PIN ) ) != 0;
  126.   I2C_delay();
  127.   return r;
  128. }
  129.  
  130. // nastaveni signalu SCL
  131. void I2C_SCL( char value )
  132. {
  133.   if ( value ) I2C_PORT |= ( 1 << SCL_PIN );
  134.   else         I2C_PORT &= ~( 1 << SCL_PIN );
  135.   I2C_delay();
  136. }
  137.  
  138. //************************************************************************
  139. // Principy komunikace na sbernici I2C jsou popsany v technickych listech
  140. // u kazdeho zarizeni pro toto rozhrani.
  141.  
  142. // inicializace sbernice
  143. void I2C_Init()
  144. {
  145.   I2C_DDR |= ( 1 << SDA_PIN ) | ( 1 << SCL_PIN );
  146.   I2C_SCL( 1 );
  147.   I2C_SDA( 1 );
  148. }
  149.  
  150. // oznameni zacatku komunikace
  151. void I2C_Start()
  152. {
  153.   I2C_SDA( 1 );
  154.   I2C_SCL( 1 );
  155.   I2C_SDA( 0 );
  156.   I2C_SCL( 0 );
  157. }
  158.  
  159. // oznameni ukonceni komunikace
  160. void I2C_Stop()
  161. {
  162.   I2C_SCL( 0 );
  163.   I2C_SDA( 0 );
  164.   I2C_SCL( 1 );
  165.   I2C_SDA( 1 );
  166. }
  167.  
  168. // odeslani potvrzovaci bitu ACK
  169. void I2C_Ack()
  170. {
  171.   I2C_SCL( 0 );
  172.   I2C_SDA( 0 );
  173.   I2C_SCL( 1 );
  174.   I2C_SCL( 0 );
  175. }
  176.  
  177. // odeslani potvrzovaciho bitu NACK
  178. void I2C_NAck()
  179. {
  180.   I2C_SCL( 0 );
  181.   I2C_SDA( 1 );
  182.   I2C_SCL( 1 );
  183.   I2C_SCL( 0 );
  184. }
  185.  
  186. char I2C_getACK()
  187. {
  188.   I2C_SDA( 1 );
  189.   // nastavit SDA_PIN jako vstupni
  190.   I2C_DDR &= ~( 1 << SDA_PIN );
  191.   I2C_SCL( 1 );
  192.  
  193.   char ret = I2C_getSDA();
  194.   I2C_SCL( 0 );
  195.   I2C_DDR |= ( 1 << SDA_PIN );
  196.   return ret;
  197. }
  198.  
  199. // odeslani 8 bitove hodnoty
  200. char I2C_Vystup( unsigned char value )
  201. {
  202.   char mask = 0x80;
  203.   // odeslani bitu, MSB jako prvni
  204.   for ( int i = 0; i < 8; i++ )
  205.   {
  206.       I2C_SDA( value & mask );
  207.       mask >>= 1;
  208.       I2C_SCL( 1 );
  209.       I2C_SCL( 0 );
  210.   }
  211.   return I2C_getACK();
  212. }
  213.  
  214. // precteni 8 bitove hodnoty
  215. unsigned char I2C_Vstup()
  216. {
  217.   unsigned char value = 0;
  218.   // klidovy stav na lince
  219.   I2C_SDA( 1 );
  220.  
  221.   // nastavit SDA_PIN jako vstupni
  222.   I2C_DDR &= ~( 1 << SDA_PIN );
  223.  
  224.   // prijem bitu, MSB jako prvni
  225.   for ( int i = 0; i < 8; i++ )
  226.   {
  227.       value <<= 1;
  228.       I2C_SCL( 1 );
  229.       if ( I2C_getSDA() ) value |= 1;
  230.       I2C_SCL( 0 );
  231.   }
  232.  
  233.   // nastavit SDA_PIN zpet jako vystupni
  234.   I2C_DDR |= ( 1 << SDA_PIN );  
  235.   return value;
  236. }
Add Comment
Please, Sign In to add comment