Pages: [1]   Go Down
Author Topic: [Solved] I2C - daten schreiben funktioniert nicht!  (Read 1034 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

ich möchte mit meinem Arduino folgendes Kameramodul ansteuern: http://www.sparkfun.com/datasheets/Sensors/Imaging/TCM8230MD.pdf
Dazu verwende ich folgenden Code:
Code:
#include <Wire.h>

int incomingByte = 0;

void setup()
{
  Wire.begin();                   // join i2c bus (address optional for master)
  Serial.begin(9600);
  Wire.beginTransmission(60);  // transmit to device #4
  Wire.send(0x03);                // sends one byte  
  Wire.send(0x00);                // sends one byte  
  byte ret = Wire.endTransmission();      // stop transmitting
  Serial.write(ret);
}

void loop()
{}
}

Mit diesem Code bekomme ich immer eine 3, das heisst er kann die Daten nicht senden, die Adresse funktioniert aber! Also habe ich mir mal die i2cmaster library von Peter Fleury geholt und versucht mit folgendem Code zu schreiben:

Code:
#include <i2cmaster.h>

void setup()
{
   i2c_init();
   Serial.begin(9600);
   //digitalWrite(13,1);
   byte ret = i2c_start(120);     // set device address and write mode
   Serial.write(ret);  
   //digitalWrite(13,0);
   ret = i2c_write(3);                        // write address = 5
   Serial.write(ret);
   ret = i2c_rep_start(120);
   Serial.write(ret);
   ret = i2c_write(0x00);                        // write address = 5
   Serial.write(ret);
   ret = i2c_write(0x02);                        // write address = 5
   Serial.write(ret);
   ret = i2c_write(0x00);                        // write address = 5
   Serial.write(ret);
   i2c_stop();
}

void loop()
{}

Das Ergebnis: "010111", d.h. die Funktionen i2c_start und i2c_rep_start funktionieren, die funktion i2c_write allerdings nicht!

Hat jemand eine Vorstellung warum das so sein könnte? Ich kann das Gerät addressieren aber nicht reinschreiben?!

Wäre super, wenn mir da jemand helfen könnte!

Danke und beste Grüße,
Max
« Last Edit: April 11, 2011, 01:50:01 am by maxwellMuc » Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#include <Wire.h>

int incomingByte = 0;
byte camera_add = 0x3C >> 1;

void setup()
{
  Wire.begin();                   // join i2c bus (address optional for master)
  Serial.begin(9600);
  Wire.beginTransmission(camera_add);
  Wire.send(0x03);                // sends one byte  
  Wire.send(0x00);                // sends one byte
  byte ret = Wire.endTransmission();
  Serial.write(ret);
}

void loop()
{
}

Sollte vor dem Senden der eigentlichen Daten nicht erst der Sende- oder Empfangmodus gewählt werden ?
« Last Edit: April 10, 2011, 06:25:21 am by Megaionstorm » Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Megaionstorm,

danke für Deine Antwort. So, wie ich das verstanden habe, macht das die Wire-library automatisch, oder nicht?!

Grüße,
Max

:edit: also laut Datenblatt ist die Slave-Adresse:
0 1 1 1 1 0 0 (1/0) wobei das letzte Bit festlegt ob gelesen oder geschrieben werden soll. Wobei 0 = schreiben ist. 1111000 = 120 = 0x78. Soweit ich weiß, fügt die Wire-Library das letzte Bit automatisch ein. Könnte sein, dass die das falsch macht?! Aber mit der anderen Library (i2cmaster) funktioniert es ja auch nicht...
« Last Edit: April 10, 2011, 05:04:15 am by maxwellMuc » Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich meine eigentlich das CONTROL I/F der Kamera !

Auf Seite 8 steht geschrieben wie die Daten für den READ oder WRITE Modus gesendet werden müssen !

Schreib einfach 0x3C, verhindert Verwechslungen !
0x3C ist 60 DEC.
0X60 ist 96 DEC.

http://www.langeneggers.ch/Nuetzliches/Hex_Dez.htm


Vielleicht liegt es aber auch daran:
Code:
Wire.beginTransmission(60);

Wire.beginTransmission(0x60);
« Last Edit: April 10, 2011, 05:10:12 am by Megaionstorm » Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich habe aber doch immer nur 60 verwendet, niemals 0x60, das ist mir klar dass das was gänzlich anderes ist. Auf Seite 8 habe ich schon mehrfach geschaut, ich weiss leider nicht wie die Wire-Library das genau umsetzt, aber meiner Meinung nach müsste es ja dann so funktionieren! Die Stop-Condition kommt ja erst nach dem endTransmission, oder nicht?!
Ich verstehe das so:
DatenblattSoftware
StartCondition
SlaveAdress
0
Acknowledge
beginTransmission(0x3C);
Subaddress
Acknowledge
Send(0x03);
Data 1
Acknowledge
Send(0x00);
Stop-ConditionendTransmission();

Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schreiben:
Wire.beginTransmission(B01111000);

Lesen:
Wire.beginTransmission(B01111001);
Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke schonmal für Deine Hilfe, aber irgendwie reden wir glaub ich aneinander vorbei, oder nicht? smiley
In diesem Post (http://arduino.cc/forum/index.php/topic,57595.0.html) habe ich folgendes gelesen:
Quote
When addressing I2C devices using the Wire library you'll want to use the 7 bit address.  The Wire library will automatically add the 8 LSB (read/write bit) to the 7 bit address you use depending on which way the data is flowing.
Das bedeutet, ich darf nicht die 8bit-Adresse (die du verwendest) hernehmen, sondern nur die 7bit, also ohne die letzte 0! Statt 0b01111000 und 120 also 0b0111100 und 60!!

:edit: Ich habe das Problem gefunden: die Kamera arbeitet im I²C fast mode, der Arduino aber nur im standard mode!! Man muss in der Library die Frequenz auf 400000L ändern!
« Last Edit: April 11, 2011, 12:14:16 am by maxwellMuc » Logged

Pages: [1]   Go Up
Jump to: