Chciałbym odpalić OLED-a po I2C ale utknąłem na samym początku czyli komunikacji.
Czytam RM wte i nazad ale coś kiepsko mi idzie.
Funkcja do inicjalizacji:
Kod: Zaznacz cały
void I2C_Init(void)
{
// I2C GPIO CONFIG
GPIOB->CRL |= GPIO_CRL_CNF6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE6 | GPIO_CRL_MODE7;
// Software reset I2C
I2C1->CR1 |= I2C_CR1_SWRST;
I2C1->CR1 &= ~I2C_CR1_SWRST;
I2C1->CR1 &= ~I2C_CR1_PE;
I2C1->CR2 = I2C_CR2_FREQ_3; // 8MHz HSI
I2C1->TRISE |= 9;
I2C1->CCR = 80;
// Wlaczenie I2C
I2C1->CR1 |= I2C_CR1_PE | I2C_CR1_ACK;
I2C1->OAR1 = (1 << 14);
}
Zegar dla szyny włączam nieco wcześniej (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;)
Do I2C1->CR2 wpisuję 8 (tak wynika z dokumentacji).
I2C1->TRISE = 9 też z RM tam jest (1000 ns / 125 ns = 8 + 1)
I2C1->CCR z tym mam największy problem ale dla 100kHz powinno być 80 czy 160?
potem mam funkcje:
Kod: Zaznacz cały
void I2C_Start(void)
{
I2C1->CR1 |= I2C_CR1_START;
while( !(I2C1->SR1 & I2C_SR1_SB) );
}
void I2C_Stop(void)
{
I2C1->CR1 |= I2C_CR1_STOP;
}
void I2C_SendAddr(uint8_t address)
{
I2C1->DR = address & ~I2C_OAR1_ADD0;
while( !(I2C1->SR1 & I2C_SR1_ADDR) );
uint16_t dummy = I2C1->SR2;
}
void I2C_SendByte(uint8_t byte)
{
while( !( I2C1->SR1 & I2C_SR1_TXE ));
I2C1->DR = byte;
}
Ale i tak wisi mi na pierwszej pętli po wysłaniu start, czyli tu: while( !(I2C1->SR1 & I2C_SR1_SB) );
Prosił bym o jakieś nakierowanie gdzie robię błąd