Forum: Mikrocontroller und Digitale Elektronik Stm32 I2C Sensor HYT221


von Har (Gast)


Lesenswert?

Hallo liebe Leute,

ich möchte den Temp-Sensor HYT221 mit dem STM32F303 auslesen (mittels 
I2C-Kommunikation).
Hierbei verwende ich von STM die stm32f30x_i2c.c Library.
Hier sind auch fertige Funktionen vorhanden, welche ich auch verwende.

1. Problem:

Um mit der I2C-Kommunikation zu beginnen, muss ich dem Chip vorher die 
Slave-Adresse schreiben. Das heißt, der Code sieht wie folgt aus:
1
    // Sensor soll mit Messung beginnen
2
    I2C_MasterRequestConfig(I2C2, I2C_Direction_Transmitter);
3
    I2C_SlaveAddressConfig(I2C2,0x28);
4
    I2C_GenerateSTART(I2C2, ENABLE);
1
    // Sensor soll mir Daten schicken
2
    I2C_MasterRequestConfig(I2C2, I2C_Direction_Reviecer);
3
    I2C_SlaveAddressConfig(I2C2,0x28);
4
    I2C_GenerateSTART(I2C2, ENABLE);

Mein Problem hierbei ist, dass nachdem das Start-Bit, die Adresse und 
das R/W-Bit gesendet wird, automatisch eine Stop-Condition durchgeführt 
wird.
Das möchte ich beim Auslesen aber nicht, da der Sensor mir ansonsten 
keine Werte zurück schickt (glaube zumindest, dass das der Grund ist).

2. Problem:
1
I2C_SendData(I2C2,0x50)
Wenn ich diese Funktion verwende, passiert nichts. Warum?



Hier meine I2C-Initialisierung:
1
void I2C_HW_init()
2
{
3
    GPIO_InitTypeDef GPIO_InitStruct;
4
    I2C_InitTypeDef I2C_InitStruct;
5
6
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
7
8
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4); // SCL PA9
9
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4); // SDA PA10
10
11
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
12
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
13
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; // set output to open drain --> the line has to be only pulled low, not driven high
14
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // enable pull up resistors
15
16
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //SDA
17
    GPIO_Init(GPIOA, &GPIO_InitStruct);
18
19
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
20
21
    I2C_DeInit(I2C2);
22
    I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // I2C mode
23
    I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
24
    I2C_InitStruct.I2C_DigitalFilter = 0x00;
25
    I2C_InitStruct.I2C_OwnAddress1 = 0x00; // own address, not relevant in master mode
26
    I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // disable acknowledge when reading (can be changed later on)
27
    I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // set address length to 7 bit addresses
28
    I2C_InitStruct.I2C_Timing = 0x0000020B; 
29
    I2C_Init(I2C2, &I2C_InitStruct); // init I2C2
30
    I2C_AutoEndCmd(I2C2,DISABLE);
31
    I2C_Cmd(I2C2,ENABLE);
32
}

von Stefan F. (Gast)


Lesenswert?

Har schrieb:
> Wenn ich diese Funktion verwende, passiert nichts. Warum?

Keine Ahnung, ich kenne diese Library nicht. Wenn alle Stricke reißen, 
dann kommst du womöglich voran, indem du von meinem Beispiel-Code 
abguckst:

http://stefanfrings.de/stm32/stm32f3.html#i2c

Der kommt ganz ohne Libraries aus (mit Ausnahme der CMSIS Core).

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.