Stm32 I2C Sensor HYT221

Gast #5925751
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
}

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