void EEP_write(u8 add,u8 date)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(date);
I2CWaitAck();
I2CStop();
HAL_Delay(5);
}
这段代码是一个用于向一个I2C设备写入数据的函数。
函数定义:
void EEP_write(u8 add,u8 data)
这定义了一个名为EEP_write的函数,它接受两个u8(通常是8位无符号整数)类型的参数:add(地址)和data(数据)。
I2C 开始信号:
I2CStart();
这个函数调用用于发送I2C的开始信号。在开始一个I2C通信会话时,需要发送一个起始条件。
发送设备地址:
I2CSendByte(0xa0);
I2CWaitAck();
首先,它发送一个字节0xa0,这通常是设备的I2C地址加上一个写位(最低位为0表示写操作)。接着,它等待设备的应答(ACK)。
发送要写入的地址:
I2CSendByte(add);
I2CWaitAck();
然后,它发送要写入数据的地址add,并再次等待设备的应答。
发送要写入的数据:
I2CSendByte(date);
I2CWaitAck();
接下来,它发送要写入的数据date,并再次等待设备的应答。
I2C 停止信号:
I2CStop();
在发送完所有数据后,它发送一个I2C的停止信号来结束这次通信会话。
延迟:
HAL_Delay(5);
最后,它调用一个HAL_Delay函数来等待5ms,为了确保设备有足够的时间来处理接收到的数据或完成其他内部操作。
总之,这个EEP_write函数主要用于向一个I2C设备在指定地址写入指定的数据。它首先发送设备的I2C地址来指定目标设备,然后发送要写入的地址,最后发送要写入的数据。在每次发送数据后,它都会等待设备的应答来确保数据已经被正确接收。
u8 EEP_read(u8 add)
{
u8 dat;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
dat = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return dat;
}
这个EEP_read函数用于从一个I2C设备读取指定地址的数据。下面是对这个函数的逐步解释:
函数定义与变量声明:
u8 EEP_read(u8 add)
{
u8 dat;
函数返回一个8位无符号整数(u8),并接受一个8位无符号整数作为参数,表示要读取的地址(add)。在函数内部,声明了一个变量dat用于存储读取到的数据。
发送I2C开始信号和设备地址:
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
与EEP_write函数类似,首先发送I2C的开始信号,然后发送设备的I2C地址(0xa0),表示接下来是一个写操作(因为最低位为0)。之后等待设备的应答。
发送要读取的地址:
I2CSendByte(add);
I2CWaitAck();
发送要读取数据的地址add,并等待设备的应答。
重复开始信号和发送设备地址(读操作):
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
在I2C协议中,读取操作通常涉及到一个重复的开始信号和发送设备地址,但这次最低位为1(0xa1),表示接下来的操作是读操作。发送完地址后,再次等待设备的应答。
接收数据:
dat = I2CReceiveByte();
调用I2CReceiveByte函数来接收从设备发送过来的一个字节数据,并将其存储在dat变量中。
发送非应答信号并停止I2C通信:
I2CSendNotAck();
I2CStop();
在读取完一个字节的数据后,通常发送一个非应答信号(NACK)来通知设备不再需要更多的数据。最后,发送I2C的停止信号来结束这次通信会话。
返回读取到的数据:
return dat;
函数返回读取到的数据dat。
总的来说,这个EEP_read函数通过I2C协议从一个设备在指定地址读取一个字节的数据,并返回这个数据。它首先发送设备的I2C地址和要读取的地址,然后发送一个重复的开始信号和设备地址(但这次表示读操作),接着接收数据,发送非应答信号,并最后发送停止信号来结束通信。