STM32F4-------I2C通信
I2C:两线式串行总线,是由数据线SDA和时钟线SCL构成的串行总线,是一种半双工通信方式。
数据线SDA有时需要用做输入,有时需用做输出。需要通过MODER寄存器进行配置;
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA输出
#define READ_SDA PBin(9) //SDA输入
I2C协议
- 空闲状态;
- 起始信号和停止信号;
- 应答信号ACK;
- 数据的有效性;
- 数据传输;
1.空闲状态
数据线SDA和时钟线SCL同时处于高电平时,为I2C总线的空闲状态。
IIC_SDA = 1;
IIC_SCL = 1;
2.起始信号和停止信号
起始信号:在时钟线SCL为高电平时,数据线SDA由高跳变至低;
停止信号:在时钟线SCL为高电平时,数据线SDA由低跳变至高;
这两种信号是一种电平跳变时序信号,而不是一个电平信号。
//起始信号
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us(4);
IIC_SDA = 0;
delay_us(4);
IIC_SCL =