
void I2C_EEPROM_Init(void) { GPIO_I2CSCLInitial(); GPIO_I2CSDAInitial(); RCC->APB1ENR |= RCC_APB1ENR_I2CEN; /* (1) */ I2C_CHANNEL->TIMINGR = I2C_TIMINGR; I2C_CHANNEL->CR1 = I2C_CR1_PE; /* (2) */ } void I2C_TransferConfig(uint8_t DevAddress, uint16_t Size, uint32_t Mode, uint32_t Request ) { /* clear tmpreg specific bits */ I2C_CHANNEL->CR2 &= (uint32_t) ~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES \ | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN \ | I2C_CR2_START | I2C_CR2_STOP)); /* update tmpreg */ #if I2C_ADDRESSINGMODE_7BIT I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)(DevAddress << 1) & I2C_CR2_SADD) \ | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) \ | (uint32_t)Mode | (uint32_t)Request); #else I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) \ | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) \ | (uint32_t)Mode | (uint32_t)Request); #endif } void I2C_Master_Transmit(uint8_t DevAddress, uint8_t eerom_start_address, const uint8_t * pData, uint16_t Size ) { uint32_t sizetmp; if ((pData == NULL) || (Size == 0)) { return; } while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY)) { } /* Send Slave Address */ /* Set NBYTES to write and reload if size > I2C_MAX_BYTES and generate RESTART */ /* Size > I2C_MAX_BYTES, need to set RELOAD bit */ if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_GENERATE_START_WRITE); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE); sizetmp = Size; } while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { } I2C_CHANNEL->TXDR = eerom_start_address; while ((Size - 1) > 0) { /* Wait until TXIS flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { } /* Write data to TXDR */ I2C_CHANNEL->TXDR = (uint32_t)*pData; pData++; sizetmp--; Size--; if ((sizetmp == 0) && (Size != 0)) { /* Wait until TXE flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TCR)) { } if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_NO_STARTSTOP); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP); sizetmp = Size; } } } /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ /* Wait until STOPF flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_STOPF)) { } /* Clear STOP Flag */ __HAL_I2C_CLEAR_FLAG(I2C_ISR_STOPF); /* Clear Configuration Register 2 */ __HAL_I2C_RESET_CR2(); } void I2C_Master_Receive(uint8_t DevAddress, uint8_t eerom_start_address, uint8_t * pData, uint16_t Size ) { uint32_t sizetmp; if ((pData == NULL) || (Size == 0)) { return; } while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY)) { } /* Send Slave Address */ /* Set NBYTES to write and reload if size > I2C_MAX_BYTES and generate RESTART */ /* Size > I2C_MAX_BYTES, need to set RELOAD bit */ I2C_TransferConfig(DevAddress, 1, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE); while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { } I2C_CHANNEL->TXDR = eerom_start_address; if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_GENERATE_START_READ); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_GENERATE_START_READ); sizetmp = Size; } while (Size > 0) { /* Wait until RXNE flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_RXNE)) { } /* Write data to RXDR */ *pData = (uint8_t)I2C_CHANNEL->RXDR; pData++; sizetmp--; Size--; if ((sizetmp == 0) && (Size != 0)) { /* Wait until TCR flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TCR)) { } if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_NO_STARTSTOP); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP); sizetmp = Size; } } } /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ /* Wait until STOPF flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_STOPF)) { } /* Clear STOP Flag */ __HAL_I2C_CLEAR_FLAG(I2C_ISR_STOPF); /* Clear Configuration Register 2 */ __HAL_I2C_RESET_CR2(); } |
GPIO_I2CSCLInitial(void)
{
/* Enable the peripheral clock of GPIOB */
RCC->IOPENR |= RCC_IOPENR_I2CEN;
I2C_PORT->PUPDR = (I2C_PORT->PUPDR & ~GPIO_PUPDR_PUPD_SCL); /* (1) */
I2C_PORT->OTYPER |= GPIO_OTYPER_OT_SCL; /* (2) */
#if (I2C_SCL_PIN < AFR_MAX_PINNUMBER)
{
I2C_PORT->AFR[0] |= (SCL_ALTERNATE_NUMBER << (I2C_SCL_PIN * 4)); /* (5) */
}
#else
{
I2C_PORT->AFR[1] |= (SCL_ALTERNATE_NUMBER << ((I2C_SCL_PIN - AFR_MAX_PINNUMBER) * 4)); /* (5) */
}
#endif
I2C_PORT->MODER = (I2C_PORT->MODER & ~GPIO_MODER_MODE_SCL) | GPIO_MODER_MODE_SCL_1;
}
GPIO_I2CSDAInitial(void)
{
/* Enable the peripheral clock of GPIOB */
RCC->IOPENR |= RCC_IOPENR_I2CEN;
/* (1) PU for I2C signals */
/* (2) open drain for I2C signals */
/* (3) AF1 for I2C signals */
/* (4) Select AF mode on PB and PB */
I2C_PORT->PUPDR = (I2C_PORT->PUPDR & ~GPIO_PUPDR_PUPD_SDA); /* (1) */
I2C_PORT->OTYPER |= GPIO_OTYPER_OT_SDA; /* (2) */
#if (I2C_SDA_PIN < AFR_MAX_PINNUMBER)
{
I2C_PORT->AFR[0] |= (SDA_ALTERNATE_NUMBER << (I2C_SDA_PIN * 4)); /* (5) */
}
#else
{
I2C_PORT->AFR[1] |= (SDA_ALTERNATE_NUMBER << ((I2C_SDA_PIN - AFR_MAX_PINNUMBER) * 4)); /* (5) */
}
#endif
I2C_PORT->MODER = (I2C_PORT->MODER & ~GPIO_MODER_MODE_SDA) | GPIO_MODER_MODE_SDA_1; /* (4) */
}