AnsweredAssumed Answered

STM32F429 Discovery- I2C communication with Arduino Mega ADK

Question asked by Daattavya Aggarwal on Aug 24, 2017
Latest reply on Aug 25, 2017 by Clive One

Hello. I am trying to perform I2C communication between the stm32f429 disco board and an arduino mega adk. When I used my debugger I found that my code gets stuck in the while loop inside the send_data function infinitely. Although my led on pg13 is lighting up, I feel that the arduino isn't actually sending an acknowledge. Any help would be greatly appreciated.

 

void led_init1()
{
RCC ->AHB1ENR |= RCC_AHB1ENR_GPIOGEN;
GPIOG ->MODER |= GPIO_MODER_MODER13_0;
GPIOG ->OTYPER &= ~(GPIO_OTYPER_OT_13);
GPIOG ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0;
GPIOG ->PUPDR &= ~(GPIO_PUPDR_PUPDR13);
}

void scl_pin()
{
RCC ->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
GPIOB ->MODER |= GPIO_MODER_MODER6_1;
GPIOB ->AFR[0] = GPIO_AF4_I2C1<<24;
}
void sda_pin()
{
RCC ->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
GPIOB ->MODER |= GPIO_MODER_MODER7_1;
GPIOB ->OTYPER &= ~(GPIO_OTYPER_OT_7);
GPIOB ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_1;
GPIOB ->PUPDR |= GPIO_PUPDR_PUPDR7_0;
GPIOB ->AFR[0] = GPIO_AF4_I2C1<<28;
}
void i2c_setup()
{
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
I2C1 ->CR2 |= I2C_CR2_FREQ_3;
I2C1 ->CCR |= 0x28;
I2C1 ->TRISE = 0x09;

I2C1 ->CR1 |= I2C_CR1_PE;
I2C1 ->CR1 |= I2C_CR1_ACK;
I2C1 ->CR1 |= I2C_CR1_START;
I2C1 ->DR = 0x08;
}

void send_data(uint8_t data)
{
while(!(I2C1->SR1 & I2C_SR1_TXE)){}
I2C1 ->DR = data;

}
int main(void)
{
led_init1();
scl_pin();
sda_pin();
i2c_setup();
if(I2C1->CR1 & I2C_CR1_ACK)
GPIOG ->BSRRL |= GPIO_BSRR_BS_13;
while(1)
{
send_data(5);
}
}

Outcomes