AD5272基于STM32的I2C通讯代码示例

本文介绍了基于STM32的AD5272 I2C通信,详细讲解了I2C协议的基础概念,并提供了相关函数的代码示例,包括IIC初始化、读写操作等,帮助理解并实现两者间的通信。
摘要由CSDN通过智能技术生成

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=
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用STM32F103C8T6和AD5272I2C型号)的案例代码: ```c #include "stm32f10x.h" #include "stm32f10x_i2c.h" #define I2C_SCL_PIN GPIO_Pin_6 #define I2C_SDA_PIN GPIO_Pin_7 #define I2C_GPIO_PORT GPIOB #define I2C_GPIO_CLK RCC_APB2Periph_GPIOB #define I2C_SPEED 100000 // I2C通信速度,单位为Hz #define AD5272_I2C_ADDR 0x2C // AD5272I2C地址 void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; // Enable GPIOB clock RCC_APB2PeriphClockCmd(I2C_GPIO_CLK, ENABLE); // Configure I2C pins GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure); // Enable I2C1 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // Configure I2C1 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; I2C_Init(I2C1, &I2C_InitStructure); // Enable I2C1 I2C_Cmd(I2C1, ENABLE); } void AD5272_SetResistorValue(uint16_t value) { uint8_t data[2]; data[0] = (value >> 8) & 0xFF; // MSB data[1] = value & 0xFF; // LSB // Start communication I2C_GenerateSTART(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // Send AD5272 address for write I2C_Send7bitAddress(I2C1, AD5272_I2C_ADDR, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // Send data I2C_SendData(I2C1, data[0]); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data[1]); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Stop communication I2C_GenerateSTOP(I2C1, ENABLE); } int main(void) { // Initialize I2C I2C_Configuration(); // Set resistor value to 500 ohms AD5272_SetResistorValue(500); while (1) { // Your code here } } ``` 这个案例代码通过I2C总线控制STM32F103C8T6与AD5272之间的通信。在main函数中,我们首先调用`I2C_Configuration()`函数来配置I2C总线的引脚和参数。然后,我们使用`AD5272_SetResistorValue()`函数来设置AD5272的电阻值,这里设置为500欧姆。你可以根据需要修改电阻值。 请注意,这个代码只是一个简单的示例,实际应用中可能需要根据具体的硬件电路和AD5272的规格进行适当的修改和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值