STM32F103硬件IIC与PT2258芯片通信

iic.c

#include "iic.h"
#include "usart.h"

static __IO uint32_t  I2CTimeout = I2CT_LONG_TIMEOUT; 


void I2C_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(IIC_GPIO_CLK,ENABLE);
    
    //SCL
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Pin = IIC_SCL_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(IIC_SCL_GPIO_PORT,&GPIO_InitStructure);
    //SDA
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Pin = IIC_SDA_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(IIC_SDA_GPIO_PORT,&GPIO_InitStructure);
}
void I2C_Mode_Config(void)
{
    I2C_InitTypeDef  I2C_InitStructure;
    
    RCC_APB1PeriphClockCmd(IIC_CLK,ENABLE);
    /* I2C 配置 */
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    
    /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = I2Cx_OWN_ADDRESS7;
    //
    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);
    
    I2C_Cmd(I2C1,ENABLE);
}
void I2CInit(void)
{
    I2C_GPIO_Config();
    I2C_Mode_Config();
}

void PT2258Write(uint8_t OneDB,uint8_t TenDB)
{
    //发送起始信号
    I2C_GenerateSTART(I2C1,ENABLE);
    
    I2CTimeout = I2CT_FLAG_TIMEOUT;
    
    //等待EV5事件
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT))
    {
        if((I2CTimeout--) == 0)
        {
            printf("I2C 等待超时!errorCode is 0\r\n");
            return;
        }
    }
    
    I2CTimeout = I2CT_FLAG_TIMEOUT;
    
    //发送设备地址
    I2C_Send7bitAddress(I2C1,PT2258_ADDR,I2C_Direction_Transmitter);
    //等待EV6事件
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
    {
        if((I2CTimeout--) == 0)
        {
            printf("I2C 等待超时!errorCode is 1\r\n");
            return;
        }
    }
    //发送数据
    I2C_SendData(I2C1,0xE0 + OneDB);
    I2CTimeout = I2CT_FLAG_TIMEOUT;
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
    {
        if((I2CTimeout--) == 0)
        {
            printf("I2C 等待超时!errorCode is 2\r\n");
            return;
        }
    }
    //
    I2C_SendData(I2C1,0xD0 + TenDB);
    I2CTimeout = I2CT_FLAG_TIMEOUT;
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
    {
        if((I2CTimeout--) == 0)
        {
            printf("I2C 等待超时!errorCode is 3\r\n");
            return;
        }
    }
    
    //发送停止信号
    I2C_GenerateSTOP(I2C1,ENABLE);

    return ;
}

根据PT2258芯片手册,衰减1db与10db的指令是0xE0与0xD0

 

先发送设备地址后面发送数据,最大速率不超过100kHz

STM32F103是一款基于ARM Cortex-M3内核的微控制器,具备硬件IIC(Inter-Integrated Circuit)功能,可以实现主从设备之间的通信硬件IIC通信是一种串行通信协议,通常用于短距离的设备之间的通信。它需要两根信号线:SDA(数据线)和SCL(时钟线)。在IIC通信中,一个设备充当主设备,控制整个通信的进行,而其他设备则充当从设备,等待主设备的命令。 在STM32F103中,可以通过配置相关寄存器和使用相应的库函数来实现IIC通信。作为主设备,我们需要首先初始化IIC总线,并设置相应的通信速率。然后,我们可以通过发送起始信号、选择从设备地址和读写操作来与从设备进行通信通信过程中,主设备可以通过发送或接收数据来完成数据的传输。 作为从设备,我们首先需要等待主设备选择我们的地址。当地址匹配时,我们可以通过拉低SDA线来发送应答信号,表示已经准备好进行通信。在收到数据后,我们可以发送应答信号,告知主设备数据已经接收完毕。 硬件IIC通信是一种简单、高效的通信方式,适用于需要短距离、低速率的设备之间的通信。在使用STM32F103进行硬件IIC主从通信时,我们需要合理配置主设备和从设备的相关参数,并遵循IIC通信的协议来进行通信。 总之,STM32F103通过硬件IIC功能,可以实现主从设备之间的通信。通过合适的配置和使用相应的库函数,我们可以轻松地实现IIC通信,并实现数据的传输。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值