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.