IOW56 und Bosch BMP085
Moderator: Guido Körber
IOW56 und Bosch BMP085
Hallo, ich habe folgendes Problem:
Ich möchte mit meinem IOW56 über I2C den Drucksensor Bosch BMP085 (http://www.bosch-sensortec.com/content/ ... 000-05.pdf) auslesen.
Zuerst muss man die Kalibrierdaten aus dem EEPROM auslesen. Die Datenregister sind AAh, ABh.....BFh.
Die Device Address des Sensors ist EEh (write) bzw. EFh (read);
Ich komm nun leider überhaupt nicht mit dem IOW klar. Was muss ich nun alles schreiben, damit ich lesen kann?
Hab bislang folgendes geschrieben:
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE ioHandle;
IOWKIT56_IO_REPORT report;
ULONG ret;
ioHandle = IowKitOpenDevice();
if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
if(ioHandle != NULL)
{
//INITIALISIERUNG DES I2C:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // I2C Config
report.Bytes[0] = 0x01; // I2C enable
report.Bytes[1] = 0x02; // Speed: 50kHz
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
//ADDRESS WRITE:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write Request
report.Bytes[0] = 0xC2; // binär: 1100 0011 Start, Stop und 3Bytes
report.Bytes[1] = 0xEE; //Adresse des BMP085: 1110 111 und 0 für WRITE
report.Bytes[2] = 0xAA; //1. Datenregister EEPROM
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
//READ TRANSACTION
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03;
report.Bytes[0] = 0x03;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
}
Kann mir bitte jemand weiterhelfen?
Vielen Dank Euch!
Ich möchte mit meinem IOW56 über I2C den Drucksensor Bosch BMP085 (http://www.bosch-sensortec.com/content/ ... 000-05.pdf) auslesen.
Zuerst muss man die Kalibrierdaten aus dem EEPROM auslesen. Die Datenregister sind AAh, ABh.....BFh.
Die Device Address des Sensors ist EEh (write) bzw. EFh (read);
Ich komm nun leider überhaupt nicht mit dem IOW klar. Was muss ich nun alles schreiben, damit ich lesen kann?
Hab bislang folgendes geschrieben:
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE ioHandle;
IOWKIT56_IO_REPORT report;
ULONG ret;
ioHandle = IowKitOpenDevice();
if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
if(ioHandle != NULL)
{
//INITIALISIERUNG DES I2C:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // I2C Config
report.Bytes[0] = 0x01; // I2C enable
report.Bytes[1] = 0x02; // Speed: 50kHz
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
//ADDRESS WRITE:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write Request
report.Bytes[0] = 0xC2; // binär: 1100 0011 Start, Stop und 3Bytes
report.Bytes[1] = 0xEE; //Adresse des BMP085: 1110 111 und 0 für WRITE
report.Bytes[2] = 0xAA; //1. Datenregister EEPROM
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
//READ TRANSACTION
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03;
report.Bytes[0] = 0x03;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
}
Kann mir bitte jemand weiterhelfen?
Vielen Dank Euch!
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Ich habe gerade für die Electronica ein Programm als Demo dazu geschrieben.
Hier die Routine, womit man alles ausliest und berechnet:
Pa ist der Wert in Pascal. Einfach durch 100 Teilen und man hat HektoPascal (hPa).
alt ist die Höhe über Meeresspiegel. Achtung wenn man den Luftfruck mit der Zimmertemperatur berechnet, dann weicht der Wert vom Realen ab.
Die TRACE sind für die Debug-Ausgabe um alles zu kontrollieren.
Die Funktion "ReadI2C()";
Ich hoffe das hilft weiter.
Hier die Routine, womit man alles ausliest und berechnet:
Code: Select all
int CMesse_DongleView::GetPressure(void)
{
//Auslesen des BMP085 Digitam Pressure Sensor von Bosch
/**
Adresse 0xEE -> Schreiben
Adresse 0xEF -> Lesen
*/
CString t;
//Calib data
short AC1, AC2, AC3;
unsigned short AC4, AC5, AC6;
short B1, B2, MB, MC, MD;
//uncompressed temp
//uncompressed pressure
long UT, UP;
short oss = 0;
//
long B6, X1, X2, X3, B3;
unsigned long B4;
long B5, B7, T, p;
float hPa;
long Pa;
//Beispielwerte aus Datenblatt
/*
AC1 = 408;
AC2 = -72;
AC3 = -14383;
AC4 = 32741;
AC5 = 32757;
AC6 = 23153;
B1 = 6190;
B2 = 4;
MB = -32768;
MC = -8711;
MD = 2868;
X1 = 4743;
X2 = -2344;
B5 = 2399;
UT = 27898;
UP = 23843;
*/
//Calibrierungsdaten auslesen
IOWKIT_SPECIAL_REPORT io24rep;
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xAA, 6);
AC1 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
AC2 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
AC3 = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xB0, 6);
AC4 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
AC5 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
AC6 = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xB6, 4);
B1 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
B2 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xBA, 6);
MB = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
MC = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
MD = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];
//Messung vornehmen
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep.ReportID = 0x02;
io24rep.Bytes[0] = 0xC3;
io24rep.Bytes[1] = 0xEE;
io24rep.Bytes[2] = 0xF4;
io24rep.Bytes[3] = 0x2E;
IowKitWrite(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
Sleep(5);
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xF6, 2);
UT = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep.ReportID = 0x02;
io24rep.Bytes[0] = 0xC3;
io24rep.Bytes[1] = 0xEE;
io24rep.Bytes[2] = 0xF4;
io24rep.Bytes[3] = 0x34 | (oss << 6);
IowKitWrite(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
Sleep(4);
memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
io24rep = ReadI2C(m_handles.psi, 0xEE, 0xF6, 3);
//UP = ((io24rep.Bytes[1] << 16) | (io24rep.Bytes[2] << 8) | io24rep.Bytes[3]) >> (8-oss);
UP = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2] ;
//Calc true temperature
X1 = (UT - AC6) * (AC5 / pow(2.0,15));
X2 = (MC * pow(2.0,11)) / (X1 + MD);
B5 = X1 + X2;
T = (B5 + 8) / pow(2.0,4); //temp in 0.1°C
float te;
te = T / 10;
TRACE(_T("---Config-Daten---\r\n"));
t.Format(_T("%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n"), AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD);
TRACE(t);
TRACE(_T("-----------\r\n"));
X1 = 0;
X2 = 0;
B3 = 0;
TRACE(_T("---Zwischenergebnis-Daten---\r\n"));
//calc true pressure
B6 = B5 - 4000;
X1 = (B2 * (B6 * B6 / pow(2.0,12))) / pow(2.0,11);
X2 = AC2 * B6 / pow(2.0,11);
X3 = X1 + X2;
//B3 = ((AC1 * 4 + X3) << oss + 2) / 4;
B3 = ((AC1 * 4 + X3)) / 4;
t.Format(_T("B6 %d\r\nX1 %d\r\nX2 %d\r\nX3 %d\r\nB3 %d\r\n"),B6, X1, X2, X3, B3);
TRACE(t);
X1 = AC3 * B6 / pow(2.0,13);
X2 = (B1 * (B6 * B6 / pow(2.0,12))) / pow(2.0,16);
X3 = ((X1 + X2) + 2) / pow(2.0,2);
B4 = AC4 * (unsigned long) (X3 + 32768) / pow(2.0,15);
B7 = ( (unsigned long) UP - B3) * (50000 >> oss);
if(B7 < 0x80000000)
p = (B7 * 2) / B4;
else
p = (B7 / B4) * 2;
t.Format(_T("X1 %d\r\nX2 %d\r\nX3 %d\r\nB4 %d\r\nB7 %d\r\np %d\r\n"), X1, X2, X3, B4, B7, p);
TRACE(t);
X1 = (p / pow(2.0,8)) * (p / pow(2.0,8));
t.Format(_T("X1 %d\r\n"), X1);
TRACE(t);
X1 = (X1 * 3038) / pow(2.0,16);
X2 = (-7357 * p) / pow(2.0,16);
Pa = p + (X1 + X2 + 3791) / pow(2.0,4);
t.Format(_T("X1 %d\r\nX2 %d\r\nPa %d\r\n"), X1, X2, Pa);
TRACE(t);
hPa = Pa / 100.0;
float alt = 0.0;
float n = 0.0;
TRACE(_T("-----------\r\n"));
n = pow( Pa/101325.0,0.190295);
alt = 44330*(1.0-n);
t.Format(_T("Temperatur:%.2f\r\n Pa:%d\r\n hPa:%.2f\r\n Alt:%.2f cm\r\n"), te, Pa, hPa, alt);
TRACE(t);
return 0;
}
alt ist die Höhe über Meeresspiegel. Achtung wenn man den Luftfruck mit der Zimmertemperatur berechnet, dann weicht der Wert vom Realen ab.
Die TRACE sind für die Debug-Ausgabe um alles zu kontrollieren.
Die Funktion "ReadI2C()";
Code: Select all
IOWKIT_SPECIAL_REPORT ReadI2C(HANDLE handle, UCHAR addr, UCHAR cmd, UCHAR count)
{
IOWKIT_SPECIAL_REPORT rep;
memset(&rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x02; //I2C write request
rep.Bytes[0] = 0xC2; //2 Bytes I2C start stopp
rep.Bytes[1] = addr; //LEDW-Address write
rep.Bytes[2] = cmd; //command
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
//swallow ACK report
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
memset(&rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x03; //I2C read request
rep.Bytes[0] = count; //1 Bytes I2C start stopp
rep.Bytes[1] = addr | 0x01; //LEDW-Address read
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
//read answer containing command-value
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
return rep;
}
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Grundsätzlich sehe ich da erst mal drei Fehler:
Beim Write wird Stop mit angegeben, das ist nicht gut bei dieser Art Transaktion, Lesezugriffe mit vorherigem Senden eines Kommandos werden mit Repeated-Start gemacht, also ohne Stop nach dem Write.
Es werden 3 Bytes für den Write angegeben, aber nur zwei Bytes im Buffer gesetzt, was macht das dritte Byte?
Beim Read wird die Geräteadresse nicht angegeben.
Beim Write wird Stop mit angegeben, das ist nicht gut bei dieser Art Transaktion, Lesezugriffe mit vorherigem Senden eines Kommandos werden mit Repeated-Start gemacht, also ohne Stop nach dem Write.
Es werden 3 Bytes für den Write angegeben, aber nur zwei Bytes im Buffer gesetzt, was macht das dritte Byte?
Beim Read wird die Geräteadresse nicht angegeben.
Re: IOW56 und Bosch BMP085
Vielen Dank für die Untersützung.
Bei dem obigen "Demo"-Programm: Woher kommt das Handle m_handles.psi?
Danke vielmals!
Bei dem obigen "Demo"-Programm: Woher kommt das Handle m_handles.psi?
Danke vielmals!
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW56 und Bosch BMP085
das ist das HANDLE (IOWKIT_HANDLE) welches ich als globale variable verwende.
ein einfaches
"IOWKIT_HANDLE m_handle;" reicht, wenn man nur einen IO-Warrion angeschlossen hat und verwendet.
Code: Select all
typedef struct IOW_DEVICES
{
IOWKIT_HANDLE licht;
IOWKIT_HANDLE psi;
IOWKIT_HANDLE humi;
} IOW_DEVICES;
"IOWKIT_HANDLE m_handle;" reicht, wenn man nur einen IO-Warrion angeschlossen hat und verwendet.
Re: IOW56 und Bosch BMP085
ich habe nun das Programm ebenso umgesetzt wie das "Demo" Programm. Leider werden schon die Kalibrierdaten
nicht ausgelesen, da in den meisten ACs eine Null steht. Ich habe IOWKIT_HANDLE m_handle; global deklariert. Ihr Programm ist für den IOW24 gemacht, es muss aber genauso auch für den IOW56 funktionieren, oder? Zudem habe ich neuerdings das Problem, dass ich beinahe nach jedem Kompilieren den IOW neu aus-und anstecken muss, damit er geöffnet werden kann. Grüße
nicht ausgelesen, da in den meisten ACs eine Null steht. Ich habe IOWKIT_HANDLE m_handle; global deklariert. Ihr Programm ist für den IOW24 gemacht, es muss aber genauso auch für den IOW56 funktionieren, oder? Zudem habe ich neuerdings das Problem, dass ich beinahe nach jedem Kompilieren den IOW neu aus-und anstecken muss, damit er geöffnet werden kann. Grüße
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Für den IO-Warrior56 geleten andere Größen. Dort ist es nicht IOWKIT_SPECIAL_REPORT sonder IOWKIT56_SPECIAL_REPORT.
Das muss natürlich angepasst werden sonst kommt nichts oder nur Datenmüll raus.
Das muss natürlich angepasst werden sonst kommt nichts oder nur Datenmüll raus.
Re: IOW56 und Bosch BMP085
Ich habe nun IOWKIT_SPECIAL_REPORT in IOWKIT56_SPECIAL_REPORT geändert und IOWKIT_SPECIAL_REPORT_SIZE in IOWKIT56_SPECIAL_REPORT_SIZE.
Leider ist immer noch ab Bytes[2] alles "0". Wenn man den IOW56 absteckt, dann steht immer noch überall das gleiche drin,
Hier mal der Code wie er aktuell ist:
#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"
#include "iowkit.h"
#include "string.h"
#include "math.h"
IOWKIT_HANDLE m_handle;
IOWKIT56_SPECIAL_REPORT ReadI2C(HANDLE handle, UCHAR address, UCHAR cmd, UCHAR count) //READ ROUTINE
{
IOWKIT56_SPECIAL_REPORT rep;
memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x02; //WRITE
rep.Bytes[0] = 0xC2; //Start-, Stopbit, 2 Bytes to transmit
rep.Bytes[1] = address; //address write
rep.Bytes[2] = cmd; //command
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report
memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x03; //READ
rep.Bytes[0] = count; // 1 Bytes, Start, Stop
rep.Bytes[1] = address | 0x01; // address read
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report
return rep;
}
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE ioHandle;
ioHandle = IowKitOpenDevice();
if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
short AC1, AC2, AC3; //Calibration Data
unsigned short AC4, AC5, AC6;
short B1, B2, MB, MC, MD;
long UT, UP; //uncompensated Temperature/Pressure
short oss = 0; //Oversampling Setting
long B6, X1, X2, X3, B3;
unsigned long B4;
long B5, B7, T, p;
float hPa;
long Pa;
IOWKIT56_SPECIAL_REPORT iow56rep;
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x01; //config I2C
iow56rep.Bytes[0] = 0x01; // enable I2C
iow56rep.Bytes[1] = 0x02; //speed 50kHz
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
//READ CALIBRATION DATA
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xAA, 6);
AC1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC3 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB0, 6);
AC4 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC5 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC6 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB6, 4);
B1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
B2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xBA, 6);
MB = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
MC = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
MD = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
//MEASUREMENT TEMPERATURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address 0xF4
iow56rep.Bytes[3] = 0x2E; // write 0x2E into register 0xF4
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
Sleep(5); //wait until conversion is finished
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 2);
UT = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
//MEASUREMENT PRESSURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address F4
iow56rep.Bytes[3] = 0x34 | (oss << 6); //write 0x34 into register 0xF4
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
Sleep(4);
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 3);
//UP = ((io24rep.Bytes[1] << 16) | (io24rep.Bytes[2] << 8) | io24rep.Bytes[3]) >> (8-oss);
UP = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2] ;
IowKitCloseDevice(ioHandle);
system ("PAUSE");
return 0;
}
Bin leider absoluter Neuling mit dem Warrior....
Vielen Dank.
Leider ist immer noch ab Bytes[2] alles "0". Wenn man den IOW56 absteckt, dann steht immer noch überall das gleiche drin,
Hier mal der Code wie er aktuell ist:
#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"
#include "iowkit.h"
#include "string.h"
#include "math.h"
IOWKIT_HANDLE m_handle;
IOWKIT56_SPECIAL_REPORT ReadI2C(HANDLE handle, UCHAR address, UCHAR cmd, UCHAR count) //READ ROUTINE
{
IOWKIT56_SPECIAL_REPORT rep;
memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x02; //WRITE
rep.Bytes[0] = 0xC2; //Start-, Stopbit, 2 Bytes to transmit
rep.Bytes[1] = address; //address write
rep.Bytes[2] = cmd; //command
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report
memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x03; //READ
rep.Bytes[0] = count; // 1 Bytes, Start, Stop
rep.Bytes[1] = address | 0x01; // address read
IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report
return rep;
}
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE ioHandle;
ioHandle = IowKitOpenDevice();
if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
short AC1, AC2, AC3; //Calibration Data
unsigned short AC4, AC5, AC6;
short B1, B2, MB, MC, MD;
long UT, UP; //uncompensated Temperature/Pressure
short oss = 0; //Oversampling Setting
long B6, X1, X2, X3, B3;
unsigned long B4;
long B5, B7, T, p;
float hPa;
long Pa;
IOWKIT56_SPECIAL_REPORT iow56rep;
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x01; //config I2C
iow56rep.Bytes[0] = 0x01; // enable I2C
iow56rep.Bytes[1] = 0x02; //speed 50kHz
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
//READ CALIBRATION DATA
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xAA, 6);
AC1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC3 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB0, 6);
AC4 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC5 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC6 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB6, 4);
B1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
B2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xBA, 6);
MB = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
MC = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
MD = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB
//MEASUREMENT TEMPERATURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address 0xF4
iow56rep.Bytes[3] = 0x2E; // write 0x2E into register 0xF4
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
Sleep(5); //wait until conversion is finished
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 2);
UT = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
//MEASUREMENT PRESSURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address F4
iow56rep.Bytes[3] = 0x34 | (oss << 6); //write 0x34 into register 0xF4
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
Sleep(4);
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 3);
//UP = ((io24rep.Bytes[1] << 16) | (io24rep.Bytes[2] << 8) | io24rep.Bytes[3]) >> (8-oss);
UP = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2] ;
IowKitCloseDevice(ioHandle);
system ("PAUSE");
return 0;
}
Bin leider absoluter Neuling mit dem Warrior....
Vielen Dank.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Haben Sie denn mal SimpleI2C verwendet um zu überprüfen ob der Sensor richtig antwortet? Damit ließe sich erst mal ausschließen, dass die Hardware ein Problem hat.
Re: IOW56 und Bosch BMP085
Hallo mal probieren:
vor dem Lesen muss mit rep ID 03 noch mal geschrieben werden
Programm ausschnitt in Basic:
vor dem Lesen muss mit rep ID 03 noch mal geschrieben werden
Programm ausschnitt in Basic:
Code: Select all
'-------------------------- IOW56 I2C-Modus anwählen ------------------------------------------
Daten(0) = 1 'I2C anwählen
Daten(1) = 1 'I2C aktivieren
Daten(2) = 1 'I2C Takt 400 KHz
Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'
' ------------------------------------ Mess Start ----------------------------------------------
Daten(0) = 2 '0000 0010 2 ReportID IIC write request
Daten(1) = 194 '1100 0010 C2 2 bytes with IIC Start and Stop
Daten(2) = adresse '1101 0000 D0 Adress byte Schreiben voreingestellt
Daten(3) = config '1000 1100 8C Config byte voreingestellt
Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'Nach IOW schreiben
Res = IowKitRead(iowHandles(0), 1, Daten(0), 64)
' ------------------------------------- Daten Lesen --------------------------------------------
Daten(0) = 3 '0000 0011 3 ReportID IIC write request
Daten(1) = 196 '1100 0100 C4 4 bytes with IIC Start and Stop
Daten(2) = adresse+1 '1101 0001 D1 Adress byte Lesen
Daten(3) = config'1000 1100 8C Config byte voreingestellt: Gain=1, Wandlung=18Bit, Einzelmessung)
Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'Nach IOW schreiben
Res = IowKitRead(iowHandles(0), 1, Daten(0), 64)
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: IOW56 und Bosch BMP085
@Thoene
schon mal das Test-Tool ALL-in-ONE verwendet ?
Gruss Ralf
ich kann mich nur Herrn Guido Körber anschließen ...Ich möchte mit meinem IOW56 über I2C den Drucksensor Bosch BMP085 (http://www.bosch-sensortec.com/content/ ... 000-05.pdf) auslesen.
schon mal das Test-Tool ALL-in-ONE verwendet ?
Gruss Ralf
Re: IOW56 und Bosch BMP085
Mit SimpleI2C wird weder der Warrior noch der Sensor erkannt. Bei ALL-In-ONE schon. Ich habe dann folgendes geschrieben: AAh. Das ist die Register Adresse wo die Kalibrierdaten hinterlegt sind.
Ich habe dann auch Werte zurückbekommen. Aber wie würde ich mit diesem Tool denn z.B. den Wert 2E nach F4 schicken?
Grüße
Ich habe dann auch Werte zurückbekommen. Aber wie würde ich mit diesem Tool denn z.B. den Wert 2E nach F4 schicken?
Grüße
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Das Simple I2C ist glaub ich nocht nicht für den IOW56 ausgelegt. Es war eigentlich nur für unsere Dongles als kleines "Starttool" geplant.
Das steht dann jetzt auf der Roadmap für die Anpassung. Leider wird das nichts vor dem 15.11. wegen der electronica.
Ansonsten kann ich auch nur das "All-In-One"-Tool empfehlen. Das ist zum Testen und auslesen gut geeignet, da schön einfach und verständlich.
Das steht dann jetzt auf der Roadmap für die Anpassung. Leider wird das nichts vor dem 15.11. wegen der electronica.
Ansonsten kann ich auch nur das "All-In-One"-Tool empfehlen. Das ist zum Testen und auslesen gut geeignet, da schön einfach und verständlich.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: IOW56 und Bosch BMP085
Zumal wir ja ein Dongle mit dem 56er zumindest im Labor schon haben...
Re: IOW56 und Bosch BMP085
So, ich hab nun nochmal angefangen und nur mal versucht, 2 Byte aus dem EEPROM des Sensors zu lesen. Es passiert aber leider nichts. Ich weiß nicht was ich noch anders machen sollte.
Der Sensor hat die Device Address EE (write) und EF (read). Die Kalibrierdaten im EEPROM haben die Register Address AA, AB...
Folgendes hab ich nun geschrieben: Bereits den Tip von Guido Körber zwecks Repeated Start berücksichtigt: (ZUR INFO: ich habe den IO-Warrior 56)
#include "stdafx.h"
#include "windows.h"
#include "iowkit.h"
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE iowHandle;
iowHandle = IowKitOpenDevice();
if (iowHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
IOWKIT56_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // Choose IIC-Mode
report.Bytes[0] = 0x01; // Enable IIC-Mode
report.Bytes[1] = 0x02; // IIC Speed 50kHz
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write-Mode
report.Bytes[0] = 0x82; // Start OHNE Stop = 1, 2 Bytes will be sent
report.Bytes[1] = 0xEE; // Device-Address of bmp085 write
report.Bytes[2] = 0xAA; // calibrationdata register AAh
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03; // Read-Mode
report.Bytes[0] = 0xC2; // Start & Stopbit = 1, 2 Bytes will be read //REPEATED START, da bei ReportID 2 das Stopbit nicht gesetzt.
report.Bytes[1] = 0xEF; // Device-Address of BMP085 read
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
short AC1, AC2, AC3;
AC1 = ( report.Bytes[1] << 8 ) | report.Bytes[2];
IowKitCloseDevice(iowHandle);
return 0;
}
Das ist das Programm, aber leider bleibt report.Bytes[1.....] alles 0 :-(
Was mache ich falsch?
Viele Grüße
Der Sensor hat die Device Address EE (write) und EF (read). Die Kalibrierdaten im EEPROM haben die Register Address AA, AB...
Folgendes hab ich nun geschrieben: Bereits den Tip von Guido Körber zwecks Repeated Start berücksichtigt: (ZUR INFO: ich habe den IO-Warrior 56)
#include "stdafx.h"
#include "windows.h"
#include "iowkit.h"
int _tmain(int argc, _TCHAR* argv[])
{
IOWKIT_HANDLE iowHandle;
iowHandle = IowKitOpenDevice();
if (iowHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}
IOWKIT56_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // Choose IIC-Mode
report.Bytes[0] = 0x01; // Enable IIC-Mode
report.Bytes[1] = 0x02; // IIC Speed 50kHz
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write-Mode
report.Bytes[0] = 0x82; // Start OHNE Stop = 1, 2 Bytes will be sent
report.Bytes[1] = 0xEE; // Device-Address of bmp085 write
report.Bytes[2] = 0xAA; // calibrationdata register AAh
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03; // Read-Mode
report.Bytes[0] = 0xC2; // Start & Stopbit = 1, 2 Bytes will be read //REPEATED START, da bei ReportID 2 das Stopbit nicht gesetzt.
report.Bytes[1] = 0xEF; // Device-Address of BMP085 read
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
short AC1, AC2, AC3;
AC1 = ( report.Bytes[1] << 8 ) | report.Bytes[2];
IowKitCloseDevice(iowHandle);
return 0;
}
Das ist das Programm, aber leider bleibt report.Bytes[1.....] alles 0 :-(
Was mache ich falsch?
Viele Grüße