⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_eeprom.c

📁 STM32F103 IIC memory example program.
💻 C
字号:
/*******************************************************************************
铁电读/写程序
********************************************************************************/


/* Includes ------------------------------------------------------------------*/
#include"I2C_EEPROM.h"
#include"stm32f10x_lib.h"



/* Private define ------------------------------------------------------------*/
#define I2C_Speed              100000		          /*I2C 总线速率设为100kHz*/
#define I2C1_SLAVE_ADDRESS7    0xA0	  
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

u16 EEPROM_ADDRESS;
/* Private function prototypes -----------------------------------------------*/
//void GPIO_Configuration(void);
void I2C_Configuration(void);
void I2C_AcknowledgePolling(void);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure the used I/O ports pin
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
/*void GPIO_Configuration(void)      
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

  //Configure I2C1 pins: SCL and SDA 
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;	
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
} */

/*******************************************************************************
* Function Name  : I2C_Configuration
* Description    : I2C Configuration
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_Configuration(void)
{
  I2C_InitTypeDef  I2C_InitStructure; 

  /* I2C configuration */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;			  /*define the type of address is 7bit*/ 
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
  /* I2C Peripheral Enable */
  I2C_Cmd(I2C1, ENABLE);
  /* Apply I2C configuration after enabling it */
  I2C_Init(I2C1, &I2C_InitStructure);
}

/*******************************************************************************
* Function Name  : I2C_EE_Init
* Description    : Initializes peripherals used by the I2C EEPROM driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_EE_Init()
{
  /* GPIO configuration */
  //GPIO_Configuration();
  GPIO_InitTypeDef  GPIO_InitStructure; 
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;	
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /* I2C configuration */
  I2C_Configuration();

  /* depending on the EEPROM Address selected in the I2C_EEPROM.h file */
#ifdef FM24CL64  
  /* Select the FM24CL64 to write on */
  EEPROM_ADDRESS = FM24CL64;
#endif
#ifdef FM3104
  /* Select the EEPROM Block1 to write on */
  EEPROM_ADDRESS = FM3104;
#endif
#ifdef FM3104_RTC
  /* Select the FM3104_RTC to write on */
  EEPROM_ADDRESS = FM3104_RTC;
#endif
}

void I2C_AcknowledgePolling(void)
{
    do{
        I2C_GenerateSTART(I2C1,ENABLE);
        I2C_ReadRegister(I2C1,I2C_Register_SR1);	 //read the ADDR bit status

        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
    }while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
  
    I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}

/*******************************************************************************
* Function Name  : I2C_24CXX_Read()
* Description    : I2C Read data Program
* Input          : EEPROM_ADDRESS是从机地址0xa0,0xae; ReadAddr is the address that be read data; 
                   *pBuffer is data buffer; NumByteToRead is the num of read data;
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_ReadData(u8 EEPROM_ADDRESS,u16 ReadAddr,u8 *pBuffer,u8 NumByteToRead)
{
    u8 i,MSB,LSB;
	MSB=ReadAddr>>8;
	LSB=ReadAddr&0x00ff;

//  I2C_AcknowledgePolling();
    
    I2C_GenerateSTART(I2C1, ENABLE);  // Start Cmd
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
   
    I2C_SendData(I2C1, EEPROM_ADDRESS);	//send eerpom_addr
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C_SendData(I2C1, MSB); //send the MSB address
	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); 


	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

	I2C_SendData(I2C1, LSB);   //send the LSB address
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); 

 
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
    I2C_GenerateSTART(I2C1, ENABLE);  // Again Start Cmd
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  

    I2C_SendData(I2C1, EEPROM_ADDRESS+1);  //change the status to Read mode 
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    
    I2C_AcknowledgeConfig(I2C1, ENABLE);  //Enable ACK set 1

    if(NumByteToRead>1)
	{
        for(i=0;i<NumByteToRead-1;i++)
		{
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
            *pBuffer++= I2C_ReceiveData(I2C1);	// store the receive the data to Pbuffer
			I2C_AcknowledgeConfig(I2C1, ENABLE);   //enable ACK 
        }
    }
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
    *pBuffer = I2C_ReceiveData(I2C1);
    I2C_AcknowledgeConfig(I2C1, DISABLE); //Disable ACK reset 0
    
    I2C_GenerateSTOP(I2C1,ENABLE);  //Stop Cmd
}


void I2C_WriteData(u8 EEPROM_ADDRESS,u16 WriteAddr,u8* pBuffer,u8 NumByteToWrite)
{
    u8 i,MSB,LSB;
    MSB=WriteAddr>>8;
	LSB=WriteAddr&0x00ff;
    //I2C_AcknowledgePolling();
	
    
    I2C_GenerateSTART(I2C1, ENABLE);  // Start Cmd
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  
    I2C_SendData(I2C1, EEPROM_ADDRESS);	//send eerpom_addr
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C_SendData(I2C1, MSB); //send the MSB address
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); 
   
    
   	while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

	I2C_SendData(I2C1, LSB); //send the LSB address
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); 

   
    
                        
     if(NumByteToWrite>0);
	 {
	    for(i=0;i<NumByteToWrite;i++) 
		{
		while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_SendData(I2C1, *pBuffer++);
	
            
        }
		I2C_GenerateSTOP(I2C1,ENABLE);

		  
     }
}     


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -