Forum: Mikrocontroller und Digitale Elektronik Ich bekomme den AD-Wandler MAX1239 nicht zum laufen (STM32, HAL-Lib)


von zigner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bekomme des AD-Wandler MAX1239 nicht zum Laufen und habe langsam 
keine Ideen mehr, weshalb ich eure Hilfe benötige.

In dem angehängten Bild könnt ihr den zugehörigen Schaltplan erkennen. 
Dabei ist Ain das Messsignal das der ADC einlesen soll. I2C_SDA und 
I2C_SCL werden an den STM32F030 angeschlossen.

I2C_SDA: PA9
I2C_SCL: PA10

Nun möchte ich den MAX1239 mit dem STM32F030 und der HAL-Lib 
programmieren. Hier mein mit dem STMCube erstellter Code.
1
/* I2C1 init function */
2
static void MX_I2C1_Init(void)
3
{
4
  hi2c1.Instance = I2C1;
5
  hi2c1.Init.Timing = 0x2000090E;
6
  hi2c1.Init.OwnAddress1 = 0x99;
7
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
8
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
9
  hi2c1.Init.OwnAddress2 = 0;
10
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
11
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
12
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
13
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
14
  {
15
    Error_Handler();
16
  }
17
18
    /**Configure Analogue filter 
19
    */
20
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
21
  {
22
    Error_Handler();
23
  }
24
25
}
26
27
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
28
{
29
30
  GPIO_InitTypeDef GPIO_InitStruct;
31
  if(hi2c->Instance==I2C1)
32
  {
33
  /* USER CODE BEGIN I2C1_MspInit 0 */
34
35
  /* USER CODE END I2C1_MspInit 0 */
36
  
37
    /**I2C1 GPIO Configuration    
38
    PA9     ------> I2C1_SCL
39
    PA10     ------> I2C1_SDA 
40
    */
41
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
42
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
43
    GPIO_InitStruct.Pull = GPIO_PULLUP;
44
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
45
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
46
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
47
48
    /* Peripheral clock enable */
49
    __HAL_RCC_I2C1_CLK_ENABLE();
50
  /* USER CODE BEGIN I2C1_MspInit 1 */
51
52
  /* USER CODE END I2C1_MspInit 1 */
53
  }
54
55
}
56
57
void senden(uint8_t data){
58
  
59
  uint8_t *pointer;
60
  pointer= &data;
61
  
62
  HAL_I2C_Master_Transmit(&hi2c1, 0x6A, pointer, 1, 10); 
63
}
64
65
int main(void)
66
{
67
  HAL_Init();
68
  SystemClock_Config();
69
  MX_GPIO_Init();
70
  MX_I2C1_Init();
71
72
  while (1)
73
  {
74
    senden(0xAA);      //Setup Byte
75
    senden(0x61);      //Configuration Byte
76
  }
77
}

Der MAX1239 hat die Adresse 0110101, folglich muss bei dem Befehl 
HAL_I2C_Master_Transmit zunächst das Byte 0x6A (01101010) gesendet 
werden. Die zusätzliche 0 an Stelle 8 gibt an, dass es ein 
Schreibprozess ist.

Jedoch klappt die I2C Datenübertragung nicht, wie in der angehängten 
Oszi-Aufnahme zu erkennen ist. Das neunte Bit ist high und somit ein 
not-Ack. Das bedeutet, dass der MAX1239 nicht erkannt wird und somit 
bricht die Übertragung ab.

Freue mich auf eure Anregungen und Tipps.

von Pandur S. (jetztnicht)


Lesenswert?

Ist jede Flanke passend zum im Datenblatt vorgegebenen Timing ?
Sind alle Interaktionen exakt gemaess dem Datenblatt ?

Ich denke nicht. In diesem Fall muss man jede Zeile des Datenblatten 
sorgfaeltig nochmals gelesen werden.

Ich wuerd die Libraries mal weglegen und jedes Bit von Hand 
rausschieben. Bis der Fehler gefunden wurde zumindest.

: Bearbeitet durch User
von zigner (Gast)


Angehängte Dateien:

Lesenswert?

Sapperlot W. schrieb:
> Ist jede Flanke passend zum im Datenblatt vorgegebenen Timing ?

Ich habe nun das Timing-Diagramm mit meinem Oszi-Bild verglichen und die 
einzelnen Zeiten miteinander verglichen. Bei mir ist momentan falsch:

- Data Hold Time zu hoch (10µs anstatt 900ns)
- Rise Time Tr und Fall Time Tf zu niedrig

Wie in der Abbildung zu den I2C Einstellungen zu sehen ist, kann ich Tr 
und Tf im STCube einfach verlängern.

Nun habe ich aber das Problem, dass man dort maximal eine Frequenz von 
1000MHz einstellen kann.
Das habe ich mal versucht und hatte bei der Data Hold Time noch immer 
1,2 µs (>900ns).
Wie kann ich diese Zeit noch runter bekommen?

von hp-freund (Gast)


Lesenswert?

zigner schrieb:
> 1000MHz

Wau.

Im Ernst, normal wird F/S Mode benutzt.
Wenn Du HS nutzen willst musst Du das erst einschalten.
Datenblatt Seite 12, HS-Mode.

