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:
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 | }
|