微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 硬件I2C EEPROM命令解析

STM32 硬件I2C EEPROM命令解析

时间:11-21 来源:互联网 点击:

//通过外设 I2C2发送地址

I2C_SendData(I2C2, WriteAddr);

//检测主机发送的字节是否成功(检测EV8)

while (! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//写数据

while (NumByteToWrite--)

{

//通过外设 I2C2发送数据

I2C_SendData(I2C2, *pBuffer);

//指针++

pBuffer++;

//检测主机发送的字节是否成功(检测EV8)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

}

//产生 I2C2 传输 STOP条件

I2C_GenerateSTOP(I2C2, ENABLE);

}

void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)

{

//EEPROM设为待命状态

I2C_EE_WaitEepromStandbyState();

//产生 I2C2传输 START条件

I2C_GenerateSTART(I2C2, ENABLE);

//通过START的产生,确定主机模式是否成功(检测EV5)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

//在一个单一的数据传输情况下读取数据之前禁用的ACK

if (NumByteToRead==1)

{

I2C_AcknowledgeConfig(I2C2, DISABLE);//失能I2C2 的应答功能

}

//向指定的从 I2C设备传送地址字,选择发送方向

I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);

//检测主机传输模式是否成功(检测EV6)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

//使能I2C外设

I2C_Cmd(I2C2, ENABLE);

//通过外设 I2C2发送地址

I2C_SendData(I2C2, ReadAddr);

//检测主机发送的字节是否成功(检测EV8)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//产生 I2C2 传输 START条件

I2C_GenerateSTART(I2C2, ENABLE);

//通过START的产生,确定主机模式是否成功(检测EV5)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));

//向指定的从 I2C设备传送地址字,选择接收方向

I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Receiver);

//检测主机接收模式是否成功(检测EV6)

while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

//读取数据

while (NumByteToRead)

{

//检测主机接收的字节是否成功(检测EV8)

if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))

{

if (NumByteToRead == 2)

{

//使能或者失能指定 I2C的应答功能

I2C_AcknowledgeConfig(I2C2, DISABLE);

}

if (NumByteToRead == 1)

{

//产生 I2C2 传输 STOP条件

I2C_GenerateSTOP(I2C2, ENABLE);

}

//返回通过 I2C2最近接收的数据

*pBuffer = I2C_ReceiveData(I2C2);

//指向下个地址

pBuffer++;

NumByteToRead--;

}

}

//使能I2C2 的应答功能

I2C_AcknowledgeConfig(I2C2, ENABLE);

}

void I2C_EE_WaitEepromStandbyState(void)

{

vu16 SR1_Tmp = 0;

do

{

//产生 I2C2传输 START条件

I2C_GenerateSTART(I2C2, ENABLE);

//读取指定的 I2C寄存器 I2C_SR1 并返回其值

SR1_Tmp = I2C_ReadRegister(I2C2, I2C_Register_SR1);

//向指定的从 I2C设备传送地址字 ,选择发送方向

I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);

} while (!(I2C_ReadRegister(I2C2, I2C_Register_SR1) & 0x0002));//地址发送结束

//清除 I2Cx的应答错误标志位

I2C_ClearFlag(I2C2, I2C_FLAG_AF);

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top