Forum: Mikrocontroller und Digitale Elektronik I2C Datenauslesen Probleme


von D. R. (misterdimi1992)


Lesenswert?

Hallo zusammen,

ich habe eine Kommunikation mit dem TSL45315 und dem ATMEGA32 
hergestellt und habe Probleme beim Auslesen der LOWDATA und HIGHDATA.

Meine Problematik ist das ich die ID des Slaves auslesen kann und mir 
dieser auch die erwartete Bitfolge rausgibt.(Bei einfügen von IC_PART in 
die itoa Funktion // 10100000) Also steht eine Verbindung zwischen 
Master und Slave.

Doch beim Auslesen der Datenregister kommt immer eine Ständige "0". 
Sowohl beim einzelnen Auslesen der Datenregister oder LIGHT_LEVEL. Laut 
meinem Kenntnis stand müsste die Protokoll-abfolge richtig sein? Oder 
irre ich mich in einem Punkt?

Kennt jemand diese Problematik?

Vielen Dank!
1
#include  <avr/io.h>
2
#define    F_CPU 8000000
3
#include  <util/delay.h>
4
#include  <stdlib.h>
5
#include  "i2cmaster.h"
6
#include  "lcd-routines.h"
7
8
// sensor registries
9
10
#define REG_CONTROL    0x00
11
#define REG_CONFIG    0x01
12
#define REG_DATALOW    0x04
13
#define REG_DATAHIGH  0x05
14
#define TSL45315    0x52 // Normally 0x29shift << left to get LSB free for i2cmaster lib
15
#define REG_ID      0x0A
16
17
18
  
19
uint8_t      ID_PART;
20
uint16_t    LIGHT_LEVEL;
21
uint8_t      DATAHIGH, DATALOW;
22
23
TALOW;
24
char      cBuffer[16];
25
26
27
int main(void)
28
{
29
    while (1) 
30
    {  /******lightsensors TSL4531*****/
31
32
    lcd_init();      // initialize LCD library
33
    lcd_clear();    // delete LDC
34
    i2c_init();      // initialize I2C library
35
36
37
    
38
39
    i2c_start(TSL45315+I2C_WRITE);      // set device address and write mode
40
    i2c_write(0x80|REG_CONTROL);      // select control register
41
    i2c_write(0x03);            // select normal operation of the device 
42
    i2c_stop();
43
44
    i2c_start(TSL45315+I2C_WRITE);      // set device address and write mode
45
    i2c_write(0x80|REG_CONFIG);        // select configuration register
46
    i2c_write(0x00);            // select measurement cycle time of 400ms
47
    i2c_stop();
48
    
49
50
    i2c_start(TSL45315+I2C_READ);      //set device address and read mode
51
    DATALOW = i2c_readAck();        // read low byte of device into DATALOW
52
    DATAHIGH = i2c_readNak();        // read high byte of device into DATAHIGH
53
    i2c_stop();
54
      
55
    i2c_start(TSL45315+I2C_WRITE);      // set device address and write mode
56
    i2c_write(0x80|REG_ID);          // select ID register
57
    i2c_stop();
58
59
    i2c_start(TSL45315+I2C_READ);      // set device address and read mode
60
    ID_PART=i2c_readNak();          // read ID of device into ID_PART
61
    i2c_stop();
62
    
63
    LIGHT_LEVEL= ((DATAHIGH<<8) + DATALOW);  // calculation of lux 
64
    ID_PART=(ID_PART & 0xF0);        // masking the ID_PART; only the four HSB are needed
65
66
    lcd_setcursor(0,1);            
67
    itoa(DATAHIGH,cBuffer,2);
68
    lcd_string(cBuffer);
69
    
70
    _delay_ms(100);
71
72
73
    }// end while(1)
74
}// end main

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hi,

schau mal hier:

https://github.com/watterott/TSL45315-Breakout/blob/master/software/TSL45315.ino

ganz unten steht, dass Du zuerst
1
  Wire.beginTransmission(I2C_ADDR);
2
  Wire.write(0x80|REG_DATALOW);
3
  Wire.endTransmission();
4
  Wire.requestFrom(I2C_ADDR, 2);

durchführen musst.

Gruß
Frank

von Simon92r (Gast)


Lesenswert?

hallo,

ich habe aktuell das selbe problem beim auslesen und komm momentan nicht 
weiter hast du schon eine Lösung gefunden?

mfg Simon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.