Hallo zusammen, ich habe ein STEVAL MKI087V1 und würde gern wissen, wie man den konfiguriert. Im Datenblatt findet man nur die Pinbelegung. Ich bin neu auf dem Gebiet und Programmiere erst seit 3 Monaten ATmegas.
Andre R. schrieb: > Hallo zusammen, > > ich habe ein STEVAL MKI087V1 und würde gern wissen, wie man den > konfiguriert. > Im Datenblatt findet man nur die Pinbelegung. > > Ich bin neu auf dem Gebiet und Programmiere erst seit 3 Monaten ATmegas. Also ich hab dank google ca.25 sec gebraucht :-) Was ist das STEVAL MKI087V1 ? Antwort: Ein Breakout für den LIS331DL http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00272379.pdf Wie bewege ich den LIS331DL zur mitarbeit ? http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00172345.pdf Wie bastel ich den an meinen ATmega ? Per I²C oder SPI. Und wer I²C kennt nimmt SPI :-) Zumal ja SPI für den ATmega wie gemacht ist ;-) http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface http://www.mikrocontroller.net/articles/I2C Gruß Heiko
Danke Heiko. Laut STmicroeldctronics benötigt man noch ein weiteres Board für das beschreiben der Register. Unter user manuals die Unico software. http://www.st.com/internet/evalboard/product/250478.jsp Es muss doch aber auch ohne irgendwie gehn, da wenn man später den Sensor auf ne Platine packt man ja kein USB-Port mehr zur verfügung hat.
Hallo debugwire, schau Dir doch mal das Dtenblatt des LIS331 an, dann wirst Du efststellen daß der eine ... Schnittstelle hat. Die kannst Du an Deinem Board ja zugreifen. Grüße
Hallo debugwire, Bingo. Jetzt musst Du nur noch diese Schnittstelle auf dem Board identifizieren - welche Pins sind das? Tip: Heiko hat weiter oben schon den Link dazu gepostet: >Was ist das STEVAL MKI087V1 ? >Antwort: Ein Breakout für den LIS331DL >http://www.st.com/internet/com/TECHNICAL_RESOURCES... Und dann noch die Pins mit Deinem Controllerboard verbinden. Was ist daran schwer? Grüße
Hallo Debugwire,
hab mir mal Deinen anderen Thread angesehen. Dort schreibst Du:
>grundsätzlich möchte ich gern das Sensor Evaluierung Board STEVAL
MKI087V1 von STmicroelectronics mit einem ATmega per SPI auslesen und
weiterverarbeiten.
Also weisst Du schon wie das geht. Was meinst Du mit "Konfigurieren" und
was wilst Du eigentlich machen?
Das Datenblatt sagt zum Thema unter dem Abschnitt 7 Register description
sehr schön:
"The device contains a set of registers which are used to control its
behavior and to retrieve acceleration data. The registers address, made
of 7 bits, is used to identify them and to write the data through serial
interface."
Jetzt klar?
In dem Fall würde ich Dir eher zu was "fertigerem" raten damit Du Dich durch Selbstschulung ins Thema einarbeiten kannst. Atmel hat für die Xplain kits auch Sensor-boards entwickelt, und liefert dazu die Software im neuen Atmel Studio 6, fertige Projekte und Treiber. http://www.atmel.com/products/microcontrollers/avr/sensors_xplain.aspx Die Sensorplatinen sind kompatibel mit folgenden Kits: http://www.atmel.com/products/microcontrollers/avr/xplain.aspx Ich hab an einem halben Tag die ganze Software begriffen, und hatte wo ich abspicken konnte.
Hallo friedrich, danke für deine schnelle Antwort. Die SPI pins habe ich gefunden, versteh aber nicht, wie ich auf die Register zugreifen kann ohne die unico software. Ich habe schonmal eine SPI Kommunikation zwischen 2 ATmega hergestellt und dort müssen Master und Slave aufeinander abgestimmt sein. Ich verstehe nicht wie das beim STEVAL gehen soll.
Hallo Arthur, danke für den Tip. Leider kann ich deine ATMMEL variante nicht anschaffen aus kostengründen. Es muss mit meinem STEVAL geschehen.
Hallo debugwire, Bei jedem Mikrocontroller gibt es eine Beschreibung des Funktionsblockes SPI . Dort musst Du Dich einlesen wie Du als Master ein entsprechendes Kommando absetzen kannst. Dann liest Du den LIS nach, der ist Slave. Da du Dies schon gemacht hast (zumindest bei 2 ATMegas) solltest Du damit keine Probleme haben. Oder wo hakt es? Grüße
>Laut STmicroeldctronics benötigt man noch ein weiteres Board für das >beschreiben der Register. Nein. Das wird vermutlich nur benötigt, wenn man den Sensor zu Evalzwecken am PC betreiben will. >Es muss mit meinem STEVAL geschehen. Wo ist das Problem? SPI Write ist in 5.2.2 des Datenblatts beschrieben. CTRL_REGx in 7.2, 7.3. Sonst noch was?
Wie beschreibe ich z.B. das Register CTRL_REGx? Ich hab eine SPI Schnittstelle welche auf Pins rausgeführt ist. Wenn der CS Pin auf High gesetzt wird arbeitet der Sensor im I²C Mode und wenn nicht dann in SPI? Der Sensor hat nur die 4 SPI/I²C Pins und Vdd, Gnd, Vd_IO.
debugwire schrieb: > Wie beschreibe ich z.B. das Register CTRL_REGx? > Ich hab eine SPI Schnittstelle welche auf Pins rausgeführt ist. > Wenn der CS Pin auf High gesetzt wird arbeitet der Sensor im I²C Mode > und wenn nicht dann in SPI? > Der Sensor hat nur die 4 SPI/I²C Pins und Vdd, Gnd, Vd_IO. Uiuiui. Ich glaube Du solltest Dir mal im Web ein paar Grundlagen über SPI und SPI mit dem ATmega anlesen und dann im Anschluss nochmal das Datenblatt des LIS durchlesen. Ich weis sonst wirklich nicht wie Ich Dir das an sonsten erklären könnte. Gruß Heiko
Hallo Heiko, ich habe das Kit folgendermaßen angeschlossen. MOSI->SDO MISO->SDA SS->CS SCK->SCL Es stut sich nix. Wie schon erwähnt weiss ich immer noch nicht, wie ich bits in den Kit registern setzen oder löschen kann, da ich nicht weiß, wie ich drauf zugreife. Das ist mein Hauptproblem.
>Es stut sich nix. Bitte genauer! Was heisst das? Was tust Du, mit welcher software? Was erwartest Du? Die Verdrahtung muss für 4-Wire Mode so sein: MOSI > SDA/SDI/SDO MISO > SDO/SA0 SS > CS SPI chip select SCK > SCL/SPC SPI clock mit den Namen aus Section 5 des Datenblatts. Ich hoffe Du hast die Namen auf der AVR Seite richtig, ich kenne ihn nicht so genau. 4-Wire ist der Default Mode und deshalb zu bevorzugen. Möglicherweise kann der AVR sowieso nur 4-Wire. >Wie schon erwähnt weiss ich immer noch nicht, wie ich bits in den Kit >registern setzen oder löschen kann, Das habe ich Dir schon mal erklärt: SPI Write ist in 5.2.2 des Datenblatts beschrieben. CTRL_REGx in 7.2, 7.3. Sonst noch was? Datenblatt bitte auch lesen, nicht nur weinen!
Noch was: Bei SPI gibt es 4 Modes, die sich in der Clock-Phase, d.h. in der aktiven Clock-Flanke und im inaktive Clock Pegel unterscheiden. Das muss natürlich auch zusammenpassen.
@ gszdt: Ich habe mit AVR Studio 5 ein SPI Transmit Programm zum Übertragen von Zeichenketten auf den µC (Master) geschrieben. Den µC habe ich mit dem Sensorkit dann so verbunden, wie du gesagt hast. D.h. also ohne Konfigurierung habe ich dieses getan, da ich das mit den Sensorregistern einfach noch nicht verstanden habe. D.h. also ich habe versucht mit Werkseinstellungen des Kits alles zu betreiben. Leider ohne Erfolg. Diese Programm läuft bei meiner damaligen Anwendung SPI_µC1 sendet Zeichenkette an SPI_µC2 und µC2 gibt es dann per UART aus. D.h. am Anfang der Kette steht ein Array und am Ende der Kette kann ich die Daten am Tx-Pin der UART mit dem Oszi messen. Der µC kennt nur 4-wire SPI.
> D.h. also ohne Konfigurierung habe ich dieses getan, da ich das mit den > Sensorregistern einfach noch nicht verstanden habe. Mußt du aber ! > Leider ohne Erfolg. Wenn du nicht verstehst was du machsts, wundert dich das wirklich ? Ließ doch mal im Datenblatt des Atmega das Kapitel über SPI ! Guck dir mal die Timingdiagramme im zusammenhang mit den unterschiedlichen Konfigurationsmöglichkleiten an ! z.B. CPOL usw. wo ist das LSB und wo das MSB im Timingdiagram. Was bedeutet das ? Dann guck dir mal das Datnblatt wom Beschleunigungssensor an und die Timingdiagramme. Klingelts ?
Noch zum letzten Beitrag 2.Absatz: Ich habe also mein SPIreceive Programm des µC2 genommen, die SlaveInit gegen eine MasterInit ausgetauscht und darauf gehofft, dass der µC Daten vom Sensorkit empfängt. Leider nicht der Fall.
Hallo Uwe, ich vermute, dass ich damals bei meinem Zeichenübertragungsprogramm mit etwas Glück die Sache zum laufen bekommen hatte und somit der Meinung war SPI verstanden zu haben.
Andererseits sind es trotzdem für mich 2 verschiedene Welten. Den µC beschreibe ich über DebugWire mit AVR Studio 5, in dem ich alle Register beschreiben kann, da sie ja in der <avr/io.h> drin sind. Beim Sensorkit habe ich nur meine 4 SPI Pins, ein Datenblatt mit Registern, aber keine Software. Da liegt mein Verständnisproblem.
Hi >Beim Sensorkit habe ich nur meine 4 SPI Pins, ein Datenblatt mit >Registern... Es gibt auch noch eine Application Note: http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00215823.pdf >..., aber keine Software. Da liegt mein Verständnisproblem. Das Schreiben der notwendigen Software nennt man programmieren. Dazu muss man sich allerdings vorher intensiv mit den verfügbaren Informationsquellen beschäftigen. MfG Spess
@ Spess ich verstehe immer noch nicht, wie man die Register beschreibt. Dort steht detailiert schrittweise erklärt wie man den Code aufbauen muss. Wie aber bekomm ich den Code in das Board über die SPI? Z.B.: Kapitel 9.2.1 deiner Application Note 1 read STATUS_REG 2 if STATUS_REG(3)=0 then goto 1 3 if STATUS_REG(7)=1 then some data have been overwritten 4 read OUTX 5 read OUTY 6 read OUTZ 7 data processing 8 goto 1
debugwire schrieb: > @ Spess > > ich verstehe immer noch nicht, wie man die Register beschreibt. > Dort steht detailiert schrittweise erklärt wie man den Code aufbauen > muss. > Wie aber bekomm ich den Code in das Board über die SPI? Indem du dem AtMega mitteilst, dass er gefälligst ein Byte über seine SPI Schnittstelle rausblasen soll. Welches Byte? Na das, welches du vorher ermittelts hast, in dem zb drinnen steht, welches Register (in Form einer Registeradresse, die Namen sind nur für dich, für die Elektronik hat einfach alles, jedes einzelne Register, eine Adresse - also eine Zahl) du auslesen willst. http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface Aus dem ST Datenblatt ermittelst da WAS (den Inhalt der Bytes) du übertragen willst. Das Atmel Datenblatt (bzw. diverse Application Notes und/oder Tuorien) sagen dir, WIE man auf dem AtMega die Bytes rausbläst. Das ist ganz einfach eine Trennung in Transportmittel und Inhalt. In der Bedienungsanleitung zu deinem Auto steht, wie du dein Auto in Betrieb nimmst. Im Reiseführer steht, was es am Ort XYZ alles zu sehen gibt und wie man da hinkommt. Willst du mit deinem Auto nach XYZ fahren, dann musst du beides kombinieren, da die Anweisungen im Reiseführer eben nicht für dein spezielles Auto gelten. Dafür steht wiederrum in deiner Autobeschreibung nicht konkret drinnen, was es im Dom zu XYZ alles zu sehen gibt. Und zusätzlich wäre dann ein allgemeines Verständnis von Strassenkarten und wie man die liest, nicht verkehrt. Bei dir wäre das: Wie funktioniert eigentlich SPI grundsätzlich? Gewöhn dich daran, dass du Informationen aus mehreren Quellen zusammentragen musst. Das ist täglich Brot aller Programmierer und irgendwann musst du damit anfangen. Du spielst jetzt mit den großen Jungs.
Danke Karl Heinz. Ist das dann nur in Assembler bzw. inline-Assembler möglich? C wäre mir lieber.
Hi >Ist das dann nur in Assembler bzw. inline-Assembler möglich? >C wäre mir lieber. SPI kannst du in jeder Sprache benutzen. Beispielcode für Assembler und C steht in jedem AVR-Datenblatt. MfG Spess
Du Sendest über SPI 2 BYten also 16 Bit, dabei bedeuten die Bits das was dort im Datenblatt steht. Ab Seite 20 im Datenblatt ist doch alles beschrieben : bit 0: RW bit. When 0, the data DI(7:0) is written into the device. When 1, the data DO(7:0)from the device is read. In latter case, the chip will drive SDO at the start of bit 8. bit 1: MS bit. When 0, the address will remain unchanged in multiple read/write commands. When 1, the address will be auto incremented in multiple read/write commands. bit 2-7: address AD(5:0). This is the address field of the indexed register. bit 8-15: data DI(7:0) (write mode). This is the data that will be written into the device (MSb first). bit 8-15: data DO(7:0) (read mode). This is the data that will be read from the device (MSb first). In multiple read/write commands further blocks of 8 clock periods will be added. When MS bit is 0 the address used to read/write data remains the same for every block. When MS bit is 1 the address used to read/write data is incremented at every block.
debugwire schrieb: > Danke Karl Heinz. > > Ist das dann nur in Assembler bzw. inline-Assembler möglich? > C wäre mir lieber. Das geht in C genauso. Ist doch nur ein paar Register am AVR beschreiben um die SPI Schnittstelle zu konfiguerieren bzw. um dann die Bytes wegzuschicken. Ob du in Assembler die Bytes in die Register schaufelst oder das einen C-Compiler machen lässt, ist dem µC völlig wurscht. Nur: Es ist dein Bier, die Dinge in die Register zu schaufeln. Ein "READ STATUS REGISTER" wirst du in C nun mal nicht finden. Da musst du dir schon erst mal ansehen, wie man auf einem Mega per SPI die Bytes rausschaufelt und welche BIts in dem Byte gesetzt werden müssen, damit der Sensor das als 'Auslesen des Status Registers' interpretiert und das Byte zurückschickt. Das Studium anderer SPI-Beispiele kann da ganz hilfreich sein um zu sehen, wie die technische Seite des Transportes abläuft. Beispiele dazu gibt es genug. Goggle mit "atmega spi". Da zb. http://www.ermicro.com/blog/?p=1050 Runterscrollen zu "Microchip MCP23S17 SPI I/O Expander" und dort die SPI Read und Write Routinen mal studieren bzw. überhaupt die komplette Seite. Und dann nochmal im ST Datanblatt http://ftp.equilibrium-wow.de/cgi-bin/nph-proxy.cgi/30/http/www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00172345.pdf ab Seite 18 den SPI Transfer studieren. Und holla, da gibt es Gemeinsamkeiten! Der Byteaufbau ist anders und die Adresse wird anders angegeben, aber sooooo grossmächtig unterschiedlich ist das Prinzip nicht. Wie gesagt: Lulu-Tante war gestern. Du bist jetzt bei den Großen. Und da werden die Dinge nun mal anstrengender und man muss verstehen was man tut. Routenbeschreibung alla Navi ist was für Weicher. Wir nehmen die Strassenkarte, die wir aus mehreren Quellen erst noch zusammensetzen.
Hallo zusammen, hab jetzt ein Programm geschrieben welches einfach nur den Sensor aktivieren soll. Mehr erstmal nicht. Leider funktioniert es nicht. Beim Debuggen hängt er beim Datenbyte und es kommt zu keiner Transmission complete. Sprich in der MasterTransmit(): SPDR = data ; // Start transmission of data (register) while(!(SPSR & (1<<SPIF))) // Wait for transmission complete Woran liegt das? Kurz zum Programm: Ich übergebe der MasterTransmit 2 Parameter. 1. Adresse des Sensorregisters 2. Registerinhalt
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdio.h> |
4 | #include <stdlib.h> |
5 | #include <util/delay.h> |
6 | |
7 | #define F_CPU 100000UL
|
8 | |
9 | //SPI Registers
|
10 | #define DDR_SPI DDRB
|
11 | #define DD_SS DDB2
|
12 | #define DD_MOSI DDB3
|
13 | #define DD_MISO DDB4
|
14 | #define DD_SCK DDB5
|
15 | |
16 | //USART baudrate and presscaler
|
17 | #define BAUDRATE 115200
|
18 | #define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)
|
19 | |
20 | |
21 | //STEVAL Register adresses
|
22 | #define CTRL_REG1 0x20
|
23 | #define CTRL_REG2 0x21
|
24 | #define CTRL_REG3 0x22
|
25 | #define CTRL_REG4 0x23
|
26 | |
27 | #define HP_FILTER_RESET 0x25
|
28 | |
29 | #define REFERENCE 0x26
|
30 | |
31 | #define STATUS_REG 0x27
|
32 | |
33 | #define OUTZ 0x2D
|
34 | |
35 | |
36 | |
37 | |
38 | void SPI_MasterInit(void) |
39 | {
|
40 | DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS); //Set MOSI and SCK output, all others input |
41 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); /* Modus 0,Enable SPI, Master, set clock rate fck/128 */ |
42 | }
|
43 | |
44 | void SPI_MasterTransmit(uint8_t adress, uint8_t data) |
45 | {
|
46 | DDR_SPI &= ~(1<<DD_SS); //activate SS pin |
47 | |
48 | SPDR = adress ; // Start transmission of adress |
49 | while(!(SPSR & (1<<SPIF))) // Wait for transmission complete |
50 | ;
|
51 | SPDR = data ; // Start transmission of data (register) |
52 | while(!(SPSR & (1<<SPIF))) // Wait for transmission complete |
53 | ;
|
54 | |
55 | DDR_SPI |= (1<<DD_SS); //deactivate SS pin |
56 | }
|
57 | |
58 | uint8_t SPI_MasterReceive(uint8_t adress, uint8_t data) |
59 | {
|
60 | DDR_SPI &= ~(1<<DD_SS); //activate SS pin |
61 | |
62 | SPDR = adress | 0x80; // Start transmission of adress and read protocol (+0x80) |
63 | while(!(SPSR & (1<<SPIF))) /* Wait for reception complete */ |
64 | ;
|
65 | |
66 | SPDR = 0; //send dummy for reading data |
67 | while(!(SPSR & (1<<SPIF))) /* Wait for reception complete */ |
68 | ;
|
69 | |
70 | DDR_SPI |= (1<<DD_SS); //deactivate SS pin |
71 | |
72 | return SPDR ; /* Return Data Register */ |
73 | }
|
74 | |
75 | int main(void) |
76 | {
|
77 | SPI_MasterInit(); //SPI initialization |
78 | |
79 | SPI_MasterTransmit(CTRL_REG1, 0x47); //write protocol, CTR_REG |
80 | |
81 | |
82 | return 0; |
83 | }
|
Noch zum Programm: Ich habe es an folgendes Programm angelehnt: File Name : mcp23s17.c http://www.ermicro.com/blog/?p=1050
Hab jetzt den Fehler. Es lag am Cipselect aktivieren. Wenn ich das auskommentiere kann ich durchdebuggen. Hat irgendjemand eine Ahnung warum?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.