forked from logzhan/RobotHardware-UESTC
66 lines
1.8 KiB
C
66 lines
1.8 KiB
C
#ifndef __BSP_IIC_H
|
||
#define __BSP_IIC_H
|
||
#include "stm32f10x.h"
|
||
|
||
/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
|
||
#define GPIO_PORT_I2C GPIOB /* GPIO端口 */
|
||
#define RCC_I2C_PORT RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
|
||
#define I2C_SCL_PIN GPIO_Pin_10 /* 连接到SCL时钟线的GPIO */
|
||
#define I2C_SDA_PIN GPIO_Pin_11 /* 连接到SDA数据线的GPIO */
|
||
|
||
/* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */
|
||
#if 1 /* 条件编译: 1 选择GPIO的库函数实现IO读写 */
|
||
#define I2C_SCL_1() GPIO_SetBits(GPIO_PORT_I2C, I2C_SCL_PIN) /* SCL = 1 */
|
||
#define I2C_SCL_0() GPIO_ResetBits(GPIO_PORT_I2C, I2C_SCL_PIN) /* SCL = 0 */
|
||
|
||
#define I2C_SDA_1() GPIO_SetBits(GPIO_PORT_I2C, I2C_SDA_PIN) /* SDA = 1 */
|
||
#define I2C_SDA_0() GPIO_ResetBits(GPIO_PORT_I2C, I2C_SDA_PIN) /* SDA = 0 */
|
||
|
||
#define I2C_SDA_READ() GPIO_ReadInputDataBit(GPIO_PORT_I2C, I2C_SDA_PIN) /* 读SDA口线状态 */
|
||
#else /* 这个分支选择直接寄存器操作实现IO读写 */
|
||
/* 注意:如下写法,在IAR最高级别优化时,会被编译器错误优化 */
|
||
#define I2C_SCL_1() GPIO_PORT_I2C->BSRR = I2C_SCL_PIN /* SCL = 1 */
|
||
#define I2C_SCL_0() GPIO_PORT_I2C->BRR = I2C_SCL_PIN /* SCL = 0 */
|
||
|
||
#define I2C_SDA_1() GPIO_PORT_I2C->BSRR = I2C_SDA_PIN /* SDA = 1 */
|
||
#define I2C_SDA_0() GPIO_PORT_I2C->BRR = I2C_SDA_PIN /* SDA = 0 */
|
||
|
||
#define I2C_SDA_READ() ((GPIO_PORT_I2C->IDR & I2C_SDA_PIN) != 0) /* 读SDA口线状态 */
|
||
#endif
|
||
|
||
|
||
#include <inttypes.h>
|
||
|
||
#define I2C_WR 0 /* 写控制bit */
|
||
#define I2C_RD 1 /* 读控制bit */
|
||
|
||
void i2c_Delay(void);
|
||
void IIC_Init(void);
|
||
void IIC_Start(void);
|
||
void IIC_Stop(void);
|
||
void IIC_Send_Byte(uint8_t _ucByte);
|
||
uint8_t IIC_Read_Byte(u8 ack);
|
||
uint8_t IIC_Wait_Ack(void);
|
||
void IIC_Ack(void);
|
||
void IIC_NAck(void);
|
||
uint8_t i2c_CheckDevice(uint8_t _Address);
|
||
|
||
|
||
#endif
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|