|
放心用吧
#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; } |
|