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.

115 lines
3.4 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. /*
  2. * ADS1293.h
  3. *
  4. * Created on: Jun 6, 2022
  5. * Author: Hans Hüttmann
  6. */
  7. #include "ads1293.h"
  8. #include <stdbool.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. static uint8_t txcache[256];
  12. static uint8_t rxcache[256];
  13. void ads1293_spi_init(ads1293_t* ads, ads1293_spi_tx_rx_t spi_tx_rx) { ads->spi_tx_rx = spi_tx_rx; }
  14. void ads1293_spi_writereg(ads1293_t* ads, uint8_t addr, uint8_t data) {
  15. uint8_t txcache[2];
  16. txcache[0] = ADS1293_WRITE_BIT & addr;
  17. txcache[1] = data;
  18. ads->spi_tx_rx(txcache, NULL, 2);
  19. }
  20. uint8_t ads1293_spi_readreg(ads1293_t* ads, uint8_t addr) {
  21. uint8_t txcache[2];
  22. txcache[0] = ADS1293_READ_BIT | addr;
  23. txcache[1] = 0;
  24. uint8_t rxcache[2];
  25. ads->spi_tx_rx(txcache, rxcache, 2);
  26. return rxcache[1];
  27. }
  28. void ads1293_spi_writereg_and_readbak(ads1293_t* ads, uint8_t addr, uint8_t data, uint8_t* readbak) {
  29. ads1293_spi_writereg(ads, addr, data);
  30. *readbak = ads1293_spi_readreg(ads, addr);
  31. }
  32. void ads1293_spi_autoinc_writereg(ads1293_t* ads, uint8_t addr, uint8_t* data, uint8_t len) { //
  33. len = len > 255 ? 255 : len;
  34. uint8_t addbyte = ADS1293_WRITE_BIT & addr;
  35. txcache[0] = addbyte;
  36. memcpy(txcache + 1, data, len);
  37. ads->spi_tx_rx(txcache, NULL, len + 1);
  38. }
  39. void ads1293_spi_autoinc_readreg(ads1293_t* ads, uint8_t addr, uint8_t* data, uint8_t len) {
  40. len = len > 255 ? 255 : len;
  41. uint8_t addbyte = ADS1293_READ_BIT | addr;
  42. txcache[0] = addbyte;
  43. memset(txcache + 1, 0, len);
  44. ads->spi_tx_rx(txcache, rxcache, len + 1);
  45. memcpy(data, rxcache + 1, len);
  46. }
  47. void ads1293_spi_stream_readreg(ads1293_t* ads, uint8_t* data, uint8_t len) {
  48. len = len > 255 ? 255 : len;
  49. memset(txcache, 0, len);
  50. memset(rxcache, 0, len);
  51. uint8_t addbyte = ADS1293_READ_BIT | TI_ADS1293_DATA_LOOP_REG;
  52. ads->spi_tx_rx(&addbyte, rxcache, len);
  53. memcpy(data, rxcache, len);
  54. }
  55. void ads1293_read_ecg(ads1293_t* ads, uint32_t ch, uint32_t* data) {
  56. uint8_t add = 0;
  57. if (ch == 1) {
  58. add = TI_ADS1293_DATA_CH1_ECG_H_REG;
  59. } else if (ch == 2) {
  60. add = TI_ADS1293_DATA_CH2_ECG_H_REG;
  61. } else if (ch == 3) {
  62. add = TI_ADS1293_DATA_CH3_ECG_H_REG;
  63. } else {
  64. return;
  65. }
  66. uint8_t readbak[3] = {0};
  67. ads1293_spi_autoinc_readreg(ads, add, readbak, 3);
  68. *data = 0;
  69. *data = ((uint32_t)readbak[0] << 16) + ((uint32_t)readbak[1] << 8) + ((uint32_t)readbak[2] << 0);
  70. }
  71. void ads1293_read_ecgs(ads1293_t* ads, uint32_t* data /*3*/) {
  72. uint8_t add = 0;
  73. add = TI_ADS1293_DATA_CH1_ECG_H_REG;
  74. uint8_t readbak[9] = {0};
  75. ads1293_spi_autoinc_readreg(ads, add, readbak, 9);
  76. data[0] = ((uint32_t)readbak[0] << 16) + ((uint32_t)readbak[1] << 8) + ((uint32_t)readbak[2] << 0);
  77. data[1] = ((uint32_t)readbak[3] << 16) + ((uint32_t)readbak[4] << 8) + ((uint32_t)readbak[5] << 0);
  78. data[2] = ((uint32_t)readbak[6] << 16) + ((uint32_t)readbak[7] << 8) + ((uint32_t)readbak[8] << 0);
  79. }
  80. void ads1293_start_conversion(ads1293_t* ads) {
  81. uint8_t data = 0;
  82. data = 0x01;
  83. ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
  84. }
  85. void ads1293_stop_conversion(ads1293_t* ads) {
  86. uint8_t data = 0;
  87. data = 0x04;
  88. ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
  89. }
  90. void ads1293_start_power_off(ads1293_t* ads) {
  91. uint8_t data = 0;
  92. data |= 0x01 << 2;
  93. ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
  94. }
  95. uint8_t ads1293_read_error_lod(ads1293_t* ads) { return ads1293_spi_readreg(ads, TI_ADS1293_ERROR_LOD_REG); }