von zigner (Gast)


Lesenswert?

hp-freund schrieb:
> Wau.
>
> Im Ernst, normal wird F/S Mode benutzt.
> Wenn Du HS nutzen willst musst Du das erst einschalten.
> Datenblatt Seite 12, HS-Mode.

Ich will den MAX1239 überaupt nicht im HS-Mode betreiben (Außerdem wäre 
dort die max. Data Hold Time mit 150 ns noch geringer).

Ich möchte nur erreichen, dass die Data Hold Time nicht größer als der 
im Timing-Diagramm angegebene Wert von 900 ns ist.

Jedoch ist bei mir SDA während einem Bit (=Data Hold Time) immer 
deutlich größer als 900 ns. Wie in meinem Beitrag davor beschrieben, 
sogar wenn ich die höchste Frequenz einstelle.

Also muss ich es irgendwie anders schaffen, diese Zeit Data Hold zu 
verringern. Leider fällt mir hier jedoch nichts ein.

von hp-freund (Gast)


Lesenswert?

Ich habe deine Einstellungen in CubeMX 4.19 getestet, aber wie es 
aussieht werden die so nicht mehr akzeptiert.
Gibt zwar keine Meldung, aber der graue Timing Wert ist 0x00000000.

Häng mal deine aktuelle .ioc Datei an.

von zigner (Gast)


Angehängte Dateien:

Lesenswert?

hp-freund schrieb:
> Ich habe deine Einstellungen in CubeMX 4.19 getestet, aber wie es
> aussieht werden die so nicht mehr akzeptiert.
> Gibt zwar keine Meldung, aber der graue Timing Wert ist 0x00000000.
>
> Häng mal deine aktuelle .ioc Datei an.

Ich habe nun übrigens rausbekommen, was ich machen muss. Die Data hold 
time kann ich in dem Register I2C_TIMINGR über die Bits SDADEL 
einstellten (siehe Anhang).

Jetzt müsste ich allerdings noch wissen, wie man mit der HAL-Lib direkt 
ein beliebiges Register ändern kann.

von hp-freund (Gast)


Lesenswert?

zigner schrieb:
> Jetzt müsste ich allerdings noch wissen, wie man mit der HAL-Lib direkt
> ein beliebiges Register ändern kann.

Das hi2c1.Init.Timing = 0x00100209; ist das I2C_TIMINGR.
Der graue Wert in CubeMX. Wenn er sich dort nicht einstellen lässt, dann 
in der .c Datei korrigieren.

von zigner (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe nun hi2c1.Init.Timing = 0x00006666 eingestellt.
Dazu habe ich nun alle Zeiten aus der Timing Tabelle des Datenblatts mit 
meinen verglichen und bin der Meinung, dass meine Zeiten passen sollten.

Aber es tut sich immer noch nichts. Das neunte Bit ist high und die 
Kommunikation wird abgebrochen.

von zigner (Gast)


Lesenswert?

zigner schrieb:
> Aber es tut sich immer noch nichts. Das neunte Bit ist high und die
> Kommunikation wird abgebrochen.

hatte einen Wackelkontakt, nun funktioniert das Senden.

von Vergessen (Gast)


Lesenswert?

Müssten die Adressen nicht 0x68 und 0x69 sein?

von zigner (Gast)


Lesenswert?

Vergessen schrieb:
> Müssten die Adressen nicht 0x68 und 0x69 sein?

Der MAX1239 hat die Adresse 0110101. Dadurch ergeben sich die beiden 
"Adressen":

Senden: 0x6A
Lesen: 0x6B

von Vergessen (Gast)


Lesenswert?

Falls der 1239 nicht eine andere Adresse als ein 1237 hat ist diese laut 
Figure 7 im Datenblatt 0110100

von zigner (Gast)


Lesenswert?

Vergessen schrieb:
> Falls der 1239 nicht eine andere Adresse als ein 1237 hat ist diese laut
> Figure 7 im Datenblatt 0110100

Der MAX1239 hat eine andere Adresse. Diese steht auf Seite 1 in der 
Tabelle Ordering Information.

von zigner (Gast)


Lesenswert?

zigner schrieb:
> Ich habe nun hi2c1.Init.Timing = 0x00006666 eingestellt.
> Dazu habe ich nun alle Zeiten aus der Timing Tabelle des Datenblatts mit
> meinen verglichen und bin der Meinung, dass meine Zeiten passen sollten.

Dies war noch ein Versuch auf dem Steckbrett. Nun wollte ich mit 
denselben Einstellungen den MAX1239 auf meiner Platine in Betrieb 
nehmen. Allerdings stimmt nun das Timing nicht mehr, wie im Anhang 
dargestellt ist. Die Rise-Time beträgt nun 5.4526 µs, obwohl sie maximal 
300 ns betragen darf.

Ich habe es nicht geschafft den richtigen Wert für hi2c1.Init.Timing zu 
ermitteln, damit die Rising-Time unter 300 ns bleibt. Kann mir hier 
jemand weiterhelfen?

Oder kann ich diese Zeit auch noch anders senken, damit ich steilere 
Flanken bekomme?

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
Noch kein Account? Hier anmelden.