main.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <stdio.h>
  2. #include <pico/stdlib.h>
  3. #include "hardware/i2c.h"
  4. #include "pico/i2c_slave.h"
  5. #include "hardware/irq.h"
  6. #include "hardware/spi.h"
  7. #include "pico/binary_info.h"
  8. #include "pico/multicore.h"
  9. #include "hardware/irq.h"
  10. #include "hardware/adc.h"
  11. #include "hardware/clocks.h"
  12. #include "ADRS2040U_i2c.h"
  13. #include "adc_driver.hpp"
  14. ADC_Driver adcd;
  15. static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
  16. {
  17. static uint8_t ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  18. uint8_t raw_data;
  19. switch(event) {
  20. case I2C_SLAVE_RECEIVE:
  21. raw_data = i2c_read_byte_raw(i2c);
  22. if(ADRS2040U_cmd == ADRS2040_CMD_INVALID) {
  23. ADRS2040U_cmd = raw_data;
  24. }
  25. break;
  26. case I2C_SLAVE_REQUEST:
  27. DEBUG_PRINT("I2C_SLAVE_REQUEST\n");
  28. if(ADRS2040U_cmd == ADRS2040_CMD_GET_COUNT) {
  29. i2c_write_byte_raw(i2c,adcd.count());
  30. }
  31. else
  32. i2c_write_byte_raw(i2c, 0);
  33. break;
  34. case I2C_SLAVE_FINISH:
  35. ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  36. break;
  37. default:
  38. break;
  39. }
  40. }
  41. void i2c_setup(void)
  42. {
  43. i2c_init(i2c0, 100 * 1000);
  44. gpio_set_function(GPIO_SDA0, GPIO_FUNC_I2C);
  45. gpio_set_function(GPIO_SCK0, GPIO_FUNC_I2C);
  46. // ADRS2040Uでは基板上でプルアップされているので
  47. // プルアップを無効化する
  48. gpio_disable_pulls(GPIO_SDA0);
  49. gpio_disable_pulls(GPIO_SCK0);
  50. // プルアップする場合は以下の通り
  51. // gpio_pull_up(GPIO_SDA0);
  52. // gpio_pull_up(GPIO_SCK0);
  53. i2c_slave_init(i2c0, I2C0_SLAVE_ADDR, &i2c_slave_handler);
  54. }
  55. int main(void)
  56. {
  57. stdio_init_all();
  58. while (true)
  59. {
  60. ;
  61. }
  62. }