CST816D.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "CST816D.h"
  2. #include "driver/i2c.h"
  3. #include "driver/gpio.h"
  4. #include "esp_log.h"
  5. #include "freertos/FreeRTOS.h"
  6. #include "freertos/task.h"
  7. static const char *TAG = "CST816D";
  8. static void i2c_master_init(CST816D_t *dev) {
  9. i2c_config_t conf = {
  10. .mode = I2C_MODE_MASTER,
  11. .sda_io_num = dev->sda_pin,
  12. .scl_io_num = dev->scl_pin,
  13. .sda_pullup_en = GPIO_PULLUP_ENABLE,
  14. .scl_pullup_en = GPIO_PULLUP_ENABLE,
  15. .master.clk_speed = 100000 // 100kHz
  16. };
  17. i2c_param_config(dev->i2c_port, &conf);
  18. i2c_driver_install(dev->i2c_port, conf.mode, 0, 0, 0);
  19. }
  20. static esp_err_t mpu9250_register_read(uint8_t reg_addr, uint8_t *data, size_t len)
  21. {
  22. return i2c_master_write_read_device(0, I2C_ADDR_CST816D , &reg_addr, 1, data, len, 1000 / portTICK_PERIOD_MS);
  23. }
  24. void CST816D_init(CST816D_t *dev) {
  25. // Initialize I2C
  26. i2c_master_init(dev);
  27. // Configure reset pin
  28. if (dev->rst_pin != -1) {
  29. gpio_set_direction(dev->rst_pin, GPIO_MODE_OUTPUT);
  30. gpio_set_level(dev->rst_pin, 0);
  31. vTaskDelay(pdMS_TO_TICKS(10));
  32. gpio_set_level(dev->rst_pin, 1);
  33. vTaskDelay(pdMS_TO_TICKS(300));
  34. }
  35. // Configure interrupt pin
  36. if (dev->int_pin != -1) {
  37. gpio_set_direction(dev->int_pin, GPIO_MODE_OUTPUT);
  38. gpio_set_level(dev->int_pin, 1);
  39. vTaskDelay(pdMS_TO_TICKS(1));
  40. gpio_set_level(dev->int_pin, 0);
  41. vTaskDelay(pdMS_TO_TICKS(1));
  42. }
  43. // Initialize touch
  44. uint8_t data = 0xFF;
  45. i2c_master_write_to_device(dev->i2c_port, I2C_ADDR_CST816D, &data, 1, pdMS_TO_TICKS(1000));
  46. printf("init touch\n");
  47. }
  48. bool CST816D_getTouch(CST816D_t *dev, uint16_t *x, uint16_t *y, uint8_t *gesture) {
  49. uint8_t FingerIndex = 0;
  50. uint8_t reg1=0x02;
  51. mpu9250_register_read(0x02,&FingerIndex,1);
  52. FingerIndex = (bool)FingerIndex;
  53. // uint8_t *gesture = NULL;
  54. mpu9250_register_read(0x01,gesture,1);
  55. if (!(*gesture == SlideUp || *gesture == SlideDown))
  56. {
  57. *gesture = None;
  58. }
  59. uint8_t data[4];
  60. mpu9250_register_read(0x03,data,4);
  61. *x = ((data[0] & 0x0f) << 8) | data[1];
  62. printf("x: %d\n",*x);
  63. *y = ((data[2] & 0x0f) << 8) | data[3];
  64. printf("y: %d\n",*y);
  65. return FingerIndex;
  66. // uint8_t data[4];
  67. // uint8_t gesture_val = 0;
  68. // // printf("get touch\n");
  69. // // Read gesture
  70. // i2c_master_read_from_device(dev->i2c_port, I2C_ADDR_CST816D, &gesture_val, 1, pdMS_TO_TICKS(1000));
  71. // *gesture = gesture_val;
  72. // // Read touch coordinates
  73. // i2c_master_read_from_device(dev->i2c_port, I2C_ADDR_CST816D, data, 4, pdMS_TO_TICKS(1000));
  74. // *x = ((data[0] & 0x0F) << 8) | data[1];
  75. // *y = ((data[2] & 0x0F) << 8) | data[3];
  76. // return (*gesture != None);
  77. }