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
|