/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2021/06/06 * Description : Main program body. ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /* *@Note *I2C interface routine to operate EEPROM peripheral: *I2C1_SCL(PB10)\I2C1_SDA(PB11). *This example uses EEPROM for AT24Cxx series. *Steps: *READ EEPROM:Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop. *WRITE EERPOM:Start + 0xA0 + 8bit Data Address + Write Data + Stop. * */ #include "debug.h" /********************************************************************** *@Note: AT24Cxx£º READ EEPROM£ºStart + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop. WRITE EERPOM£ºStart + 0xA0 + 8bit Data Address + Write Data + Stop. *******************************************************************************/ /* EERPOM DATA ADDRESS Length Definition */ #define Address_8bit 0 #define Address_16bit 1 /* EERPOM DATA ADDRESS Length Selection */ #define Address_Lenth Address_8bit //#define Address_Lenth Address_16bit /* Global define */ #define SIZE sizeof(TEXT_Buffer) /* Global Variable */ const u8 TEXT_Buffer[]={"CH32F10x I2C TEST"}; /********************************************************************* * @fn IIC_Init * * @brief Initializes the IIC peripheral. * * @return none */ void IIC_Init(u32 bound, u16 address) { GPIO_InitTypeDef GPIO_InitStructure={0}; I2C_InitTypeDef I2C_InitTSturcture={0}; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C2, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); I2C_InitTSturcture.I2C_ClockSpeed = bound; I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C; I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitTSturcture.I2C_OwnAddress1 = address; I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable; I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init( I2C2, &I2C_InitTSturcture ); I2C_Cmd( I2C2, ENABLE ); I2C_AcknowledgeConfig( I2C2, ENABLE ); } /********************************************************************* * @fn AT24CXX_Init * * @brief Initializes AT24xx EEPROM. * * @return none */ void AT24CXX_Init(void) { IIC_Init( 100000, 0xA0); } /********************************************************************* * @fn AT24CXX_ReadOneByte * * @brief Read one data from EEPROM. * * @param ReadAddr - Read frist address. * * @return temp - Read data. */ u8 AT24CXX_ReadOneByte(u16 ReadAddr) { u8 temp=0; while( I2C_GetFlagStatus( I2C2, I2C_FLAG_BUSY ) != RESET ); I2C_GenerateSTART( I2C2, ENABLE ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_MODE_SELECT ) ); I2C_Send7bitAddress( I2C2, 0XA0, I2C_Direction_Transmitter ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) ); #if (Address_Lenth == Address_8bit) I2C_SendData( I2C2, (u8)(ReadAddr&0x00FF) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); #elif (Address_Lenth == Address_16bit) I2C_SendData( I2C2, (u8)(ReadAddr>>8) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); I2C_SendData( I2C2, (u8)(ReadAddr&0x00FF) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); #endif I2C_GenerateSTART( I2C2, ENABLE ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_MODE_SELECT ) ); I2C_Send7bitAddress( I2C2, 0XA0, I2C_Direction_Receiver ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) ); while( I2C_GetFlagStatus( I2C2, I2C_FLAG_RXNE ) == RESET ) I2C_AcknowledgeConfig( I2C2, DISABLE ); temp = I2C_ReceiveData( I2C2 ); I2C_GenerateSTOP( I2C2, ENABLE ); return temp; } /********************************************************************* * @fn AT24CXX_WriteOneByte * * @brief Write one data to EEPROM. * * @param WriteAddr - Write frist address. * * @return DataToWrite - Write data. */ void AT24CXX_WriteOneByte(u16 WriteAddr, u8 DataToWrite) { while( I2C_GetFlagStatus( I2C2, I2C_FLAG_BUSY ) != RESET ); I2C_GenerateSTART( I2C2, ENABLE ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_MODE_SELECT ) ); I2C_Send7bitAddress( I2C2, 0XA0, I2C_Direction_Transmitter ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) ); #if (Address_Lenth == Address_8bit) I2C_SendData( I2C2, (u8)(WriteAddr&0x00FF) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); #elif (Address_Lenth == Address_16bit) I2C_SendData( I2C2, (u8)(WriteAddr>>8) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); I2C_SendData( I2C2, (u8)(WriteAddr&0x00FF) ); while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); #endif if( I2C_GetFlagStatus( I2C2, I2C_FLAG_TXE ) != RESET ) { I2C_SendData( I2C2, DataToWrite ); } while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); I2C_GenerateSTOP( I2C2, ENABLE ); } /********************************************************************* * @fn AT24CXX_Read * * @brief Read multiple data from EEPROM. * * @param ReadAddr - Read frist address. (AT24c02: 0~255) * pBuffer - Read data. * NumToRead - Data number. * * @return none */ void AT24CXX_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead) { while(NumToRead) { *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++); NumToRead--; } } /********************************************************************* * @fn AT24CXX_Write * * @brief Write multiple data to EEPROM. * * @param WriteAddr - Write frist address. (AT24c02: 0~255) * pBuffer - Write data. * NumToWrite - Data number. * * @return none */ void AT24CXX_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite) { while(NumToWrite--) { AT24CXX_WriteOneByte(WriteAddr,*pBuffer); WriteAddr++; pBuffer++; Delay_Ms(2); } } /********************************************************************* * @fn main * * @brief Main program. * * @return none */ int main(void) { u8 data[SIZE]; SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() ); AT24CXX_Init(); printf("Start Write 24Cxx....\r\n"); AT24CXX_Write(100,(u8*)TEXT_Buffer,SIZE); printf("24Cxx Write Sucess!\r\n"); Delay_Ms(500); printf("Start Read 24Cxx....\r\n"); AT24CXX_Read(100,data,SIZE); printf("The Data Readed Is: \r\n"); printf("%s\r\n", data); while(1); }