naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 12:14 pm

Hallo,
ich versuche gerade i2c zu verstehen. Ich habe einen Magnetfeldsensor von Pollin hier. Der soll auf 0x60/0x61 liegen. Mit i2cdetect -y 0 sehe ich aber nur etwas bei 0x30. Liegt das daran, dass mir die Schreib/Leseadressen "verdeckt" werden? Ich bin absoluter noob was i2c angeht.

Wäre schön wenn jemand seine Erfahrungen mit mir hier teilt.

Code: Select all

sudo modprobe i2c-dev
  367  lsmod
  368  gpio load i2c
  369  lsmod
  370  i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 3:48 pm

naicheben wrote:Mit i2cdetect -y 0 sehe ich aber nur etwas bei 0x30.
Wenn du I2C an den GPIO pins (P1 Pinheader) verwendest lautet der Befehl

Code: Select all

i2cdetect -y 1
<~~>

naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 3:55 pm

Danke für den Hinweis, aber ich habe ein Rev.1 Board und laut Gordon sollte das dann I2CBUS 0 sein.
Auf dem zweiten Bus taucht auch nix auf. Ich kann auch pseudo mäßig was aus der Adresse 0x30 lesen, aber wenn ich den Sensor drehe ändern sich die Werte nicht. Ziehe ich den Sensor ab, bekomme ich Schreib/Lese Fehler:

Code: Select all

pi@raspberrypi ~ $ i2cset -y 0 0x030 0x01 && sleep 0.010 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30
0x08
0x4d
0x08
0x06
0x00
pi@raspberrypi ~ $ i2cset -y 0 0x030 0x01 && sleep 0.010 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30 && i2cget -y 0 0x30
Error: Write failed

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 4:25 pm

Heho.

Das mit Bus 0 beim rev1 board ist schon richtig so.

Interessant wäre das Datenblatt und deine Schaltung. Könntest du uns das mal verlinken?

mfg

His
http://technikegge.blogspot.de

naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 4:32 pm

http://www.pollin.de/shop/downloads/D810164D.PDF
und http://www.pollin.de/shop/downloads/D810164B.PDF

Schaltung: stumpf an den GPIO mit und ohne externen Pullups versucht. SDA an Pin3 und SCL an pin 5
EDIT: und ich arbeite mit den 3,3V ! Mache das über ein Steckbrett (bread board)

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 8:07 pm

Aus dem ersten Manual lese ich die Adresse 0x30 raus...
After a “START” condition, master device calls specific slave device, in our case, a HDMM01 device with a 7-bit device address “[0110xx0]”. To avoid potential address conflict, either by ICs from other manufacturers or by other HDMM01 device on the same bus, a f i x addresses can be pre-programmed into HDMM01 module by the factory. Following the 7-bit address, the 8th bit determines the direction of data transfer: [1] for READ and [0] for WRITE.
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 8:58 pm

Soweit sieht ersteinmal alles IO aus.

Kannst du uns mal deinen code geben, mit dem du den Wert ausliest?
http://technikegge.blogspot.de

naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 9:22 pm

Ich habe bisher keinen Code verwendet sondern alles auf der bash gemacht. Ich habe mir ein Skript erstellt, dass auch die Pausen macht. Aber auch ein i2cdump bringt das selbe Ergebnis. Hier das Skript (erweitert um eine RTC DS1337, die auch funktioniert):

Code: Select all

pi@raspberrypi ~ $ cat magnet.sh 
#!/bin/sh
i2cset -y 0 0x30 0x00
i2cset -y 0 0x30 0x02
sleep 0.1
i2cset -y 0 0x30 0x00
i2cset -y 0 0x30 0x04
sleep 0.1
i2cset -y 0 0x30 0x00
i2cset -y 0 0x30 0x01
sleep 0.1
i2cset -y 0 0x30 0x00
i2cget -y 0 0x30
i2cget -y 0 0x30
i2cget -y 0 0x30
i2cget -y 0 0x30
i2cget -y 0 0x30

