at24c04 stm32f103例程
时间: 2023-09-07 16:15:19 浏览: 192
您可以使用以下代码示例来在STM32F103微控制器上使用AT24C04 EEPROM。
```c
#include "stm32f10x.h"
#include "i2c.h"
#define AT24C04_WRITE_ADDR 0xA0
#define AT24C04_READ_ADDR 0xA1
void I2C_EE_ByteWrite(uint8_t* pBuffer, uint16_t WriteAddr)
{
/* 发送启动条件 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待I2Cx的SB标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送写地址到设备 */
I2C_Send7bitAddress(I2C1, AT24C04_WRITE_ADDR, I2C_Direction_Transmitter);
/* 等待I2Cx的ADDR标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 发送要写入的地址 */
I2C_SendData(I2C1, (uint8_t)(WriteAddr >> 8));
/* 等待数据发送完成 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(WriteAddr));
/* 等待数据发送完成 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 写入一个字节的数据 */
I2C_SendData(I2C1, *pBuffer);
/* 等待数据发送完成 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 发送停止条件 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
void I2C_EE_BufferWrite(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
{
while (NumByteToWrite--) {
I2C_EE_ByteWrite(pBuffer, WriteAddr++);
pBuffer++;
}
}
void I2C_EE_BufferRead(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
{
/* 发送启动条件 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待I2Cx的SB标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送读地址到设备 */
I2C_Send7bitAddress(I2C1, AT24C04_WRITE_ADDR, I2C_Direction_Transmitter);
/* 等待I2Cx的ADDR标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 发送要读取的地址 */
I2C_SendData(I2C1, (uint8_t)(ReadAddr >> 8));
/* 等待数据发送完成 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(ReadAddr));
/* 等待数据发送完成 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 发送重启条件 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待I2Cx的SB标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送读地址到设备 */
I2C_Send7bitAddress(I2C1, AT24C04_READ_ADDR, I2C_Direction_Receiver);
/* 等待I2Cx的ADDR标志位设置 */
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while (NumByteToRead) {
if (NumByteToRead == 1) {
/* 禁用ACK */
I2C_AcknowledgeConfig(I2C1, DISABLE);
/* 发送停止条件 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/* 等待接收缓冲区有数据 */
if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
*pBuffer = I2C_ReceiveData(I2C1);
pBuffer++;
NumByteToRead--;
}
}
/* 启用ACK */
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
int main(void)
{
uint8_t txData[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
uint8_t rxData[8] = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
I2C_Configuration(); // 初始化I2C接口
/* 写入数据到EEPROM */
I2C_EE_BufferWrite(txData, 0x0000, sizeof(txData));
/* 从EEPROM读取数据 */
I2C_EE_BufferRead(rxData, 0x0000, sizeof(rxData));
while (1) {
// 循环中可添加其他任务
}
}
```
上述代码中的I2C配置和初始化需要根据您的具体硬件设置进行调整,以便正确连接STM32F103与AT24C04 EEPROM。您还需要实现适当的I2C配置和初始化函数,以确保I2C接口能够正常工作。
请记住,这只是一个简单的示例,您可能需要根据您的具体需求进行适当的修改。
阅读全文