ESP32-IDF系列教程(二) IIC 以DAC6574为例

一、IIC的初始化

esp_err_t DAC6574_init(void)
{

    int i2c_master_port = I2C_MASTER_NUM;

    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = DAC6574_SDA_PIN,
        .scl_io_num = DAC6574_SCL_PIN,
        .sda_pullup_en = GPIO_PULLUP_DISABLE,
        .scl_pullup_en = GPIO_PULLUP_DISABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };

    i2c_param_config(i2c_master_port, &conf);
    i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);

    // DAC6574_Set_Vout_write(DAC6574_CONTROL_A, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_B, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_C, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_D, 0);
    if (DAC6574_Set_Vout_write(DAC6574_CONTROL_ALL, 0) == ESP_OK) // 每个通道都初始化0v
    {
         ESP_LOGI(TAG,"DAC6574 init success\r\n");
        return ESP_OK;
    }
    else
    {
         ESP_LOGI(TAG,"DAC6574 init failed\r\n");
        return ESP_FAIL;
    }
}

二、DAC6574的介绍

在这里插入图片描述

三、DAC6574的驱动编写

#include "DAC6574.h"

static const char *TAG = "DAC6574";
// EventGroupHandle_t DAC6574_Event = NULL;

static esp_err_t DAC6574_register_write_8bit(uint8_t reg_addr, uint8_t data);
static esp_err_t DAC6574_register_read_8bit(uint8_t reg_addr, uint8_t *data);
static esp_err_t DAC6574_register_write_16bit(uint8_t reg_addr, uint16_t data);
static esp_err_t DAC6574_register_read_16bit(uint8_t reg_addr, uint16_t *data);

/**
 * @brief Function for 设置对应的四个管道输出的电压值 单位v
 * @param:reg_addr:输出管道,pct:输出的电压值
 */

// static uint16_t test = 0;
esp_err_t DAC6574_Set_Vout_write(uint8_t reg_addr, float pct)
{
    uint16_t Data;
    uint16_t readData;
    // Data = test;
    // test += 20;
    // if (test >= 1023)
    //     test = 0;
    Data = BIN2VAL(pct);
    //  ESP_LOGI(TAG,"data %X\r\n", Data);

    Data = Data << 6;
    //   ESP_LOGI(TAG,"data <<6  %X\r\n", Data);

    int flag = 0;

    while (flag <= 2)
    {
        if (DAC6574_register_write_16bit(reg_addr, Data) != ESP_OK)
        {
             ESP_LOGI(TAG,"DAC6574 offline\r\n");
            flag++;
            continue;
        }
        DAC6574_register_read_16bit(reg_addr, &readData);
        if (readData != Data)
        {
             ESP_LOGI(TAG,"DAC6574 set error(Vout_no_set)readData  %x data %x\r\n", readData, Data);
            flag++;
            continue;
        }
        break;
    }
    if (flag > 2)
    {
         ESP_LOGI(TAG,"Set Vout channel error \r\n");
        return ESP_FAIL;
    }
    //  ESP_LOGI(TAG,"DAC6574   %x data %x\r\n", readData, Data);
    return ESP_OK;
}

/**
 * pct:输入寄存器值  直接设置
*/
// esp_err_t DAC6574_Set_Vout_write(uint8_t reg_addr, uint16_t pct)
// {
//     uint16_t Data;
//     uint16_t readData;
//     // Data = test;
//     // test += 20;
//     // if (test >= 1023)
//     //     test = 0;
//     Data = pct;
//     //  ESP_LOGI(TAG,"data %X\r\n", Data);

//     Data = Data << 6;
//     //   ESP_LOGI(TAG,"data <<6  %X\r\n", Data);

//     int flag = 0;

//     while (flag <= 2)
//     {
//         if (DAC6574_register_write_16bit(reg_addr, Data) != ESP_OK)
//         {
//              ESP_LOGI(TAG,"DAC6574 offline\r\n");
//             flag++;
//             continue;
//         }
//         DAC6574_register_read_16bit(reg_addr, &readData);
//         if (readData != Data)
//         {
//              ESP_LOGI(TAG,"DAC6574 set error(Vout_no_set)readData  %x data %x\r\n", readData, Data);
//             flag++;
//             continue;
//         }
//         break;
//     }
//     if (flag > 2)
//     {
//          ESP_LOGI(TAG,"Set Vout channel error \r\n");
//         return ESP_FAIL;
//     }
//     //  ESP_LOGI(TAG,"DAC6574   %x data %x\r\n", readData, Data);
//     return ESP_OK;
// }


static esp_err_t DAC6574_register_write_8bit(uint8_t reg_addr, uint8_t data)
{
    uint8_t write_buf[2] = {reg_addr, data};

    return i2c_master_write_to_device(I2C_MASTER_NUM, DAC6574_ADDR, write_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
}

static esp_err_t DAC6574_register_read_8bit(uint8_t reg_addr, uint8_t *data)
{
    return i2c_master_write_read_device(I2C_MASTER_NUM, DAC6574_ADDR, &reg_addr, 1, data, 1, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
}

static esp_err_t DAC6574_register_write_16bit(uint8_t reg_addr, uint16_t data)
{
    uint8_t write_buf[3] = {reg_addr, (uint8_t)(data >> 8), (uint8_t)data};

    return i2c_master_write_to_device(I2C_MASTER_NUM, DAC6574_ADDR, write_buf, 3, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
}

static esp_err_t DAC6574_register_read_16bit(uint8_t reg_addr, uint16_t *data)
{
    esp_err_t ret;
    uint8_t write_buf[2];
    ret = i2c_master_write_read_device(I2C_MASTER_NUM, DAC6574_ADDR, &reg_addr, 1, write_buf, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    *data = write_buf[1] + (write_buf[0] << 8);
    return ret;
}
esp_err_t DAC6574_init(void)
{

    int i2c_master_port = I2C_MASTER_NUM;

    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = DAC6574_SDA_PIN,
        .scl_io_num = DAC6574_SCL_PIN,
        .sda_pullup_en = GPIO_PULLUP_DISABLE,
        .scl_pullup_en = GPIO_PULLUP_DISABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };

    i2c_param_config(i2c_master_port, &conf);
    i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);

    // DAC6574_Set_Vout_write(DAC6574_CONTROL_A, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_B, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_C, INIT_DATA);
    // DAC6574_Set_Vout_write(DAC6574_CONTROL_D, 0);
    if (DAC6574_Set_Vout_write(DAC6574_CONTROL_ALL, 0) == ESP_OK) // 每个通道都初始化0v
    {
         ESP_LOGI(TAG,"DAC6574 init success\r\n");
        return ESP_OK;
    }
    else
    {
         ESP_LOGI(TAG,"DAC6574 init failed\r\n");
        return ESP_FAIL;
    }
}
  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值