echo "und die uhr"

i2cset -y 0 0x68 0x00
i2cget -y 0 0x68
i2cget -y 0 0x68
i2cget -y 0 0x68
i2cget -y 0 0x68
i2cget -y 0 0x68
und der Output:

Code: Select all

pi@raspberrypi ~ $ sh magnet.sh 
0x00
0x01
0x61
0x01
0x88
und die uhr
0x23
0x13
0x00
0x01
0x01
pi@raspberrypi ~ $ sh magnet.sh 
0x00
0x01
0x61
0x01
0x88
und die uhr
0x45
0x13
0x00
0x01
0x01
pi@raspberrypi ~ $ sh magnet.sh 
0x00
0x01
0x61
0x01
0x88
und die uhr
0x50
0x13
0x00
0x01
0x01
Ich habe im englischen Bereicht gelesen, dass der i2c Treiber kein NACK machen kann, vielleicht ist das das Problem?
Master ends communications by NOT
sending
‘Acknowledge’ and also followed by a
‘STOP’
command

naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

Re: HDMM01 bzw. MMC2120 am i2c ?

Sun Mar 24, 2013 9:24 pm

mline wrote:Aus dem ersten Manual lese ich die Adresse 0x30 raus...
After a “START” condition, master device calls specific slave device, in our case, a HDMM01 device with a 7-bit device address “[0110xx0]”. To avoid potential address conflict, either by ICs from other manufacturers or by other HDMM01 device on the same bus, a f i x addresses can be pre-programmed into HDMM01 module by the factory. Following the 7-bit address, the 8th bit determines the direction of data transfer: [1] for READ and [0] for WRITE.
Danke für die Bestätigung, so hatte ich das auch rausgelesen. Ich hatte mich nur gewundert, weil ich einen Code für BASCOM-AVR gefunden habe, der immer von Adresse 0x60 und 0x61 gesprochen hat. Das hat mich doch arg verunsichert.

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: HDMM01 bzw. MMC2120 am i2c ?

Mon Mar 25, 2013 6:46 am

naicheben wrote:Danke für die Bestätigung, so hatte ich das auch rausgelesen. Ich hatte mich nur gewundert, weil ich einen Code für BASCOM-AVR gefunden habe, der immer von Adresse 0x60 und 0x61 gesprochen hat. Das hat mich doch arg verunsichert.
0x60 und 61 kommt raus wenn man das read/write bit an die falsche stelle gibt. Richtig ist das Bit ganz Rechts.
Also 0b01100000 statt richtig: 0b00110000 für lesen.
<~~>

naicheben
Posts: 344
Joined: Sat Jan 28, 2012 12:28 pm
Contact: Website

Solved Re: HDMM01 bzw. MMC2120 am i2c ?

Mon Mar 25, 2013 3:23 pm

Ich Dussel, jetzt habe ichs (glaub ich ) :mrgreen:

Code: Select all

pi@raspberrypi ~ $ cat magnet.sh 
#!/bin/sh
# some variables
Highx=0
Highy=0
Lowx=0
Lowy=0
bla=0

# set coil
i2cset -y 0 0x30 0x00
i2cset -y 0 0x30 0x02
sleep 0.1
#reset coil
#i2cset -y 0 0x30 0x00
#i2cset -y 0 0x30 0x04
#sleep 0.1

#endles loop, get data
while [ 1 -eq 1 ]
do
i2cset -y 0 0x30 0x00
i2cset -y 0 0x30 0x00 0x01
sleep 0.1
i2cset -y 0 0x30 0x00
bla=`i2cget -y 0 0x30`
Highx=`i2cget -y 0 0x30`
Lowx=`i2cget -y 0 0x30`
Highy=`i2cget -y 0 0x30`
Lowy=`i2cget -y 0 0x30`
echo "X= $Highx,$Lowx Y= $Highy,$Lowy"
done
Zumindest zeigt das Skript schon mal Veränderung an.

Danke Euch für die Unterstützung!

Return to “Deutsch”