Advertisement
arxeiss

APPS - I2C

Oct 14th, 2013
617
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.53 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.  
  13. int main()
  14. {
  15.   // inicializace prostredi
  16.   avrkit_init();
  17.  
  18.   printf( "AVR-KIT ready...\n\n" );
  19.  
  20.   // uvedeni sbernice do klidoveho stavu
  21.   I2C_Init();
  22.  
  23.   // zacatek komunikace
  24.      
  25.     char adress = 0b10110000 | 0b1110;
  26.      
  27.     //nastvení kontinuálního měření
  28.     I2C_Start();
  29.     char ACK = !I2C_Vystup( adress | 0 );
  30.     if (!ACK)
  31.         return 0;
  32.      
  33.     ACK = !I2C_Vystup(0xAC);
  34.     if (!ACK)
  35.         return 0;
  36.          
  37.     ACK = !I2C_Vystup(0);
  38.     if (!ACK)
  39.         return 0;  
  40.     I2C_Stop();
  41.      
  42.     //Nastavení horní meze termostatu
  43.     I2C_Start();
  44.     ACK = !I2C_Vystup( adress | 0 );
  45.     if (!ACK)
  46.         return 0;
  47.      
  48.     ACK = !I2C_Vystup(0xA1);
  49.     if (!ACK)
  50.         return 0;
  51.      
  52.     ACK = !I2C_Vystup(25);
  53.     if (!ACK)
  54.         return 0;
  55.          
  56.     ACK = !I2C_Vystup(128); //25,5°C
  57.     if (!ACK)
  58.         return 0;
  59.     I2C_Stop();
  60.      
  61.     //Nastavení spodní meze termostatu
  62.     I2C_Start();
  63.     ACK = !I2C_Vystup( adress | 0 );
  64.     if (!ACK)
  65.         return 0;
  66.          
  67.     ACK = !I2C_Vystup(0xA2);
  68.     if (!ACK)
  69.         return 0;
  70.      
  71.     ACK = !I2C_Vystup(27);
  72.     if (!ACK)
  73.         return 0;
  74.      
  75.     ACK = !I2C_Vystup(0); //27°C
  76.     if (!ACK)
  77.         return 0;
  78.     I2C_Stop();
  79.      
  80.      
  81.     //nastartování měření teploty
  82.     I2C_Start();    
  83.     ACK = !I2C_Vystup( adress | 0 );
  84.     if (!ACK)
  85.         return 0;
  86.      
  87.     ACK = !I2C_Vystup(0xEE);
  88.     if (!ACK)
  89.         return 0;
  90.     I2C_Stop();
  91.      
  92.     //čtneí teploty
  93.     while(1){
  94.         I2C_Start();
  95.         ACK = !I2C_Vystup( adress | 0 );
  96.         if (!ACK)
  97.             return 0;
  98.      
  99.         ACK = !I2C_Vystup( 0xAA );
  100.         if (!ACK)
  101.             return 0;
  102.      
  103.         I2C_Start();
  104.         ACK = !I2C_Vystup( adress | 1 );
  105.         if (!ACK)
  106.             return 0;
  107.      
  108.         char receive = I2C_Vstup();
  109.         I2C_Ack();
  110.          
  111.         char receiveHalf = I2C_Vstup();
  112.         I2C_NAck();
  113.          
  114.         printf("%d,%d\n\n",receive,(receiveHalf > 0 ) ? 5 : 0 );        
  115.         I2C_Stop();
  116.          
  117.         delay_ms(500);
  118.     }
  119.  
  120. }
  121.  
  122. void puvodni_obsah_mainu() {
  123. //zápis čísla na expandér což se zobrazí na LEDkách a následné přečtení
  124.   if(ACK){
  125.      char run = 1;
  126.      while(run != 0){
  127.          if(I2C_Vystup(run))
  128.             break;
  129.          run <<= 1;
  130.          delay_ms(10);
  131.      }
  132.      ACK = !I2C_Vystup(67);
  133.   }
  134.   if (!ACK)
  135.       return 0;
  136.        
  137.   I2C_Start();
  138.   ACK = !I2C_Vystup( 0b01000000 | 0b0000 | 0b1);
  139.   if(ACK){
  140.      char receive = I2C_Vstup();
  141.      I2C_Ack();
  142.      printf("%d",receive);
  143.   }
  144.  }
  145.  
  146. //************************************************************************
  147. //************************************************************************
  148. // sbernice I2C (low level) - ovladani signalu SDA a SCL
  149.  
  150. void I2C_delay() { delay_ms( 1 ); }
  151.  
  152. // nastaveni signalu SDA
  153. void I2C_SDA( char value )
  154. {
  155.   if ( value ) I2C_PORT |= ( 1 << SDA_PIN );
  156.   else         I2C_PORT &= ~( 1 << SDA_PIN );
  157.   I2C_delay();
  158. }
  159.  
  160. // cteni signalu SDA
  161. char I2C_getSDA( void )
  162. {
  163.   char r = ( I2C_PIN & ( 1 << SDA_PIN ) ) != 0;
  164.   I2C_delay();
  165.   return r;
  166. }
  167.  
  168. // nastaveni signalu SCL
  169. void I2C_SCL( char value )
  170. {
  171.   if ( value ) I2C_PORT |= ( 1 << SCL_PIN );
  172.   else         I2C_PORT &= ~( 1 << SCL_PIN );
  173.   I2C_delay();
  174. }
  175.  
  176. //************************************************************************
  177. // Principy komunikace na sbernici I2C jsou popsany v technickych listech
  178. // u kazdeho zarizeni pro toto rozhrani.
  179.  
  180. // inicializace sbernice
  181. void I2C_Init()
  182. {
  183.   I2C_DDR |= ( 1 << SDA_PIN ) | ( 1 << SCL_PIN );
  184.   I2C_SCL( 1 );
  185.   I2C_SDA( 1 );
  186. }
  187.  
  188. // oznameni zacatku komunikace
  189. void I2C_Start()
  190. {
  191.   I2C_SDA( 1 );
  192.   I2C_SCL( 1 );
  193.   I2C_SDA( 0 );
  194.   I2C_SCL( 0 );
  195. }
  196.  
  197. // oznameni ukonceni komunikace
  198. void I2C_Stop()
  199. {
  200.   I2C_SCL( 0 );
  201.   I2C_SDA( 0 );
  202.   I2C_SCL( 1 );
  203.   I2C_SDA( 1 );
  204. }
  205.  
  206. // odeslani potvrzovaci bitu ACK
  207. void I2C_Ack()
  208. {
  209.   I2C_SCL( 0 );
  210.   I2C_SDA( 0 );
  211.   I2C_SCL( 1 );
  212.   I2C_SCL( 0 );
  213. }
  214.  
  215. // odeslani potvrzovaciho bitu NACK
  216. void I2C_NAck()
  217. {
  218.   I2C_SCL( 0 );
  219.   I2C_SDA( 1 );
  220.   I2C_SCL( 1 );
  221.   I2C_SCL( 0 );
  222. }
  223.  
  224. char I2C_getACK()
  225. {
  226.   I2C_SDA( 1 );
  227.   // nastavit SDA_PIN jako vstupni
  228.   I2C_DDR &= ~( 1 << SDA_PIN );
  229.   I2C_SCL( 1 );
  230.  
  231.   char ret = I2C_getSDA();
  232.   I2C_SCL( 0 );
  233.   I2C_DDR |= ( 1 << SDA_PIN );
  234.   return ret;
  235. }
  236.  
  237. // odeslani 8 bitove hodnoty
  238. char I2C_Vystup( unsigned char value )
  239. {
  240.   char mask = 0x80;
  241.   // odeslani bitu, MSB jako prvni
  242.   for ( int i = 0; i < 8; i++ )
  243.   {
  244.       I2C_SDA( value & mask );
  245.       mask >>= 1;
  246.       I2C_SCL( 1 );
  247.       I2C_SCL( 0 );
  248.   }
  249.   return I2C_getACK();
  250. }
  251.  
  252. // precteni 8 bitove hodnoty
  253. unsigned char I2C_Vstup()
  254. {
  255.   unsigned char value = 0;
  256.   // klidovy stav na lince
  257.   I2C_SDA( 1 );
  258.    
  259.   // nastavit SDA_PIN jako vstupni
  260.   I2C_DDR &= ~( 1 << SDA_PIN );
  261.  
  262.   // prijem bitu, MSB jako prvni
  263.   for ( int i = 0; i < 8; i++ )
  264.   {
  265.       value <<= 1;
  266.       I2C_SCL( 1 );
  267.       if ( I2C_getSDA() ) value |= 1;
  268.       I2C_SCL( 0 );
  269.   }
  270.    
  271.   // nastavit SDA_PIN zpet jako vystupni
  272.   I2C_DDR |= ( 1 << SDA_PIN );  
  273.   return value;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement