PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehwinkelsensor: Kommunikation mit AVR



almic
10.10.2008, 13:43
Hallo,

ich habe hier ein Drehwinkelsensor MLX90316 der über den SPI-Bus kommuniziert.
Aus dem Sensor kommt nur MOSI heraus jedoch wird beim AVR über ein Transistor an MOSI und MISO angeschlossen.
Bedeutet das , dass gelesen und geschrieben wird über eine Leitung?

In der Anlage ist das AppNote.

lg

fhs
10.10.2008, 14:53
Hallo,

im Datenblatt (http://www.melexis.com/prodfiles/0004834_DatasheetMLX90316_Rev003.pdf) steht unter "16.4": Note that MOSI and MISO use the same physical pin of the MLX90316. Das Protokoll ist im Kapitel 16 beschrieben.

Gruß

Fred

almic
10.10.2008, 16:35
Aber was hat es mit dem Transistor auf sich?

fhs
10.10.2008, 17:56
Der dient der MOSI/MISO Umschaltung. Melexis empfiehlt einen BS170: http://melexis-pressure-sensors.com/KnowledgeBase_posts.aspx?nID=1225&
Nicht vergessen, dass der Transistor das Signal invertiert: http://melexis-pressure-sensors.com/Knowledgebase/90316_serial_protocol_378.aspx
Hast Du die auf SPI vorprogrammierte Variante oder (falls nicht) ein Programmiergerät für den MLX90316?

almic
12.10.2008, 11:28
Ich habe die SPI-Variante.

Ich hoffe nur das der Winkel bereits auf 360° vorprogrammiert ist ansonsten hab ich ein Problem und muss mir dieses teuere Programmiergerät kaufen.

almic
07.01.2009, 15:22
Hallo,

ich möchte nur ungern den Beitrag nochmal aufwärmen aber es geht nicht anders.

Es geht weiterhin um den 1-Wire-SPI für den Drehwinkelsensor - diesmal um die Softwareansteuerung.

Ich initialisiere das SPI folgendermaßen:


short spi_data_receive_dreh[10]; //Antwortarray

DDRA |= (1<<DDA0); //SlaveSelect-> Ausgang
DDRB |= (1<<DDB1) | (1<<DDB2); //SCK und MOSI -> Ausgang
DDRB &= ~(1<<DDB3); //MISO -> Eingang


// Initialisierung von SPI
PORTA |= (1<<PA0);
volatile char IOReg;
SPSR |= (1<<SPI2X);
SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA);
IOReg = SPSR; // clear SPIF bit in SPSR
IOReg = SPDR;


// Drehrad innen abfragen:
PORTA &= ~(1<<PA0); // SS auf low setzen um Übertragung zu starten

SPDR = 0xAA;
while (!(SPSR & (1<<SPIF))); // wait until Char is sent
spi_data_receive_dreh[0] = SPDR;

SPDR = 0xFF;
while (!(SPSR & (1<<SPIF))); // wait until Char is sent
spi_data_receive_dreh[1] = SPDR;

SPDR = 0xFF;
while (!(SPSR & (1<<SPIF))); // wait until Char is sent
spi_data_receive_dreh[2] = SPDR;

.
.
.


Laut Datenblatt:
"The Master should send AAh followed by 9 bytes FFh. The Slave will answer with two bytes FFh followed by 4 data bytes and 4 bytes FFh"

Ich habe die vermutung das bei der Iitialisierung etwas nicht stimmt weil ich am Oszi kein Clock sehe... (eigentlich seh ich schon was aber das Signal geht im Rauschen fast unter. Kein vergleich zum Rechteck den ich beim Programmieren beobachte.)

Gibts irgendwelche Ideen woran es liegen kann?

mfg
Alex