放心用吧
#include "stm32f10x_lib.h"
void I2C_AcknowledgePolling(u8 sla);
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);
void I2C_AcknowledgePolling(u8 sla){
I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
do{
I2C1->CR1 |= CR1_START_Set;
I2C1->DR = sla;
}while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
u8 i;
I2C_AcknowledgePolling(sla);
I2C1->CR1 |= CR1_START_Set;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C1->DR = sla;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C1->DR = suba;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C1->CR1 |= CR1_START_Set;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C1->DR = sla+1;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C1->CR1 |= CR1_ACK_Set;
if(len>1){
for(i=0;i<len-1;i++){
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
*pHead ++= I2C1->DR;
I2C1->CR1 |= CR1_ACK_Set;
}
}
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
*pHead = I2C1->DR;
I2C1->CR1 &= CR1_ACK_Reset;
I2C1->CR1 |= CR1_STOP_Set;
}
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
u8 wLen,addr;
wLen=len;
addr=suba;
ScrollPage:I2C_AcknowledgePolling(sla);
I2C1->CR1 |= CR1_START_Set;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C1->DR = sla;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C1->DR = addr;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C1->DR = *pHead++;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
addr++;
wLen--;
while(wLen){
if((addr%8)!=0){
I2C1->DR = *pHead++;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
addr++;
wLen--;
}
else{
I2C1->CR1 |= CR1_STOP_Set;
goto ScrollPage;
}
}
I2C1->CR1 |= CR1_STOP_Set;
}