万利的I2C-EEPROM例程有些问题,经本人两个昼夜的反复试验,已修改完善。 修改了两个地方,在void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)写操作函数和void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)读操作函数体内的开头先要执行一句I2C_EE_WaitEepromStandbyState(); 这样在以后调用写操作函数和读操作函数时就不用执行I2C_EE_WaitEepromStandbyState()了。但上电复位后先要执行一次读操作,以后就可以无限制的随便调用这两个函数了。 详细如下。 /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" #include "i2c_ee.h" #include"delay.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define I2C_Speed 10000 #define I2C1_SLAVE_ADDRESS7 0xA0 #define I2C_PageSize 4 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ u16 EEPROM_ADDRESS; /* Private function prototypes -----------------------------------------------*/ void I2C_Configuration(void); /******************************************************************************* * Function Name : I2C_Configuration * Description : I2C Configuration * Input : None * Output : None * Return : None *******************************************************************************/ void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* Configure I2C1 pins: SCL and SDA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /* I2C configuration */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//设置 I2C为 I2C模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//I2C快速模式 Tlow / Thigh = 2
I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;//设置第一个设备地址 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//使能应答 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//应答 7位地址 I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;//设置时钟频率 /* I2C Peripheral Enable */ I2C_Cmd(I2C1, ENABLE);//使能I2C外设 /* 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() { /* I2C configuration */ I2C_Configuration(); /* depending on the EEPROM Address selected in the i2c_ee.h file */ #ifdef EEPROM_Block0_ADDRESS /* Select the EEPROM Block0 to write on */ EEPROM_ADDRESS = EEPROM_Block0_ADDRESS; #endif #ifdef EEPROM_Block1_ADDRESS /* Select the EEPROM Block1 to write on */ EEPROM_ADDRESS = EEPROM_Block1_ADDRESS; #endif #ifdef EEPROM_Block2_ADDRESS /* Select the EEPROM Block2 to write on */ EEPROM_ADDRESS = EEPROM_Block2_ADDRESS; #endif #ifdef EEPROM_Block3_ADDRESS /* Select the EEPROM Block3 to write on */ EEPROM_ADDRESS = EEPROM_Block3_ADDRESS; #endif } /******************************************************************************* * Function Name : I2C_EE_BufferWrite * Description : Writes buffer of data to the I2C EEPROM. * Input : - pBuffer : pointer to the buffer containing the data to be * written to the EEPROM. * - WriteAddr : EEPROMs internal address to write to. * - NumByteToWrite : number of bytes to write to the EEPROM. * Output : None * Return : None pBuffer:指向要写入数据数组的指针 WriteAddr:24c02中要写入数据的首地址 NumByteToWrite:写入的字节数 *******************************************************************************/ void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)//将缓冲器的数据写入EEPROM { u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0; |