main.cpp 3.0 KB

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