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