Hallo, ich beschäftige mich zurzeit mit der Programmierung von Mikrocontroller. Beim Durchlesen einiger Datenblätter ist mir aufgefallen, dass manche Sensoren ein sogenanntes WHO_AM_I Register besitzen. Welche Aufgabe hat dieses Register, bzw. welche Informationen kann ich z.B. über SPI mit meinem Mikrocontroller herauslesen? Wird dieses Register auch für eine automatische Erkennung von Peripheriegeräten verwendet?
Am besten mal einige Links auf die entsprechenden Datenblätter posten. An sich müsste es auch darin stehen, was in dem Register enthalten sind. Aber wir können ja mal für Dich nachschauen.
Stephan R. schrieb: > Welche Aufgabe hat dieses Register, bzw. welche Informationen kann ich > z.B. über SPI mit meinem Mikrocontroller herauslesen? Das steht doch alles im Datenblatt. Manche EEPROMs haben da eine einzigartige Seriennummer drin stehen. > Wird dieses Register auch für eine automatische Erkennung von > Peripheriegeräten verwendet? Ja.
Stephan R. schrieb: > Wird dieses Register auch für eine automatische Erkennung von > Peripheriegeräten verwendet? Ja genau dafür ist es unter anderem gedacht. Wenn man z.B. einen Sensor hat den es in verschiedenen Varianten gibt, kann man anhand der ID oder WHO_AM_I Signatur entsprechend prüfen um welchen Sensor es sich handelt. Also z.B. beim BMP/BME280, welche pinkompatibel sind, kann man je nach ID entscheiden ob man neben der Temperatur und Luftdruck eben auch die Luftfeuchtigkeit abfragen kann und die Temp und Pressure Register anders skalieren muss. So kann man ggf. schon im voraus Obsoleszenzen berücksichten bzw. verschiedene Bestückungsvarianten ohne Änderung der Firmware implementieren. Kann man auch gut z.B. im Linux Kernel sehen:
1 | #define BMP180_CHIP_ID 0x55
|
2 | #define BMP280_CHIP_ID 0x58
|
3 | #define BME280_CHIP_ID 0x60
|
4 | ....
|
5 | switch (chip) { |
6 | case BMP180_CHIP_ID: |
7 | indio_dev->num_channels = 2; |
8 | data->chip_info = &bmp180_chip_info; |
9 | data->oversampling_press = ilog2(8); |
10 | data->oversampling_temp = ilog2(1); |
11 | data->start_up_time = 10000; |
12 | break; |
13 | case BMP280_CHIP_ID: |
14 | indio_dev->num_channels = 2; |
15 | data->chip_info = &bmp280_chip_info; |
16 | data->oversampling_press = ilog2(16); |
17 | data->oversampling_temp = ilog2(2); |
18 | data->start_up_time = 2000; |
19 | break; |
20 | case BME280_CHIP_ID: |
21 | indio_dev->num_channels = 3; |
22 | data->chip_info = &bme280_chip_info; |
23 | data->oversampling_press = ilog2(16); |
24 | data->oversampling_humid = ilog2(16); |
25 | data->oversampling_temp = ilog2(2); |
26 | data->start_up_time = 2000; |
27 | break; |
28 | default:
|
29 | return -EINVAL; |
30 | }
|
:
Bearbeitet durch User
Vielen Dank für die Antworten :D Theor schrieb: > Am besten mal einige Links auf die entsprechenden Datenblätter posten. http://www.invensense.com/wp-content/uploads/2017/08/ICM-20689-v2.2-002.pdf (Seite 35/49) Timmo H. schrieb: > Ja genau dafür ist es unter anderem gedacht. Wenn man z.B. einen Sensor > hat den es in verschiedenen Varianten gibt, kann man anhand der ID oder > WHO_AM_I Signatur entsprechend prüfen um welchen Sensor es sich handelt. Würde dies auch mit unterschiedlichen Sensoren funktionieren? Zum Beispiel zur Erkennung, ob ich an den SPI-Port 1 einen ICM20689 oder einen BME280 anschlossen habe?
Stephan R. schrieb: > Timmo H. schrieb: >> Ja genau dafür ist es unter anderem gedacht. Wenn man z.B. einen Sensor >> hat den es in verschiedenen Varianten gibt, kann man anhand der ID oder >> WHO_AM_I Signatur entsprechend prüfen um welchen Sensor es sich handelt. > Würde dies auch mit unterschiedlichen Sensoren funktionieren? > Zum Beispiel zur Erkennung, ob ich an den SPI-Port 1 einen ICM20689 oder > einen BME280 anschlossen habe? Hängt davon ab. Es ist leider nicht genormt wo und ob es ein ID/WHO_AM_I Register geben muss (außer bei genormten IC Klassen, wie z.B. Flash Chips nach JEDEC). Aber wenn du weißt welche Sensoren auf dich zukommen, kannst du dir zumindest einen Entscheidungs-Algorithmus ausdenken der eine art Plausibilitätsprüfung macht.
:
Bearbeitet durch User
Timmo H. schrieb: > Aber wenn du weißt welche Sensoren auf dich zukommen, > kannst du dir zumindest einen Entscheidungs-Algorithmus ausdenken der > eine art Plausibilitätsprüfung macht. Vielen Dank, ich glaube dass ist die Lösung für mein Problem :D
Bei der Erstinbetriebnahme einer neu entwickelten Baugruppe und als Treiberentwickler freut man sich über ein Register, welches immer einen garantierten Inhalt hat. ;)
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.