WHO_AM_I Register

OP #5738525
Lesenswert?

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?
Gast #5738554
Lesenswert?

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.
#5738559
Lesenswert?

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
  }
OP #5738573
Lesenswert?

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?
#5738577
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren