#include "I2C_BSP.h"
#include <stdio.h>
#include <string.h>
#define EEPROM_I2C_ADDRESS 0xA0
#define EEPROM_PAGE_SIZE 0x08
void I2C_Configure(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_DeInit(I2C1);
I2C_StructInit(&I2C_InitStruct);
I2C_InitStruct.I2C_Mode = I2C_MODE_MASTER;
I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;
I2C_InitStruct.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStruct);
I2C_TargetAddressConfig(I2C1, EEPROM_I2C_ADDRESS);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_1);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
I2C_Cmd(I2C1, ENABLE);
}
void I2C_TxData_Polling(uint8_t *Buffer, uint8_t Length)
{
for (uint8_t i = 0; i < Length; i++) {
I2C_SendData(I2C1, Buffer[i]);
while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE)) {}
}
}
void I2C_RxData_Polling(uint8_t *Buffer, uint16_t Length)
{
for (uint16_t i = 0; i < Length; i++) {
I2C_ReadCmd(I2C1);
while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_RFNE)) {}
Buffer[i] = I2C_ReceiveData(I2C1);
}
}
void EEPROM_WritePage(uint8_t Address, uint8_t *Buffer, uint8_t Length)
{
I2C_TxData_Polling(&Address, 1);
I2C_TxData_Polling(Buffer, Length);
while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE)) {}
I2C_GenerateSTOP(I2C1);
while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE)) {}
}
void EEPROM_ReadData(uint8_t Address, uint8_t *Buffer, uint8_t Length)
{
I2C_TxData_Polling(&Address, 1);
I2C_RxData_Polling(Buffer, Length);
I2C_GenerateSTOP(I2C1);
while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE)) {}
}
void EEPROM_WriteData(uint8_t Address, uint8_t *Buffer, uint8_t Length)
{
uint8_t Start = Address % EEPROM_PAGE_SIZE;
uint8_t StartCount = 0, PageNumber = 0, FinalCount = 0;
if (Start == 0) {
PageNumber = Length / EEPROM_PAGE_SIZE;
FinalCount = Length % EEPROM_PAGE_SIZE;
} else {
if ((Start + Length) <= EEPROM_PAGE_SIZE) {
StartCount = Length;
} else {
StartCount = EEPROM_PAGE_SIZE - Start;
PageNumber = (Length - StartCount) / EEPROM_PAGE_SIZE;
FinalCount = (Length - StartCount) % EEPROM_PAGE_SIZE;
}
}
if (StartCount) {
EEPROM_WritePage(Address, Buffer, StartCount);
Address += StartCount;
Buffer += StartCount;
Delay_MS(50);
}
while (PageNumber--) {
EEPROM_WritePage(Address, Buffer, EEPROM_PAGE_SIZE);
Address += EEPROM_PAGE_SIZE;
Buffer += EEPROM_PAGE_SIZE;
Delay_MS(50);
}
if (FinalCount) {
EEPROM_WritePage(Address, Buffer, FinalCount);
}
}
void I2C_Master_EEPROM_Polling_Sample(void)
{
const char* targetString = "Hello 21ic, Hello MM32F0121";
uint8_t len = strlen(targetString);
uint8_t WriteBuffer[len];
uint8_t ReadBuffer[len];
uint8_t errors = 0;
memset(ReadBuffer, 0, len);
memcpy(WriteBuffer, targetString, len);
I2C_Configure();
EEPROM_WriteData(0, WriteBuffer, len);
Delay_MS(50);
EEPROM_ReadData(0, ReadBuffer, len);
printf("\r\nEEPROM Write/Read Comparison (Length: %d bytes)\r\n", len);
printf("Offset | Write Data | Read Data | Status\r\n");
printf("-------+----------------+----------------+-----------\r\n");
for (uint8_t i = 0; i < len; i++) {
uint8_t writeVal = WriteBuffer[i];
uint8_t readVal = ReadBuffer[i];
char writeChar = (writeVal >= 0x20) ? writeVal : '.';
char readChar = (readVal >= 0x20) ? readVal : '.';
const char* status = "OK";
if (writeVal != readVal) {
status = "ERROR";
errors++;
}
printf("%6d | 0x%02X '%c' (%-3d) | 0x%02X '%c' (%-3d) | %s\r\n",
i,
writeVal, writeChar, writeVal,
readVal, readChar, readVal,
status);
}
printf("\r\nOriginal String: \"");
for (uint8_t i = 0; i < len; i++) {
printf("%c", (WriteBuffer[i] >= 0x20) ? WriteBuffer[i] : '.');
}
printf("\"");
printf("\r\nRead String: \"");
for (uint8_t i = 0; i < len; i++) {
printf("%c", (ReadBuffer[i] >= 0x20) ? ReadBuffer[i] : '.');
}
printf("\"");
printf("\r\n\r\nSummary: %d/%d bytes matched. %s\r\n",
len - errors, len,
(errors == 0) ? "SUCCESS (Strings match)" : "FAILED (Strings differ)");
}