AnsweredAssumed Answered

I'm not getting through I2C Start

Question asked by uli stone on Aug 31, 2017

Hi,

I'm not getting through the I2C Start (while loop).

Is there something wrong with the I2C Start-up?

 

#include "stm32f4xx.h"

void SystemClock_Config(void);                                                                                        
void GPIO_Config(void);                                                                                            
void I2C_Config(void);                                                                                              
void I2C_Start(void);                                                                                              
void I2C_Stop(void);                                                                                             
void I2C_ADDR(unsigned char ADDR);                                                                              
void I2C_Write(unsigned char write_data);                                                                        
unsigned char I2C_Read(void);                                                                                      
void MCO_Output_PA8(void);                                                                                           


int main(void)
{
   SystemClock_Config();
    GPIO_Config();
    I2C_Config();

    //set source clock frequency
    GPIOA->MODER |= GPIO_MODER_MODER8_1;
    RCC->CFGR |= RCC_CFGR_MCO1_1;                                                                                    //PLL as MCO1 source
    RCC->CFGR |= RCC_CFGR_MCO1PRE_0;                                                                                //Prescaler 0


    int n;
    while(1)
    {

    GPIOA->ODR |= GPIO_ODR_ODR_5;
    //for(n=0; n<700000; n++);

    if(!(GPIOC->IDR & GPIO_IDR_IDR_13))
    {
        GPIOA->ODR &= ~GPIO_ODR_ODR_5;
        for(n=0; n<700000; n++);
    }


    I2C_Start();
    }

}

//SystemClock configuration
void SystemClock_Config(void)
{
    RCC->CR |= RCC_CR_CSSON | RCC_CR_HSEBYP | RCC_CR_HSEON;                                                         //clock security system enabled, HSE Enable Bypass and HSE Enable

    //HSE Clock
    while (!(RCC->CR & RCC_CR_HSERDY));                                                                             //wait till HSE oscillator is stable

    //FLASH Configuration
    FLASH->ACR |= FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_3WS;                        //FLASH Prefetch, Instruction, Data Cache enable;
                                                                                                                    //FLASH wait states 3 !change to higher value, if problems occur

    //PLL configuration and activation
    RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE | RCC_PLLCFGR_PLLM_2 |  0x00000078 | RCC_PLLCFGR_PLLP_0;
    RCC->CR |= RCC_CR_PLLON;                                                                                        //activate PLL
    while(!(RCC->CR & RCC_CR_PLLRDY));                                                                                //wait till PLL is stable


    //Sysclk activation
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while (!(RCC->CFGR & RCC_CFGR_SWS_PLL));

    //PPRE1 and PPRE2 Prescaler
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;                                                                                //HCLK divided by 4
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;                                                                                //HCLK divided by 2

}


//GeneralPurposeInputOutput configuration
void GPIO_Config(void)
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;                                                                            //enable AHB1 GPIO->A and GPIO->C clock
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;

    RCC->AHB1RSTR |= RCC_AHB1RSTR_GPIOARST | RCC_AHB1RSTR_GPIOCRST;
    RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST | RCC_AHB1RSTR_GPIOCRST);
    GPIOA->MODER |= GPIO_MODER_MODER5_0;

}


//MCO1 as Output, for verification with logic analyzer
void MCO_Output_PA8 (void)
{

    GPIOA->MODER |= GPIO_MODER_MODER8_1;
    RCC->CFGR |= RCC_CFGR_MCO1_1;                                                                                        //PLL as MCO1 source
    RCC->CFGR |= RCC_CFGR_MCO1PRE_0;                                                                                    //Prescaler 0

}


//I2C configuration
void I2C_Config(void)
{
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;                                                                                //enable AHB1 GPIO->B clock
    GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;                                                            //set PB6 & PB7 to alternate function
    GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_6 & GPIO_OTYPER_OT_7);                                                            //Push-Pull configuration for PB6 & PB7, Reset configuration
    GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR6 & GPIO_PUPDR_PUPDR7);
    GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR7_0;
    GPIOB->AFR[0] |= (1<<26) | (1<<30);                                                                                 //set PB6 (SCL) & PB7 (SDA) to AF4 (I2C1)


    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;

    I2C1->CR2 |= I2C_CR2_FREQ_1 | I2C_CR2_FREQ_2 | I2C_CR2_FREQ_3 | I2C_CR2_FREQ_4;
    I2C1->CCR |= I2C_CR2_FREQ_0 | I2C_CR2_FREQ_1;
    I2C1->TRISE |= 1<<1 | 1<<3;
    I2C1->CR1 |= I2C_CR1_PE;
    
}


//Start I2C Communication
void I2C_Start(void)
{
    I2C1->CR1 |= I2C_CR1_START;
    while (!(I2C1->SR1 & I2C_SR1_SB));
}

Outcomes