1

Тема: Wire_low

Тестовая библиотека, основной архив.

Данный контент доступен только зарегистрированным пользователям.


Wire_low.h

// rcl-radio.ru liman324@yandex.ru 

// Atmega8
// Atmega48
// Atmega88
// Atmega168
// Atmega328
#include <Arduino.h>
    void wire_set(long f_clock, long i2c_clock);
    void wire_start_r(byte i2c_addr);
    void wire_start_w(byte i2c_addr);
    void wire_write(byte i2c_data);
    byte wire_read_a();
    byte wire_read();
    void wire_stop();

Wire_low.cpp

#include <avr/io.h>
#include <util/delay.h>
#include <Wire_low.h>

void wire_set(long f_clock, long i2c_clock){
   TWBR = (((f_clock)/(i2c_clock)-16 )/2) ;
   TWSR = 0;
}

void wire_start_r(byte i2c_addr){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
}

byte wire_read_a(){
   TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); 
  while(~TWCR&(1<<TWINT));
   byte value = TWDR; 
  return value;
}

byte wire_read(){
   TWCR = (1<<TWINT) | (1<<TWEN); 
  while(~TWCR&(1<<TWINT));
   byte value = TWDR; 
  return value;
}

void wire_start_w(byte i2c_addr){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
}

void wire_write(byte i2c_data){
   TWDR = i2c_data;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
}

void wire_stop(){  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); 
  }