i2c_test.c


1
#include "main.h"
2
#include "i2cmaster.h"
3
#include <util/delay.h>
4
5
#define PCA9536_I2C_ADR 0x82
6
#define PCF8574_I2C_ADR 0x40
7
8
#define PCA9536_INPUT_REG    0x00
9
#define PCA9536_OUTPUT_REG   0x01
10
#define PCA9536_POLARITY_REG 0x02
11
#define PCA9536_CONFIG_REG   0x03
12
13
int8_t Abfrage_Bus(uint8_t slave_adresse) { 
14
    uint8_t ret;
15
16
    ret = i2c_start(slave_adresse);
17
    i2c_stop();
18
    return ret;
19
}
20
21
void PCA9536_Write(uint8_t slave_addresse, uint8_t cfg_reg, uint8_t data) {
22
    i2c_start(slave_addresse);
23
    i2c_write(cfg_Reg);
24
    i2c_write(data);
25
    i2c_stop();
26
}
27
28
void PCA9536_Read(uint8_t slave_adresse,  uint8_t cfg_reg, uint8_t* data) {
29
    i2c_start(slave_adresse);
30
    i2c_write(cfg_reg);
31
    i2c_start(slave_adresse|0x01);
32
    *data=i2c_readNak();
33
    i2c_stop();
34
}
35
36
void PCF8574_Write(uint8_t slave_adresse, uint8_t data) {
37
    i2c_start(slave_adresse);
38
    i2c_write(data);
39
    i2c_stop();
40
} 
41
  
42
void PCF8574_Read(uint8_t slave_adresse, uint8_t* data) {
43
    i2c_start(slave_adresse|0x01);
44
    *data=i2c_readNak();
45
    i2c_stop();
46
}
47
48
int main(void) {
49
    uint8_t Tasten_A, Tasten_B;
50
    uint8_t pcf8574_buffer=0xFF;
51
52
    i2c_init();
53
    DDRC=0x20;                                // Status LEDs am Prozessor
54
55
    // Prüfe I2C Slaves auf Vorhandensein
56
57
    if (Abfrage_Bus(PCA9536_I2C_ADR)) {
58
        PORTC |= (1<<PC5);          // error
59
        while(1);                   // stop
60
    }
61
62
    if (Abfrage_Bus(PCF8574_I2C_ADR)) {
63
        PORTC |= (1<<PC5);          // error
64
        while(1);                   // stop
65
    }
66
67
    // PCA9536 P0-P2 auf OUTPUT umstellen, P3 Input
68
69
    PCA9536_Write(PCA9536_I2C_ADR, PCA9536_CONFIG_REG, 0x08);     
70
  
71
    while(1) {                                          // Hauptschleife    
72
    
73
        PCF8574_Read(PCF8574_I2C_ADR, &Tasten_A);       // Lesezugriff P11
74
        PCA9536_Read(PCA9536_I2C_ADR, PCA9536_INPUT_REG, &Tasten_B);       // Lesezugriff Abfrage WTMA
75
76
        if(~Tasten_B & 0x08) {                          // Taste 4 kopieren
77
            pcf8574_buffer &= ~0x80;
78
        } else {
79
            pcf8574_buffer |=  0x80;
80
        }
81
          
82
        if (~Taste_A & 0x08) {                          // Taste 1 kopieren
83
           pcf8574_buffer &= ~0x10;
84
        } else {
85
           pcf8574_buffer |=  0x10; 
86
        }
87
88
        PCF8574_Write(PCF8574_I2C_ADR, pcf8574_buffer);
89
        PCA9536_Write(PCA9536_I2C_ADR, PCA9536_OUTPUT_REG, Taste_A & 0x07);
90
    }
91
}