PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF08 TWI STATE IS: 0x20 und 0x48



PocketPc
15.03.2010, 09:36
Hallo

Folgendes Problem.

Ich habe einen SRF08 Ultraschallsensor an meinem RP6 gebaut und möchte ihn jetzt mit dem Beispielprog. I2C_MASTER_03 zum laufen bringen. Beim Einschalten blinkt die LED am SRF08(1x lang 1x kurz), daher denke ich das beim löten und dran bauen nix schief gegangen ist.

Leider bekomme ich nur die beiden Errors TWI STATE IS 0x20 und 0x48 als Ausgabe.

Als Adresse nutze ich die Default Adr SRF_ADR 0xE0

Ich weiß leider nicht ob ich am Bsp.: Programm noch etwas ändern muss.
Hier der Code




#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"

#define SRF_ADR 0xE0

#define MEASURE_US_LOW 0
#define MEASURE_US_HIGH 1

uint16_t distance;

void I2C_requestedDataReady(uint8_t dataRequestID)
{
uint8_t messageBuf[8];
static uint8_t dist_tmp;
switch(dataRequestID)
{
case MEASURE_US_HIGH:
I2CTWI_getReceivedData(messageBuf, 2);
dist_tmp = (messageBuf[0]);
I2CTWI_transmitByte(SRF_ADR, 3);
I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_LOW, 1);
break;
case MEASURE_US_LOW:
I2CTWI_getReceivedData(messageBuf, 2);
distance = messageBuf[0] + (dist_tmp << 8);

writeString_P("Distance: ");
writeInteger(distance, DEC);
writeString_P(" cm | ");
uint16_t dist_count;
for(dist_count = distance; dist_count > 4; dist_count-=2)
writeChar('#');
writeChar('\n');
break;
}
}

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}

void task_SRF(void)
{
static uint8_t measureInProgress = false;
if(!measureInProgress)
{
if(TWI_operation == I2CTWI_NO_OPERATION)
{
I2CTWI_transmit2Bytes(SRF_ADR, 0, 81);
measureInProgress = true;
setStopwatch1(0);
}
}
else if(getStopwatch1() > 70)
{
I2CTWI_transmitByte(SRF_ADR, 2);
I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1);
measureInProgress = false;
setStopwatch1(0);
}
}

int main(void)
{
initRobotBase();

I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);

setLEDs(0b111111);
mSleep(500);
setLEDs(0b000000);

powerON();

startStopwatch1();

while(true)
{
task_SRF();
task_I2CTWI();
task_RP6System();
}
return 0;
}


Hab in der suche leider nich zu den beiden Errors gefunden.

THX für Anregungen und Hilfen

mare_crisium
15.03.2010, 12:29
PocketPc,

die Bedeutung der TWI-Zustandsbytes kannst Du in der Dokumentation des ATmega nachlesen. Dort sind auch die Abläufe bei der Kommunikation über den TWI-Bus sehr gut geschrieben ;-).

TWI-Zustand 0x20 bedeutet: SLA+W has been transmitted; NOT ACK has been received
TWI-Zustand 0x48 bedeutet: SLA+R has been transmitted; NOT ACK has been received

D.h. Dein RP6 versucht mit dem SRF08 Verbindung aufzunehmen, indem er die TWI-Adresse des SRF08 über den Bus versendet. Als Reaktion erwartet er ein ACK-Bit vom SRF08. Das bekommt er aber nicht.

Hast Du Pull-up-Widerstände an der SDA- und der SCL-Leitung?

Ciao,

mare_crisium

PocketPc
15.03.2010, 12:44
Hey mare_crisium

Pull-up-Widerstände hab ich nicht mit dran.

Ich hab mich jetzt einfach mal auf den Satz in der SRF08 Doku verlassen.

"Normalerweise sind diese Widerstände im System bereits vorhanden."

Ich hab den Sensor an die Anschlüsse der Experimentierplatine XBUS2 gelötet.

Ich seh grad das keine Wiederstände auf meinem System bereits vorhanden sind :/

Was brauch ich denn für Welche?

THX

021aet04
15.03.2010, 16:33
Das ist nicht so genau. Es sollte zwischen 1k und 10k liegen. Ich verwende 10k Widerstände.

TrainMen
15.03.2010, 17:10
Hi,
auf dem RP6 Mainboard sind schon passende 4K7 Pullups vorhanden.
Trainmen

PocketPc
15.03.2010, 21:56
@TrainMen

Wie schließe ich die denn an SDA und SDL an?

TrainMen
16.03.2010, 02:38
Hi,
die sind schon angeschlossen und haben die Bezeichnung R32/R33 im Schaltplan.
Trainmen

PocketPc
16.03.2010, 10:38
@TrainMen

Hab R32/R33 gefunden aber seh ich es richtig das ich SCL und SDA direckt auf der Platine anschließen muss um die beiden Wiederstände zu nutzen?

Oder sind sie mit dem XBUS verbunden?

edit:

Ich hab jetzt 2 x 4k7 Wiederstände an meine Exper.platine gelötet und es geht immer noch nicht.

Kann mir jemand seine Erfahrung mit dem SRF08 posten.

SlyD
16.03.2010, 14:19
> blinkt die LED am SRF08(1x lang 1x kurz)

Dann schau Dir mal die Doku nochmal genau an.
0xE2 ist dann die Adresse.

Ach ja und die Widerstände brauchst Du nicht. Die auf dem Mainboard reichen.

PocketPc
17.03.2010, 15:56
Hab es hin bekommen. War ein fehler beim Stecker. läuft jetzt mit Pull up Wiederständen on Board.

Roh14an
29.05.2015, 15:56
I am facing the same issue, I have connected SRF08 on my RP6 robot, the Red light blinks for 2-3 seconds, and turns off. Meanwhile, I get the two errors of I2C ERROR--> TWI STATE IS 0x20 and 0x48. I have not connected any pullup resistors, is it necessary?? Any more suggestions to clear me on this?

Dirk
29.05.2015, 17:54
Look into your private news!