Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************************
- //
- // Demo program pro vyuku predmetu APPS (09/2012)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouzit vyvojoveho nastroje AVR-KIT:
- // ovladani sbernice I2C
- //
- // ***********************************************************************
- // nejprve hlavickovy soubor AVR-KITu
- #include "../avrkit/avrkit.h"
- #include <stdio.h>
- #include <avr/io.h>
- // ***********************************************************************
- // Vyber portu, kam je pripojena sbernice I2C
- #define I2C_PORT PORTC
- #define I2C_DDR DDRC
- #define I2C_PIN PINC
- // Piny signalu SCL a SDA
- #define SCL_PIN PINC3
- #define SDA_PIN PINC5
- // Prototypy vsech potrebnych funkci pro sbernici I2C
- // nastaveni signalu SDA
- void I2C_SDA( char value );
- // cteni signalu SDA
- char I2C_getSDA( void );
- // nastaveni signalu SCL
- void I2C_SCL( char value );
- // inicializace sbernice
- void I2C_Init();
- // oznameni zacatku komunikace
- void I2C_Start();
- // oznameni ukonceni komunikace
- void I2C_Stop();
- // odeslani potvrzovaci bitu ACK
- void I2C_Ack();
- // odeslani potvrzovaciho bitu NACK
- void I2C_NAck();
- // prijem potvrzovaciho bitu
- char I2C_getACK();
- // odeslani 8 bitove hodnoty, vraci ACK
- char I2C_Vystup( unsigned char value );
- // precteni 8 bitove hodnoty
- unsigned char I2C_Vstup();
- //************************************************************************
- int main()
- {
- // inicializace prostredi
- avrkit_init();
- printf( "AVR-KIT ready...\n\n" );
- // uvedeni sbernice do klidoveho stavu
- I2C_Init();
- // zacatek komunikace
- for(unsigned int i = 2;i<=256;i+=2)
- {
- I2C_Start();
- if(I2C_Vystup(i)==0)
- {
- printf("%d \n", i);
- }
- I2C_Stop();
- }
- // adresovani registru PCF8574
- // adresa se sklada ze 3 casti!
- //ack = I2C_Vystup( HWADR_PCF8574 | A012 | R_W );
- // kontrola ack
- // ....
- // zapis 8 bitu do registru
- //I2C_Vystup( libovolne_8_bitove_cislo )
- // nyni sviti pozadovane LED
- // konec komunikace
- }
- //************************************************************************
- //************************************************************************
- // sbernice I2C (low level) - ovladani signalu SDA a SCL
- void I2C_delay() { delay_ms( 1 ); }
- // nastaveni signalu SDA
- void I2C_SDA( char value )
- {
- if ( value ) I2C_PORT |= ( 1 << SDA_PIN );
- else I2C_PORT &= ~( 1 << SDA_PIN );
- I2C_delay();
- }
- // cteni signalu SDA
- char I2C_getSDA( void )
- {
- char r = ( I2C_PIN & ( 1 << SDA_PIN ) ) != 0;
- I2C_delay();
- return r;
- }
- // nastaveni signalu SCL
- void I2C_SCL( char value )
- {
- if ( value ) I2C_PORT |= ( 1 << SCL_PIN );
- else I2C_PORT &= ~( 1 << SCL_PIN );
- I2C_delay();
- }
- //************************************************************************
- // Principy komunikace na sbernici I2C jsou popsany v technickych listech
- // u kazdeho zarizeni pro toto rozhrani.
- // inicializace sbernice
- void I2C_Init()
- {
- I2C_DDR |= ( 1 << SDA_PIN ) | ( 1 << SCL_PIN );
- I2C_SCL( 1 );
- I2C_SDA( 1 );
- }
- // oznameni zacatku komunikace
- void I2C_Start()
- {
- I2C_SDA( 1 );
- I2C_SCL( 1 );
- I2C_SDA( 0 );
- I2C_SCL( 0 );
- }
- // oznameni ukonceni komunikace
- void I2C_Stop()
- {
- I2C_SCL( 0 );
- I2C_SDA( 0 );
- I2C_SCL( 1 );
- I2C_SDA( 1 );
- }
- // odeslani potvrzovaci bitu ACK
- void I2C_Ack()
- {
- I2C_SCL( 0 );
- I2C_SDA( 0 );
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- // odeslani potvrzovaciho bitu NACK
- void I2C_NAck()
- {
- I2C_SCL( 0 );
- I2C_SDA( 1 );
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- char I2C_getACK()
- {
- I2C_SDA( 1 );
- // nastavit SDA_PIN jako vstupni
- I2C_DDR &= ~( 1 << SDA_PIN );
- I2C_SCL( 1 );
- char ret = I2C_getSDA();
- I2C_SCL( 0 );
- I2C_DDR |= ( 1 << SDA_PIN );
- return ret;
- }
- // odeslani 8 bitove hodnoty
- char I2C_Vystup( unsigned char value )
- {
- char mask = 0x80;
- // odeslani bitu, MSB jako prvni
- for ( int i = 0; i < 8; i++ )
- {
- I2C_SDA( value & mask );
- mask >>= 1;
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- return I2C_getACK();
- }
- // precteni 8 bitove hodnoty
- unsigned char I2C_Vstup()
- {
- unsigned char value = 0;
- // klidovy stav na lince
- I2C_SDA( 1 );
- // nastavit SDA_PIN jako vstupni
- I2C_DDR &= ~( 1 << SDA_PIN );
- // prijem bitu, MSB jako prvni
- for ( int i = 0; i < 8; i++ )
- {
- value <<= 1;
- I2C_SCL( 1 );
- if ( I2C_getSDA() ) value |= 1;
- I2C_SCL( 0 );
- }
- // nastavit SDA_PIN zpet jako vystupni
- I2C_DDR |= ( 1 << SDA_PIN );
- return value;
- }
Add Comment
Please, Sign In to add comment