stm32软件iic读取at24c02
时间: 2023-11-12 17:00:57 浏览: 191
基于STM32F103ZET6实现模拟IIC与EEPROM(24c02)通信
以下是使用STM32软件IIC读取AT24C02的示例代码:
```c
#include "stm32f10x.h"
#define SDA_GPIO GPIOB
#define SDA_PIN GPIO_Pin_7
#define SCL_GPIO GPIOB
#define SCL_PIN GPIO_Pin_6
#define I2C_READ_ADDR 0xA1
#define I2C_WRITE_ADDR 0xA0
void i2c_start(void);
void i2c_stop(void);
void i2c_send_byte(uint8_t data);
uint8_t i2c_read_byte(void);
void i2c_ack(void);
void i2c_nack(void);
void i2c_wait(void);
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(SDA_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SCL_PIN;
GPIO_Init(SCL_GPIO, &GPIO_InitStructure);
while(1)
{
uint8_t data = 0;
uint8_t addr = 0;
// 打开I2C总线
i2c_start();
// 发送器件地址和读命令
i2c_send_byte(I2C_WRITE_ADDR);
// 发送要读取的地址
i2c_send_byte(addr);
// 重新启动I2C总线
i2c_start();
// 发送器件地址和读命令
i2c_send_byte(I2C_READ_ADDR);
// 读取数据并发送NACK
data = i2c_read_byte();
i2c_nack();
// 关闭I2C总线
i2c_stop();
// 显示读取到的数据
printf("Read data: %d\n", data);
// 延时
for(int i = 0; i < 1000000; i++);
}
}
void i2c_start(void)
{
GPIO_SetBits(SDA_GPIO, SDA_PIN);
GPIO_SetBits(SCL_GPIO, SCL_PIN);
GPIO_ResetBits(SDA_GPIO, SDA_PIN);
GPIO_ResetBits(SCL_GPIO, SCL_PIN);
}
void i2c_stop(void)
{
GPIO_ResetBits(SDA_GPIO, SDA_PIN);
GPIO_SetBits(SCL_GPIO, SCL_PIN);
GPIO_SetBits(SDA_GPIO, SDA_PIN);
}
void i2c_send_byte(uint8_t data)
{
for(int i = 0; i < 8; i++)
{
if(data & 0x80)
GPIO_SetBits(SDA_GPIO, SDA_PIN);
else
GPIO_ResetBits(SDA_GPIO, SDA_PIN);
GPIO_SetBits(SCL_GPIO, SCL_PIN);
GPIO_ResetBits(SCL_GPIO, SCL_PIN);
data <<= 1;
}
}
uint8_t i2c_read_byte(void)
{
uint8_t data = 0;
for(int i = 0; i < 8; i++)
{
data <<= 1;
GPIO_SetBits(SCL_GPIO, SCL_PIN);
if(GPIO_ReadInputDataBit(SDA_GPIO, SDA_PIN))
data |= 0x01;
GPIO_ResetBits(SCL_GPIO, SCL_PIN);
}
return data;
}
void i2c_ack(void)
{
GPIO_ResetBits(SDA_GPIO, SDA_PIN);
GPIO_SetBits(SCL_GPIO, SCL_PIN);
GPIO_ResetBits(SCL_GPIO, SCL_PIN);
}
void i2c_nack(void)
{
GPIO_SetBits(SDA_GPIO, SDA_PIN);
GPIO_SetBits(SCL_GPIO, SCL_PIN);
GPIO_ResetBits(SCL_GPIO, SCL_PIN);
}
void i2c_wait(void)
{
for(int i = 0; i < 100; i++);
}
```
注意:本示例代码仅作为参考使用,实际应用中需根据具体情况进行修改和适配。
阅读全文