📄 i2c_eeprom.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 + -