You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
8.2 KiB

  1. #if 0
  2. #define ADS1293_SPI_SCK_PIN (32 + 9)
  3. #define ADS1293_SPI_MOSI_PIN 15
  4. #define ADS1293_SPI_MISO_PIN 20
  5. #define ADS1293_SPI_CS0_PIN 3
  6. #define ADS1293_SPI_CS1_PIN 29
  7. #define ADS1293_READY_PIN 31
  8. #define LINE_DET_PIN 10
  9. #include "board/ads_cfg.h"
  10. /*******************************************************************************
  11. * 3-ADS1293- *
  12. *******************************************************************************/
  13. APP_TIMER_DEF(m_init_tmr);
  14. APP_TIMER_DEF(m_report_tmr);
  15. ZDATACHANNEL_DEF(m_zhrs, 2 /**/, 1 /*client num*/);
  16. static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(2); /**< SPI instance. */
  17. static ads1293_t m_ads1293_0; // U2
  18. // static ads1293_t m_ads1293_1; // U3
  19. static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt);
  20. static void on_service_init(void);
  21. static void zdatachanel_send_log(const char* fmt, ...);
  22. static void three_lead_ecg_ecg_init();
  23. uint32_t get_ready_pin_state_get() { return nrf_gpio_pin_read(ADS1293_READY_PIN); }
  24. static void m_report_tmr_cb(void* p_context) {
  25. static int id = 0;
  26. id++;
  27. #if 0
  28. uint8_t leadoffstate = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_ERROR_LOD_REG);
  29. zdatachanel_send_log("%d%d%d%d_%d%d%d%d\n", //
  30. leadoffstate >> 7 & 0x1, leadoffstate >> 6 & 0x1, leadoffstate >> 5 & 0x1, leadoffstate >> 4 & 0x1, //
  31. leadoffstate >> 3 & 0x1, leadoffstate >> 2 & 0x1, leadoffstate >> 1 & 0x1, leadoffstate >> 0 & 0x1); //
  32. #endif
  33. #if 0
  34. uint8_t state = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_CONFIG_REG);
  35. zdatachanel_send_log("ads_%d config:%x\n", m_ads1293_0.id, state);
  36. #endif
  37. static bool state = false;
  38. bool now = get_ready_pin_state_get();
  39. if (state != now) {
  40. state = now;
  41. zdatachanel_send_log("%d\n", now);
  42. }
  43. // zdatachanel_send_log("%d\n", id);
  44. }
  45. static void init_tmr_cb(void* p_context) {
  46. nrf_gpio_cfg_input(LINE_DET_PIN, NRF_GPIO_PIN_PULLUP);
  47. three_lead_ecg_ecg_init();
  48. ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0x01);
  49. nrf_delay_ms(1000);
  50. ZERROR_CHECK(app_timer_start(m_report_tmr, APP_TIMER_TICKS(1), NULL));
  51. }
  52. int main() {
  53. APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
  54. znordic_init();
  55. NRF_LOG_INFO("compile time :%s", __TIME__);
  56. static zble_module_cfg_t cfg = //
  57. {
  58. .deviceName = "ThreeLeadECG",
  59. .on_service_init = on_service_init,
  60. };
  61. zble_module_init(&cfg);
  62. zble_module_start_adv();
  63. ZERROR_CHECK(app_timer_create(&m_init_tmr, APP_TIMER_MODE_SINGLE_SHOT, init_tmr_cb));
  64. ZERROR_CHECK(app_timer_start(m_init_tmr, APP_TIMER_TICKS(3000), NULL));
  65. ZERROR_CHECK(app_timer_create(&m_report_tmr, APP_TIMER_MODE_REPEATED, m_report_tmr_cb));
  66. znordic_loop();
  67. }
  68. /*******************************************************************************
  69. * UTILS *
  70. *******************************************************************************/
  71. /*******************************************************************************
  72. * CODE *
  73. *******************************************************************************/
  74. static void ads1293_spi_tx_rx_0(uint8_t* tx, uint8_t* rx, uint8_t len) {
  75. nrf_gpio_pin_clear(ADS1293_SPI_CS0_PIN);
  76. nrf_drv_spi_transfer(&spi, tx, len, rx, len);
  77. nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
  78. }
  79. static void ads1293_spi_tx_rx_1(uint8_t* tx, uint8_t* rx, uint8_t len) {
  80. nrf_gpio_pin_clear(ADS1293_SPI_CS1_PIN);
  81. nrf_drv_spi_transfer(&spi, tx, len, rx, len);
  82. nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
  83. }
  84. static void ads1293_spi_writereg_and_check(ads1293_t* ads, uint8_t addr, uint8_t data) {
  85. uint8_t readbak = 0;
  86. // readonly add
  87. if (addr == 0x19 || addr == 0x1a || addr == 0x1b || addr == 0x1c || addr == 0x40 || addr == 0x30) {
  88. return;
  89. }
  90. ads1293_spi_writereg_and_readbak(ads, addr, data, &readbak);
  91. if (readbak != data) {
  92. zdatachanel_send_log("ads_%d write %x failed,w:%x readbak:%x\n", ads->id, addr, data, readbak);
  93. }
  94. }
  95. static adscfg_t prvads0cfg[] = {
  96. {0x00, 0x00}, //
  97. {0x01, 0x0a}, //
  98. {0x02, 0x1a}, //
  99. {0x03, 0x00}, //
  100. {0x04, 0x00}, //
  101. {0x05, 0x00}, //
  102. {0x06, 0x04}, //
  103. {0x07, 0x0f}, //
  104. {0x08, 0xff}, //
  105. {0x09, 0x00}, //
  106. {0x0a, 0x07}, //
  107. {0x0b, 0x00}, //
  108. {0x0c, 0x04}, //
  109. {0x0d, 0x00}, //
  110. {0x0e, 0x00}, //
  111. {0x0f, 0x00}, //
  112. {0x10, 0x00}, //
  113. {0x11, 0x00}, //
  114. {0x12, 0x04}, //
  115. {0x13, 0x00}, //
  116. {0x14, 0x00}, //
  117. {0x15, 0x00}, //
  118. {0x16, 0x00}, //
  119. {0x17, 0x05}, //
  120. {0x18, 0x00}, //
  121. {0x19, 0x00}, //
  122. {0x1a, 0x00}, //
  123. {0x1b, 0x00}, //
  124. {0x1c, 0x00}, //
  125. {0x1d, 0x00}, //
  126. {0x21, 0x02}, //
  127. {0x22, 0x02}, //
  128. {0x23, 0x02}, //
  129. {0x24, 0x02}, //
  130. {0x25, 0x00}, //
  131. {0x26, 0x00}, //
  132. {0x27, 0x08}, //
  133. {0x28, 0x00}, //
  134. {0x29, 0x00}, //
  135. {0x2a, 0x00}, //
  136. {0x2b, 0x00}, //
  137. {0x2c, 0x00}, //
  138. {0x2d, 0x00}, //
  139. {0x2e, 0x33}, //
  140. {0x2f, 0x30}, //
  141. {0x30, 0x00}, //
  142. {0x31, 0x00}, //
  143. {0x32, 0x00}, //
  144. {0x33, 0x00}, //
  145. {0x34, 0x00}, //
  146. {0x35, 0x00}, //
  147. {0x36, 0x00}, //
  148. {0x37, 0x00}, //
  149. {0x38, 0x00}, //
  150. {0x39, 0x00}, //
  151. {0x3a, 0x00}, //
  152. {0x3b, 0x00}, //
  153. {0x3c, 0x00}, //
  154. {0x3d, 0x00}, //
  155. {0x3e, 0x00}, //
  156. {0x3f, 0x00}, //
  157. {0x40, 0xff}, //
  158. {0x50, 0x00}, //
  159. {0x60, 0x00}, //
  160. {0x62, 0x00}, //
  161. };
  162. void three_lead_ecg_ecg_init() {
  163. nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
  164. spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED; // NRF_DRV_SPI_PIN_NOT_USED
  165. spi_config.miso_pin = ADS1293_SPI_MISO_PIN;
  166. spi_config.mosi_pin = ADS1293_SPI_MOSI_PIN;
  167. spi_config.sck_pin = ADS1293_SPI_SCK_PIN;
  168. spi_config.frequency = NRF_DRV_SPI_FREQ_8M;
  169. spi_config.mode = NRF_DRV_SPI_MODE_3;
  170. // spi_config.mode =
  171. ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
  172. znrf_gpio_cfg_output(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL);
  173. znrf_gpio_cfg_output(ADS1293_SPI_CS1_PIN, NRF_GPIO_PIN_NOPULL);
  174. nrf_gpio_cfg_input(ADS1293_READY_PIN, NRF_GPIO_PIN_PULLUP);
  175. nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
  176. nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
  177. m_ads1293_0.spi_tx_rx = ads1293_spi_tx_rx_0;
  178. m_ads1293_0.id = 0;
  179. // m_ads1293_1.spi_tx_rx = ads1293_spi_tx_rx_1;
  180. // m_ads1293_1.id = 1;
  181. ads1293_spi_init(&m_ads1293_0, ads1293_spi_tx_rx_0);
  182. // ads1293_spi_init(&m_ads1293_1, ads1293_spi_tx_rx_1);
  183. uint8_t revid = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_REVID_REG);
  184. zdatachanel_send_log("ads1293_0 revid: %d\n", revid);
  185. // revid = ads1293_spi_readreg(&m_ads1293_1, TI_ADS1293_REVID_REG);
  186. // zdatachanel_send_log("ads1293_1 revid: %d\n", revid);
  187. zdatachanel_send_log("reset ads1293_0\n");
  188. ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0);
  189. nrf_delay_ms(1000);
  190. for (uint16_t i = 0; i < ZARRAY_SIZE(prvads0cfg); i++) {
  191. ads1293_spi_writereg_and_check(&m_ads1293_0, prvads0cfg[i].add, prvads0cfg[i].data);
  192. zdatachanel_send_log("[%d]ads1293_0 write %x:%x\n", i, prvads0cfg[i].add, prvads0cfg[i].data);
  193. }
  194. // for (uint16_t i = 0; i < ZARRAY_SIZE(ads1cfg); i++) {
  195. // ads1293_spi_writereg_and_check(&m_ads1293_1, ads1cfg[i].add, ads1cfg[i].data);
  196. // }
  197. // ads1293_spi_writereg(&m_ads1293_1, TI_ADS1293_CONFIG_REG, 0x01);
  198. }
  199. static void zdatachanel_send_log(const char* fmt, ...) {
  200. static char tx[256] = {0};
  201. static uint16_t len = 0;
  202. va_list args;
  203. va_start(args, fmt);
  204. len = vsprintf(tx, fmt, args);
  205. int ret;
  206. do {
  207. ret = zdatachannel_data_send((uint8_t*)tx, &len);
  208. } while (ret != 0);
  209. va_end(args);
  210. }
  211. static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) {}
  212. static void on_service_init(void) {
  213. ZLOGI("init zdatachannel service");
  214. zdatachannel_init_t zdatachannle_init;
  215. memset(&zdatachannle_init, 0, sizeof(zdatachannle_init));
  216. zdatachannle_init.data_handler = zdatachannel_data_handler;
  217. ZERROR_CHECK(zdatachannel_init(&m_zhrs, &zdatachannle_init));
  218. }
  219. #endif