ssd1306.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "ssd1306.h"
  2. #include "esp_log.h"
  3. #include "driver/gpio.h"
  4. #include "driver/i2c.h"
  5. #include <driver/gpio.h>
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "freertos/queue.h"
  9. #include "freertos/task.h"
  10. #include "config.h"
  11. #ifdef ENABLE_SSD1306
  12. esp_err_t oled_ssd1306_init() {
  13. i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  14. i2c_master_start(cmd);
  15. i2c_master_write_byte(cmd, (SSD1306_OLED_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
  16. // Initialization (page 64)
  17. // The next bytes are commands
  18. i2c_master_write_byte(cmd, COMMAND_MODE, ACK_CHECK_EN);
  19. // Mux Ratio
  20. i2c_master_write_byte(cmd, MULTIPLEX_RATIO, ACK_CHECK_EN);
  21. i2c_master_write_byte(cmd, 0x3F, ACK_CHECK_EN);
  22. // Set display offset
  23. i2c_master_write_byte(cmd, DISPLAY_OFFSET, ACK_CHECK_EN);
  24. i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
  25. // Set display line start
  26. i2c_master_write_byte(cmd, DISPLAY_LINE_START, ACK_CHECK_EN);
  27. i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
  28. // Set Segment re-map
  29. i2c_master_write_byte(cmd, SEGMENT_REMAP, ACK_CHECK_EN);
  30. // Set COM output scan dir
  31. i2c_master_write_byte(cmd, COM_OUTPUT_SCAN_DIR, ACK_CHECK_EN);
  32. i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
  33. // Set COM pins hardware config
  34. i2c_master_write_byte(cmd, COM_PINS_HARDWARE_CONFIG, ACK_CHECK_EN);
  35. i2c_master_write_byte(cmd, 0x12, ACK_CHECK_EN);
  36. // Set contrast Control
  37. i2c_master_write_byte(cmd, CONTRAST_CONTROL, ACK_CHECK_EN);
  38. i2c_master_write_byte(cmd, 0x7F, ACK_CHECK_EN);
  39. // Disable entire display ON
  40. i2c_master_write_byte(cmd, DISABLE_ENTIRE_DISPLAY, ACK_CHECK_EN);
  41. // Set normal display
  42. i2c_master_write_byte(cmd, NORMAL_DISPLAY, ACK_CHECK_EN);
  43. // Set OSC frequency
  44. i2c_master_write_byte(cmd, DISPLAY_CLK_RATIO, ACK_CHECK_EN);
  45. i2c_master_write_byte(cmd, 0x80, ACK_CHECK_EN);
  46. // Enable charge pump regulator
  47. i2c_master_write_byte(cmd, CHARGE_PUMP_SET, ACK_CHECK_EN);
  48. i2c_master_write_byte(cmd, 0x14, ACK_CHECK_EN);
  49. // Display on
  50. i2c_master_write_byte(cmd, DISPLAY_ON, ACK_CHECK_EN);
  51. // Stop bit
  52. i2c_master_stop(cmd);
  53. esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
  54. i2c_cmd_link_delete(cmd);
  55. return ret;
  56. }
  57. void i2c_master_init() {
  58. int i2c_master_port = I2C_MASTER_NUM;
  59. i2c_config_t conf;
  60. conf.mode = I2C_MODE_MASTER;
  61. conf.sda_io_num = I2C_SDA_PIN; // Data pin
  62. conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
  63. conf.scl_io_num = I2C_CLK_PIN; // Clock pin
  64. conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
  65. conf.master.clk_speed = 100000;
  66. i2c_param_config(i2c_master_port, &conf);
  67. i2c_driver_install(i2c_master_port,
  68. conf.mode,
  69. I2C_MASTER_RX_BUF_DISABLE,
  70. I2C_MASTER_TX_BUF_DISABLE,
  71. 0);
  72. }
  73. #endif