Тема: 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);
}