Jestem bardzo nowy w używaniu CUBE STB i bibliotek HAL. Używam mikrokontrolera STM32F0 z 32 pinami. Schemat I2C jest poprawny. Potrzebuję więc trochę pomocy.
Mam czujnik pojemnościowy ( FDC1004 ), który wykorzystuje komunikację I2C. Muszę napisać te rejestry, aby odczytać dane.
Jak poprawnie wysłać żądanie START z mastera do slave (adres slave to A0)?
Jak ustawić wskaźnik na rejestr 0x0C?
- Arkusz danych widzi (Zarejestruj 0x0C: bit [7: 4]) na 1.) Nie wiem, jak to zrobić? I wreszcie, jak CZYTAĆ z tego samego rejestru?
- Plus muszę czekać pole DONE_x (Zarejestruj 0x0C: bity [3: 0]) zanim go przeczytam?
Ale nie wiem, czy zwracam się do właściwych rejestrów! Ponieważ nie otrzymuję żadnych danych z czujnika!
Oto mój kod:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
źródło
źródło
Odpowiedzi:
Zacznijmy od
HAL_I2C_Master_Transmit()
funkcji. Jeśli sprawdzisz jego deklarację:Drobny problem z drugim parametrem, adresem urządzenia podrzędnego. Adres urządzenia podrzędnego to,
b1010000
jeśli uzupełnimy go do formatu 8-bitowego, będzie tak0xA0
, jak powiedziałeś. Teraz, gdy przekazujesz to doHAL_I2C_Master_Transmit()
ciebie, nie musisz ręcznie ustawiać bitu R / W, HAL zrobi to za ciebie. Tak więc, kiedy wywołaszHAL_I2C_Master_Transmit()
transmitowany bit R / W, automatycznie wyniesie 0, co oznacza operację zapisu, a kiedy wywołaszHAL_I2C_Master_Receive()
transmitowany bit R / W, automatycznie wyniesie 1, wskazując operację zapisu . Zmieszałeś wartości R / W, ale myślę, że to nie obchodzi mnie funkcja, więc nie jest to prawdziwy błąd w kodzie.3-ci parametrów (
uint8_t *pData
) stanowi wskaźnik na bufor , który zawiera dane do wysłania . Teraz w rozmowie trzecim parametrem0x0C
jest Twoje rzeczywiste dane, adres rejestru. Problem polega na tym, że zostanie zinterpretowany jako wskaźnik (doHAL_I2C_Master_Transmit()
) w miejscu pamięci, w którym można znaleźć niektóre niezdefiniowane dane.4-ci parametrem jest wielkość bufora , liczba bajtów do wysłania. Jeśli chcesz wysłać pojedynczy bajt, ten parametr powinien wynosić 1, a nie 10.
Napisz rejestry
Oto odpowiedni schemat z arkusza danych.
Więc po wysłaniu adresu slave do autobusu, trzy kolejne bajty powinny być przesyłane: zarejestruj wskaźnik , MSB bajt , LSB bajt . Ogólna implementacja z rejestrowaniem 16-bitowych rejestrów HAL:
Przykład z twoimi wartościami:
write_register(0x0C, 0x0054);
Alternatywnie można również użyć funkcji zapisu rejestru zdefiniowanej w HAL, która ma dodatkowe parametry do przekazywania adresu rejestru i wielkości adresu.
Teraz
HAL_I2C_Master_Receive()
funkcja jest prawie taka sama jak druga.Jedyną różnicą jest to, że trzeci parametr jest wskaźnikiem do bufora, w którym będą przechowywane odebrane dane . Jest
0x02
w twoim kodzie i nie wiem, jaki był twój cel, ale będzie interpretowany jako wskaźnik (niestety do przypadkowej lokalizacji w pamięci).Czytaj rejestry
Przykład:
Istnieje również funkcja odczytu rejestru zdefiniowana przez HAL, która ma.
Zapoznaj się z częścią 8.5 dotyczącą programowania w arkuszu danych, aby uzyskać więcej informacji.
źródło