10-06-2017, 03:45 PM
Pisao sam bare-metal kod, samo što je problem što nisam napisao driver za I2C, pa je to trenutno razbacano po kodu, pisao sam bukvalno kad mi šta i gde treba... GPIO recimo imam koliko-toliko sređen, a ovo je malo u haosu.
Evo recimo inicijalizacija pinova, podešavanje frekvencije itd.
Ovo koristio za adresu, slanje, stop:
Ako ti ovo nešto znači... Ako ti nije hitno, daj mi vremena, do sutra ujutru da svedem ovo lepo i napišem lepo drajver (ne ceo, ali ovaj deo koji ja koristim), pa ti pošaljem.
Evo recimo inicijalizacija pinova, podešavanje frekvencije itd.
Code:
//clock enable
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
//pins configuration
//ovo su neke moje funkcije za inicijalizaciju GPIO, ako treba mogu da postavim
GPIO_Type PIN_SCL;
PIN_SCL.pin = SI_SCL;
PIN_SCL.mode = GPIO_MODE_OUT_50MHZ;
PIN_SCL.cnf = GPIO_OUTPUT_ALT_OD;
GPIO_Init(SI_PORT, PIN_SCL);
GPIO_Type PIN_SDA;
PIN_SDA.pin = SI_SDA;
PIN_SDA.mode = GPIO_MODE_OUT_50MHZ;
PIN_SDA.cnf = GPIO_OUTPUT_ALT_OD;
GPIO_Init(SI_PORT, PIN_SDA);
//frequency 36Mhz
//nije nepotrebno da se radi ovako, to sam se ja nešto glupirao, može da se stavi direktno
//I2C1->CR2 |= I2C_CR2_FREQ_2 | I2C_CR2_FREQ_5;
//I2C1->CR2 &= ~I2C_CR2_FREQ;
uint32_t tmpreg = I2C1->CR2;
tmpreg &= ~I2C_CR2_FREQ;
tmpreg |= (I2C_CR2_FREQ_2 | I2C_CR2_FREQ_5);
I2C1->CR2 = tmpreg;
//disable peripherial
I2C1->CR1 &= ~I2C_CR1_PE;
//reset tmpreg
tmpreg = 0;
tmpreg |= 0x36;
//slow mode
I2C1->TRISE = 0x37;
I2C1->CCR = tmpreg;
//enable peripherial
I2C1->CR1 |= I2C_CR1_PE;
//SM mode
//nije neophodno, ali treba da se upiše 1 ako se ide na 400kHz
//I2C1->CCR &= ~I2C_CCR_FS;
//ACK enable
I2C1->CR1 |= I2C_CR1_ACK;
//ni ovo nije toliko bitno, bitno je da bit15 bude 0 da bi bio u 7bit adress modu
//ostalo upisujem 0 pošto mi nije bilo bitno da imam adresu
I2C1->OAR1 = 0x0;
//peripherial enable
I2C1->CR1 |= I2C_CR1_PE;
//generate start
//I2C1->CR1 |= I2C_CR1_START;
Ovo koristio za adresu, slanje, stop:
Code:
void si5351_i2c_start (uint8_t adress) {
I2C1->CR1 |= I2C_CR1_START;
while(!(I2C1->SR1 & I2C_SR1_SB));
I2C1->DR=0xC0;
while(!(I2C1->SR1 & I2C_SR1_ADDR));
I2C1->SR1;
I2C1->SR2;
}
void si5351_i2c_write (char data) {
I2C1->DR = data;
while(!(I2C1->SR1 & I2C_SR1_TXE));
}
void si5351_i2c_stop () {
I2C1->CR1 &= ~I2C_CR1_STOP;
}
Code:
void si535x_SendRegister(uint8_t reg, uint8_t data){
si5351_i2c_start(0xC0);
si5351_i2c_write(reg);
si5351_i2c_write(data);
si5351_i2c_stop();
}
Ako ti ovo nešto znači... Ako ti nije hitno, daj mi vremena, do sutra ujutru da svedem ovo lepo i napišem lepo drajver (ne ceo, ali ovaj deo koji ja koristim), pa ti pošaljem.