i2c_hal.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stddef.h>
  7. #include "hal/i2c_hal.h"
  8. #include "hal/i2c_ll.h"
  9. #include "hal/i2c_types.h"
  10. #if SOC_I2C_SUPPORT_SLAVE
  11. void i2c_hal_slave_init(i2c_hal_context_t *hal)
  12. {
  13. i2c_ll_slave_init(hal->dev);
  14. //MSB
  15. i2c_ll_set_data_mode(hal->dev, I2C_DATA_MODE_MSB_FIRST, I2C_DATA_MODE_MSB_FIRST);
  16. //Reset fifo
  17. i2c_ll_txfifo_rst(hal->dev);
  18. i2c_ll_rxfifo_rst(hal->dev);
  19. }
  20. #endif
  21. void _i2c_hal_set_bus_timing(i2c_hal_context_t *hal, int scl_freq, i2c_clock_source_t src_clk, int source_freq)
  22. {
  23. i2c_hal_clk_config_t clk_cal = {0};
  24. i2c_ll_master_cal_bus_clk(source_freq, scl_freq, &clk_cal);
  25. i2c_ll_master_set_bus_timing(hal->dev, &clk_cal);
  26. }
  27. void i2c_hal_master_fsm_rst(i2c_hal_context_t *hal)
  28. {
  29. i2c_ll_master_fsm_rst(hal->dev);
  30. }
  31. void i2c_hal_master_init(i2c_hal_context_t *hal)
  32. {
  33. i2c_ll_master_init(hal->dev);
  34. //MSB
  35. i2c_ll_set_data_mode(hal->dev, I2C_DATA_MODE_MSB_FIRST, I2C_DATA_MODE_MSB_FIRST);
  36. //Reset fifo
  37. i2c_ll_txfifo_rst(hal->dev);
  38. i2c_ll_rxfifo_rst(hal->dev);
  39. }
  40. void _i2c_hal_init(i2c_hal_context_t *hal, int i2c_port)
  41. {
  42. if (hal->dev == NULL) {
  43. hal->dev = I2C_LL_GET_HW(i2c_port);
  44. }
  45. i2c_ll_enable_controller_clock(hal->dev, true);
  46. }
  47. void _i2c_hal_deinit(i2c_hal_context_t *hal)
  48. {
  49. i2c_ll_enable_controller_clock(hal->dev, false);
  50. hal->dev = NULL;
  51. }
  52. void i2c_hal_get_timing_config(i2c_hal_context_t *hal, i2c_hal_timing_config_t *timing_config)
  53. {
  54. i2c_ll_get_scl_clk_timing(hal->dev, &timing_config->high_period, &timing_config->low_period, &timing_config->wait_high_period);
  55. i2c_ll_get_start_timing(hal->dev, &timing_config->rstart_setup, &timing_config->start_hold);
  56. i2c_ll_get_stop_timing(hal->dev, &timing_config->stop_setup, &timing_config->stop_hold);
  57. i2c_ll_get_sda_timing(hal->dev, &timing_config->sda_sample, &timing_config->sda_hold);
  58. i2c_ll_get_tout(hal->dev, &timing_config->timeout);
  59. }
  60. void i2c_hal_set_timing_config(i2c_hal_context_t *hal, i2c_hal_timing_config_t *timing_config)
  61. {
  62. i2c_ll_set_scl_clk_timing(hal->dev, timing_config->high_period, timing_config->low_period, timing_config->wait_high_period);
  63. i2c_ll_master_set_start_timing(hal->dev, timing_config->rstart_setup, timing_config->start_hold);
  64. i2c_ll_master_set_stop_timing(hal->dev, timing_config->stop_setup, timing_config->stop_hold);
  65. i2c_ll_set_sda_timing(hal->dev, timing_config->sda_sample, timing_config->sda_hold);
  66. i2c_ll_set_tout(hal->dev, timing_config->timeout);
  67. }