2022-01-04 06:46:53 -05:00
|
|
|
/*
|
2023-08-08 23:30:13 -04:00
|
|
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
2022-01-04 06:46:53 -05:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
2019-06-04 23:32:20 -04:00
|
|
|
|
2022-11-02 06:09:22 -04:00
|
|
|
#include <stddef.h>
|
2019-06-04 23:32:20 -04:00
|
|
|
#include "hal/i2c_hal.h"
|
2022-08-24 04:29:00 -04:00
|
|
|
#include "hal/i2c_ll.h"
|
|
|
|
#include "hal/i2c_types.h"
|
2019-06-04 23:32:20 -04:00
|
|
|
|
2022-01-04 06:46:53 -05:00
|
|
|
#if SOC_I2C_SUPPORT_SLAVE
|
2019-06-04 23:32:20 -04:00
|
|
|
|
2022-08-24 04:29:00 -04:00
|
|
|
void i2c_hal_slave_init(i2c_hal_context_t *hal)
|
2019-06-04 23:32:20 -04:00
|
|
|
{
|
|
|
|
i2c_ll_slave_init(hal->dev);
|
|
|
|
//MSB
|
|
|
|
i2c_ll_set_data_mode(hal->dev, I2C_DATA_MODE_MSB_FIRST, I2C_DATA_MODE_MSB_FIRST);
|
|
|
|
//Reset fifo
|
|
|
|
i2c_ll_txfifo_rst(hal->dev);
|
|
|
|
i2c_ll_rxfifo_rst(hal->dev);
|
|
|
|
}
|
2022-01-04 06:46:53 -05:00
|
|
|
#endif
|
|
|
|
|
2023-10-26 02:04:00 -04:00
|
|
|
void _i2c_hal_set_bus_timing(i2c_hal_context_t *hal, int scl_freq, i2c_clock_source_t src_clk, int source_freq)
|
2022-01-04 06:46:53 -05:00
|
|
|
{
|
2022-08-24 04:29:00 -04:00
|
|
|
i2c_hal_clk_config_t clk_cal = {0};
|
2023-08-03 00:29:44 -04:00
|
|
|
i2c_ll_master_cal_bus_clk(source_freq, scl_freq, &clk_cal);
|
|
|
|
i2c_ll_master_set_bus_timing(hal->dev, &clk_cal);
|
2022-01-04 06:46:53 -05:00
|
|
|
}
|
2019-06-04 23:32:20 -04:00
|
|
|
|
|
|
|
void i2c_hal_master_fsm_rst(i2c_hal_context_t *hal)
|
|
|
|
{
|
|
|
|
i2c_ll_master_fsm_rst(hal->dev);
|
|
|
|
}
|
|
|
|
|
2022-08-24 04:29:00 -04:00
|
|
|
void i2c_hal_master_init(i2c_hal_context_t *hal)
|
2019-06-04 23:32:20 -04:00
|
|
|
{
|
|
|
|
i2c_ll_master_init(hal->dev);
|
|
|
|
//MSB
|
|
|
|
i2c_ll_set_data_mode(hal->dev, I2C_DATA_MODE_MSB_FIRST, I2C_DATA_MODE_MSB_FIRST);
|
|
|
|
//Reset fifo
|
|
|
|
i2c_ll_txfifo_rst(hal->dev);
|
|
|
|
i2c_ll_rxfifo_rst(hal->dev);
|
|
|
|
}
|
2022-08-24 04:29:00 -04:00
|
|
|
|
2023-10-26 02:04:00 -04:00
|
|
|
void _i2c_hal_init(i2c_hal_context_t *hal, int i2c_port)
|
2022-08-24 04:29:00 -04:00
|
|
|
{
|
2023-01-03 23:12:47 -05:00
|
|
|
if (hal->dev == NULL) {
|
|
|
|
hal->dev = I2C_LL_GET_HW(i2c_port);
|
|
|
|
}
|
2023-08-08 23:30:13 -04:00
|
|
|
i2c_ll_enable_controller_clock(hal->dev, true);
|
2022-11-02 06:09:22 -04:00
|
|
|
}
|
|
|
|
|
2023-10-26 02:04:00 -04:00
|
|
|
void _i2c_hal_deinit(i2c_hal_context_t *hal)
|
2022-11-02 06:09:22 -04:00
|
|
|
{
|
|
|
|
i2c_ll_enable_controller_clock(hal->dev, false);
|
|
|
|
hal->dev = NULL;
|
2022-08-24 04:29:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void i2c_hal_get_timing_config(i2c_hal_context_t *hal, i2c_hal_timing_config_t *timing_config)
|
|
|
|
{
|
|
|
|
i2c_ll_get_scl_clk_timing(hal->dev, &timing_config->high_period, &timing_config->low_period, &timing_config->wait_high_period);
|
|
|
|
i2c_ll_get_start_timing(hal->dev, &timing_config->rstart_setup, &timing_config->start_hold);
|
|
|
|
i2c_ll_get_stop_timing(hal->dev, &timing_config->stop_setup, &timing_config->stop_hold);
|
|
|
|
i2c_ll_get_sda_timing(hal->dev, &timing_config->sda_sample, &timing_config->sda_hold);
|
|
|
|
i2c_ll_get_tout(hal->dev, &timing_config->timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void i2c_hal_set_timing_config(i2c_hal_context_t *hal, i2c_hal_timing_config_t *timing_config)
|
|
|
|
{
|
|
|
|
i2c_ll_set_scl_clk_timing(hal->dev, timing_config->high_period, timing_config->low_period, timing_config->wait_high_period);
|
2023-08-03 00:29:44 -04:00
|
|
|
i2c_ll_master_set_start_timing(hal->dev, timing_config->rstart_setup, timing_config->start_hold);
|
|
|
|
i2c_ll_master_set_stop_timing(hal->dev, timing_config->stop_setup, timing_config->stop_hold);
|
2022-08-24 04:29:00 -04:00
|
|
|
i2c_ll_set_sda_timing(hal->dev, timing_config->sda_sample, timing_config->sda_hold);
|
|
|
|
i2c_ll_set_tout(hal->dev, timing_config->timeout);
|
|
|
|
}
|
2023-12-12 03:46:27 -05:00
|
|
|
|
|
|
|
void i2c_hal_master_trans_start(i2c_hal_context_t *hal)
|
|
|
|
{
|
|
|
|
i2c_ll_update(hal->dev);
|
|
|
|
i2c_ll_master_trans_start(hal->dev);
|
|
|
|
}
|