main.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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ドライバ
  15. ADC_Driver adcd;
  16. typedef union {
  17. uint16_t d;
  18. uint8_t b[2];
  19. } I2C_WORD_t;
  20. static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
  21. {
  22. static uint8_t ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  23. switch(event) {
  24. // I2Cデータ受信
  25. case I2C_SLAVE_RECEIVE:
  26. if(ADRS2040U_cmd == ADRS2040_CMD_INVALID) {
  27. ADRS2040U_cmd = i2c_read_byte_raw(i2c);
  28. }
  29. if(ADRS2040U_cmd == ADRS2040_CMD_ADC_START) {
  30. DEBUG_PRINT("ADC START\n");
  31. adcd.run(true);
  32. ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  33. }
  34. else if(ADRS2040U_cmd == ADRS2040_CMD_ADC_STOP) {
  35. DEBUG_PRINT("ADC START\n");
  36. adcd.run(false);
  37. ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  38. }
  39. else if(ADRS2040U_cmd == ADRS2040_CMD_SET_RATE) {
  40. I2C_WORD_t rate;
  41. i2c_read_raw_blocking(i2c, rate.b, sizeof(I2C_WORD_t));
  42. DEBUG_PRINT("Rate = %d\n", rate.d * 10);
  43. adcd.set_sample_rate(rate.d * 10);
  44. ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  45. }
  46. break;
  47. // I2Cデータ要求
  48. case I2C_SLAVE_REQUEST:
  49. I2C_WORD_t sdata;
  50. sdata.d = 0;
  51. if(ADRS2040U_cmd == ADRS2040_CMD_GET_COUNT) {
  52. sdata.d = adcd.count();
  53. }
  54. else if(ADRS2040U_cmd == ADRS2040_CMD_GET_VALUE) {
  55. int value = adcd.get_value();
  56. if( value >= 0) {
  57. sdata.d = value & 0xFFF;
  58. }
  59. else {
  60. sdata.d = 0xFFFF;
  61. }
  62. }
  63. i2c_write_raw_blocking(i2c, sdata.b, sizeof(I2C_WORD_t));
  64. ADRS2040U_cmd = ADRS2040_CMD_INVALID;
  65. break;
  66. // STOP or RESTARTコンデション
  67. case I2C_SLAVE_FINISH:
  68. break;
  69. default:
  70. break;
  71. }
  72. }
  73. void i2c_setup(void)
  74. {
  75. i2c_init(i2c0, 100 * 1000);
  76. gpio_set_function(GPIO_SDA0, GPIO_FUNC_I2C);
  77. gpio_set_function(GPIO_SCK0, GPIO_FUNC_I2C);
  78. // ADRS2040Uでは基板上でプルアップされているので
  79. // プルアップを無効化する
  80. gpio_disable_pulls(GPIO_SDA0);
  81. gpio_disable_pulls(GPIO_SCK0);
  82. // プルアップする場合は以下の通り
  83. // gpio_pull_up(GPIO_SDA0);
  84. // gpio_pull_up(GPIO_SCK0);
  85. // I2Cスレーブ初期化
  86. i2c_slave_init(i2c0, I2C0_SLAVE_ADDR, &i2c_slave_handler);
  87. }
  88. int main(void)
  89. {
  90. stdio_init_all();
  91. i2c_setup();
  92. while (true)
  93. {
  94. ;
  95. }
  96. }