Programujeme STM32 - bez knihoven (Ukázka, strana 99)

Page 1

11.1. JEDNOSMĚRNÁ KOMUNIKACE MASTER->SLAVE A MASTER<-SLAVE

11.1.1.2

I2C3

Nastavení I2C3 se trochu liší. První rozdíl je, že u pinů již není třeba aktivovat pull-up rezistory. To stačí pouze u jedné dvojice pinů komunikace. Další změny vychází z toho, že I2C3 pracuje v našem příkladu jako obvod Slave. Proto u něj aktivujeme registr držící Slave adresu, a tu pak do něj nahrajeme ze vstupního parametru funkce. Poslední změnou je povolení přerušení při shodě přijaté adresy s právě uloženou Slave adresou. Bez aktivace a obsluhy tohoto přerušení nebude periferie reagovat na přijetí shodné adresy potvrzovacím ACK signálem, takže komunikace nebude možná. V závěru opět povolíme linku přerušení pro ARM a zapneme periferii. void I2C3_init(uint8_t AdresaSlave) { // zapne hodinovy signal pro port C RCC->IOPENR |= RCC_IOPENR_GPIOCEN; // vynuluje nastaveni pinu PC0 a PC1 (vstupni rezim) GPIOC->MODER &= ~(GPIO_MODER_MODE0 | GPIO_MODER_MODE1); // nastavi piny PC0 a PC1 do alternativniho rezimu GPIOC->MODER |= (GPIO_MODER_MODE0_1 | GPIO_MODER_MODE1_1); // nastavi alternativni rezim 7 pro piny PC0 a PC1 GPIOC->AFR[0] |= ((7U << GPIO_AFRL_AFSEL0_Pos) | (7 << GPIO_AFRL_AFSEL1_Pos)); // nastavi piny PC0 a PC1 do rezimu open-drain GPIOC->OTYPER |= (GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1); // zapne hodinovy signal pro I2C3 RCC->APB1ENR |= RCC_APB1ENR_I2C3EN; // povoli a nastavi adresu Slave obvodu I2C3->OAR1 |= ((AdresaSlave << I2C_OAR1_OA1_Pos) | I2C_OAR1_OA1EN); // povoli preruesni pri shode Slave adresy I2C3->CR1 |= I2C_CR1_ADDRIE; // povoli preruseni I2C3 ARM jadra NVIC->ISER[0] |= (1U << I2C3_IRQn);

}

// zapne I2C3 I2C3->CR1 |= I2C_CR1_PE;

89 Ukázka elektronické knihy, UID: KOS505583


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.