AD5272 IIC通讯基于STM32
一、IIC介绍
IIC的概念:I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。IIC总线时序如图所示:
二、代码示例
IIC Set
//IO方向设置
#define SDA_IN() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)3<<28;}
//IO操作函数
#define IIC_SCL PCout(6) //SCL
#define IIC_SDA PCout(7) //SDA
#define READ_SDA PCin(7) //输入SDA
//调试IIC延迟时间
int delay_I2C=2;
IIC init
//初始化IIC
void IIC_Init(void)
{
RCC->APB2ENR|=1<<4; //先使能外设IO PORTC时钟
GPIOC->CRL&=0X00FFFFFF; //PC6/7 清空
GPIOC->CRL|=0X33000000; //PC6/7 推挽输出
GPIOC->ODR|=3<<6; //PC6、7输出高
}
IIC Start
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(delay_I2C*2);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(delay_I2C*2);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
IIC Stop
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(delay_I2C*2);
IIC_SCL=1;
IIC_SDA=