#include <avr/io.h>
#include <util/delay.h>
Makrodefinitionen | |
#define | F_CPU 16000000UL |
#define | TWI_CLK 400000UL |
#define | TWI_INT_PULLUP 1 |
#define | TWI_DDR DDRC |
#define | TWI_PORT PORTC |
#define | TWI_SDA PC1 |
#define | TWI_SCL PC0 |
#define | TWI_READ 1 |
#define | TWI_WRITE 0 |
#define | TWI_TIMEOUT_ON 1 |
#define | TWI_TIMEOUT_ISR 0 |
#define | TWI_TIMEOUT_BOUND 250 |
#define | true 1 |
#define | false 0 |
Funktionen | |
void | twi_init (void) |
uint8_t | twi_start (uint8_t address, uint8_t rw) |
uint8_t | twi_write (uint8_t data) |
uint8_t | twi_read_nack (uint8_t *erg) |
uint8_t | twi_read_ack (uint8_t *erg) |
void | twi_stop (void) |
Variablen | |
volatile uint8_t | twi_timeout |
#define F_CPU 16000000UL |
definiert Mikrocontroller-Taktfrequenz falls diese nicht im Makefile definiert wurde
#define TWI_CLK 400000UL |
definiert TWI-Taktfrequenz
#define TWI_INT_PULLUP 1 |
gibt an, ob mit den internen PullUp Widerständen an SCL / SDA des AVR
gearbeiten werden soll ( =1 PullUp akt., =0 PullUp deakt.)
Bei externen PullUp Widerständen an SCL / SDA - unbedinkt deaktivieren!
#define TWI_DDR DDRC |
Datenrichtungsregister zum aktivieren der internen Pullups der SDA / SCL Leitung
#define TWI_PORT PORTC |
Portregister zum aktivieren der internen Pullups der SDA / SCL Leitung
#define TWI_SDA PC1 |
Pin der SDA Leitung zum aktivieren der internen Pullups
#define TWI_SCL PC0 |
Pin der SCL Leitung zum aktivieren der internen Pullups
#define TWI_TIMEOUT_ON 1 |
gibt an, ob mit einem Timeout gearbeitet werden soll (=1 ja, =0 nein)
#define TWI_TIMEOUT_ISR 0 |
gibt an, ob mit bei dem Timeout mit einer Timer Interruptroutine gearbeitet werden soll (=1 ja, =0 nein)
#define TWI_TIMEOUT_BOUND 250 |
dient als Vergleichswert zur Variablen twi_timeout für das Arbeiten mit einem Timeout
Dies sollte abhängig von der jeweiligen Timer-Interruptroutine eingestellt werden und so bemessen sein, dass ca 300ms bis zum auslösen eines Timeout verstreichen.
(Zeit=300ms=TWI_TIMEOUT_BOUND*'Zeit bis zum auslösen der Timer-Interruptroutine'; Bsp. ist Timer-Interruptroutine auf 100ms eingestellt, so sollte TWI_TIMEOUT_BOUND 3 sein).
Ist TWI_TIMEOUT_ISR = 0, so wird nicht mit einer Interuptroutine gearbeitet und TWI_TIMEOUT_BOUND gibt direkt die Zeit in Millisekunden an (zwischen 1..254).
#define true 1 |
#define false 0 |
void twi_init | ( | void | ) |
Initialisiert die I2C Schnittstelle des Mikrocontrollers
uint8_t twi_start | ( | uint8_t | address, | |
uint8_t | rw | |||
) |
uint8_t twi_write | ( | uint8_t | data | ) |
uint8_t twi_read_nack | ( | uint8_t * | erg | ) |
Empfängt ein Datenbyte ohne senden eines Acknowledgement (vorherrige Angabe der Datenrichtung TWI_READ bei START-Kondition, siehe twi_start)
erg | Pointer auf Speicherbereich in den das empfangene Datenbyte abgelegt werden soll |
uint8_t twi_read_ack | ( | uint8_t * | erg | ) |
Empfängt ein Datenbyte und Bestätigt dieses durch Acknowledgement (vorherrige Angabe der Datenrichtung TWI_READ bei START-Kondition, siehe twi_start)
erg | Pointer auf Speicherbereich in den das empfangene Datenbyte abgelegt werden soll |
void twi_stop | ( | void | ) |
Sendet eine STOP-Kondition (Freigabe des Busses)
volatile uint8_t twi_timeout |
globale Variable zum Zählen der Timer-Interrupts