main.cpp 2.9 KB

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