#ifndef __DRIVER_I2C_H__ #define __DRIVER_I2C_H__ #include #include "stm32f407xx.h" #include "stm32f4xx.h" #include "main.h" #include "Com_debug.h" #include "DWT.h" // PA8是SDA,PA9是SCL // 板子改进意见:PE9和PE11用作定时器1的CH1和CH2,然后PA8和PA9留出来用作I2C的通信引脚 #define I2C_SCL_PIN GPIO_PIN_9 #define I2C_SDA_PIN GPIO_PIN_8 #define I2C_GPIO_PORT GPIOA // 宏定义 SDA拉高或拉低 #define SDA_HIGH I2C_GPIO_PORT->BSRR = I2C_SDA_PIN #define SDA_LOW I2C_GPIO_PORT->BSRR = (uint32_t)I2C_SDA_PIN << 16U // 宏定义 SCL拉高或拉低 #define SCL_HIGH I2C_GPIO_PORT->BSRR = I2C_SCL_PIN #define SCL_LOW I2C_GPIO_PORT->BSRR = (uint32_t)I2C_SCL_PIN << 16U // 宏定义 读SDA #define SDA_READ (I2C_GPIO_PORT->IDR & I2C_SDA_PIN) // 宏定义 延时5us #define SCL_DELAY DWT_delay_us(5) void Dri_I2C_Init(void); // 初始化函数 void Dri_I2C_Start(void); // 发送起始信号 void Dri_I2C_Stop(void); // 发送停止信号 void Dri_I2C_TransmitByte(uint8_t byte); // 发送一个字节的数据 uint8_t Dri_I2C_ReceiveByte(void); // 接收一个字节的数据 void Dri_I2C_TransmitACK(uint8_t ack); // 发送一个ACK信号, 参数是0(ACK)或1(NACK) uint8_t Dri_I2C_ReceiveACK(void); // 接收一个ACK信号并返回 void Dri_I2C_WriteAddr(uint8_t slave_addr); // 写从机地址 void Dri_I2C_WriteReg(uint8_t reg, uint8_t data); // 写一个寄存器 uint8_t Dri_I2C_ReadReg(uint8_t slave_addr_read, uint8_t reg); // 读一个寄存器 #endif /* __DRIVER_I2C_H__ */