ADS1256_soft.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #ifndef __ADS1256_SOFT_H__
  2. #define __ADS1256_SOFT_H__
  3. #include "stm32l4xx_hal.h"
  4. #include <stdint.h>
  5. #include <stdbool.h>
  6. // ========== 用户配置宏 ==========
  7. #define ADS1256_SPI_HANDLE hspi2
  8. //extern SPI_HandleTypeDef ADS1256_SPI_HANDLE;
  9. #define SPI_TIMEOUT 300 // ms
  10. // 引脚配置
  11. // 软件SPI引脚定义
  12. #define SOFT_SPI_SCK_PORT GPIOB
  13. #define SOFT_SPI_SCK_PIN GPIO_PIN_13
  14. #define SOFT_SPI_MOSI_PORT GPIOB
  15. #define SOFT_SPI_MOSI_PIN GPIO_PIN_15
  16. #define SOFT_SPI_MISO_PORT GPIOB
  17. #define SOFT_SPI_MISO_PIN GPIO_PIN_14
  18. // GPIO操作宏
  19. #define SOFT_SPI_SCK_HIGH() HAL_GPIO_WritePin(SOFT_SPI_SCK_PORT, SOFT_SPI_SCK_PIN, GPIO_PIN_SET)
  20. #define SOFT_SPI_SCK_LOW() HAL_GPIO_WritePin(SOFT_SPI_SCK_PORT, SOFT_SPI_SCK_PIN, GPIO_PIN_RESET)
  21. #define SOFT_SPI_MOSI_HIGH() HAL_GPIO_WritePin(SOFT_SPI_MOSI_PORT, SOFT_SPI_MOSI_PIN, GPIO_PIN_SET)
  22. #define SOFT_SPI_MOSI_LOW() HAL_GPIO_WritePin(SOFT_SPI_MOSI_PORT, SOFT_SPI_MOSI_PIN, GPIO_PIN_RESET)
  23. #define SOFT_SPI_MISO_READ() HAL_GPIO_ReadPin(SOFT_SPI_MISO_PORT, SOFT_SPI_MISO_PIN)
  24. #define ADS1256_CS_GPIO_PORT GPIOB
  25. #define ADS1256_CS_PIN GPIO_PIN_12
  26. #define ADS1256_DRDY_GPIO_PORT GPIOA
  27. #define ADS1256_DRDY_PIN GPIO_PIN_11
  28. #define ADS1256_RST_GPIO_PORT GPIOA
  29. #define ADS1256_RST_PIN GPIO_PIN_8
  30. // ========== 控制宏 ==========
  31. #define ADS1256_CS_LOW() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_RESET)
  32. #define ADS1256_CS_HIGH() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_SET)
  33. #define ADS1256_RST_LOW() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_RESET)
  34. #define ADS1256_RST_HIGH() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_SET)
  35. #define ADS1256_DRDY_READ() HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)
  36. #define ADS1256_READ_DRDY ADS1256_DRDY_READ()
  37. // ========== 命令定义 ==========
  38. #define ADS1256_CMD_WAKEUP 0x00 // 从休眠模式唤醒(必须在 SYNC 后使用)退出待机模式
  39. #define ADS1256_CMD_RDATA 0x01 // 读取数据(一次性读取当前结果)
  40. #define ADS1256_CMD_RDATAC 0x03 // 启动连续数据读取模式
  41. #define ADS1256_CMD_SDATAC 0x0F // 停止连续数据读取模式
  42. #define ADS1256_CMD_RREG 0x10 // 读取寄存器命令(后跟寄存器地址和数量)
  43. #define ADS1256_CMD_WREG 0x50 // 写寄存器命令(后跟寄存器地址和数量)
  44. #define ADS1256_CMD_SELFCAL 0xF0 // 启动偏移和增益自动校准
  45. #define ADS1256_CMD_SELFOCAL 0xF1 // 偏移自校准(接 GND)
  46. #define ADS1256_CMD_SELFGCAL 0xF2 // 增益自校准(接参考电压)
  47. #define ADS1256_CMD_SYSOCAL 0xF3 // 系统偏移校准
  48. #define ADS1256_CMD_SYSGCAL 0xF4 // 系统增益校准
  49. #define ADS1256_CMD_SYNC 0xFC // 同步命令(等待转换)
  50. #define ADS1256_CMD_STANDBY 0xFD // 进入低功耗待机模式
  51. #define ADS1256_CMD_RESET 0xFE // 复位芯片
  52. // ========== 寄存器定义 ==========
  53. #define ADS1256_REG_STATUS 0x00 // 状态寄存器:时钟选择、自动校准、缓冲使能等
  54. #define ADS1256_REG_MUX 0x01 // 多路复用器设置:选择输入通道 AINp 和 AINn
  55. #define ADS1256_REG_ADCON 0x02 // A/D 控制寄存器:增益选择、时钟配置
  56. #define ADS1256_REG_DRATE 0x03 // 数据速率设置寄存器
  57. #define ADS1256_REG_IO 0x04 // 数字 I/O 控制寄存器
  58. #define ADS1256_REG_OFC0 0x05 // 偏移校准寄存器 OFC0(低字节)
  59. #define ADS1256_REG_OFC1 0x06 // 偏移校准寄存器 OFC1
  60. #define ADS1256_REG_OFC2 0x07 // 偏移校准寄存器 OFC2(高字节)
  61. #define ADS1256_REG_FSC0 0x08 // 全量程校准寄存器 FSC0(低字节)
  62. #define ADS1256_REG_FSC1 0x09 // 全量程校准寄存器 FSC1
  63. #define ADS1256_REG_FSC2 0x0A // 全量程校准寄存器 FSC2(高字节)
  64. // ========== 单端输入通道配置 (AINx - AINCOM) ==========
  65. #define ADS1256_MUX_AIN0_AINCOM 0x08 // AIN0 - AINCOM
  66. #define ADS1256_MUX_AIN1_AINCOM 0x18 // AIN1 - AINCOM
  67. #define ADS1256_MUX_AIN2_AINCOM 0x28 // AIN2 - AINCOM
  68. #define ADS1256_MUX_AIN3_AINCOM 0x38 // AIN3 - AINCOM
  69. #define ADS1256_MUX_AIN4_AINCOM 0x48 // AIN4 - AINCOM
  70. #define ADS1256_MUX_AIN5_AINCOM 0x58 // AIN5 - AINCOM
  71. #define ADS1256_MUX_AIN6_AINCOM 0x68 // AIN6 - AINCOM
  72. #define ADS1256_MUX_AIN7_AINCOM 0x78 // AIN7 - AINCOM
  73. // ========== 差分输入通道配置 (AINp - AINn) ==========
  74. #define ADS1256_MUX_AIN0_AIN1 0x01 // AIN0 - AIN1
  75. #define ADS1256_MUX_AIN2_AIN3 0x23 // AIN2 - AIN3
  76. #define ADS1256_MUX_AIN4_AIN5 0x45 // AIN4 - AIN5
  77. #define ADS1256_MUX_AIN6_AIN7 0x67 // AIN6 - AIN7
  78. // ========== 增益配置 ==========
  79. typedef enum {
  80. ADS1256_GAIN_1 = 0, // 增益 x1(默认)
  81. ADS1256_GAIN_2, // 增益 x2
  82. ADS1256_GAIN_4, // 增益 x4
  83. ADS1256_GAIN_8, // 增益 x8
  84. ADS1256_GAIN_16, // 增益 x16
  85. ADS1256_GAIN_32, // 增益 x32
  86. ADS1256_GAIN_64 // 增益 x64(最大)
  87. } ADS1256_Gain_t;
  88. // ========== 数据速率 ==========
  89. typedef enum {
  90. ADS1256_DR_30000SPS = 0xF0, // 30000 采样/秒
  91. ADS1256_DR_15000SPS = 0xE0, // 15000
  92. ADS1256_DR_7500SPS = 0xD0, // 7500
  93. ADS1256_DR_3750SPS = 0xC0, // 3750
  94. ADS1256_DR_2000SPS = 0xB0, // 2000
  95. ADS1256_DR_1000SPS = 0xA1, // 1000(推荐默认)
  96. ADS1256_DR_500SPS = 0x92, // 500
  97. ADS1256_DR_100SPS = 0x82, // 100
  98. ADS1256_DR_60SPS = 0x72, // 60
  99. ADS1256_DR_50SPS = 0x63, // 50
  100. ADS1256_DR_30SPS = 0x53, // 30
  101. ADS1256_DR_25SPS = 0x43, // 25
  102. ADS1256_DR_15SPS = 0x33, // 15
  103. ADS1256_DR_10SPS = 0x23, // 10
  104. ADS1256_DR_5SPS = 0x13, // 5
  105. ADS1256_DR_2_5SPS = 0x03 // 2.5(最低速)
  106. } ADS1256_DataRate_t;
  107. // ========== 函数声明 ==========
  108. /*
  109. 单端模式:MUX = (AINx << 4) | 0x08
  110. 差分模式:MUX = (AINp << 4) | AINn
  111. AINCOM 是固定的参考负端引脚(接地或参考电压
  112. 单端输入:
  113. AIN0 0x08 AIN0 - AINCOM
  114. AIN1 0x18 AIN1 - AINCOM
  115. AIN2 0x28 AIN2 - AINCOM
  116. AIN3 0x38 AIN3 - AINCOM
  117. AIN4 0x48 AIN4 - AINCOM
  118. AIN5 0x58 AIN5 - AINCOM
  119. AIN6 0x68 AIN6 - AINCOM
  120. AIN7 0x78 AIN7 - AINCOM
  121. 差分输入:
  122. 0x01 AIN0 - AIN1
  123. 0x23 AIN2 - AIN3
  124. 0x45 AIN4 - AIN5
  125. 0x67 AIN6 - AIN7
  126. */
  127. // 软件SPI发送单字节(模式0,CPOL=0, CPHA=0)
  128. static void SoftSPI_WriteByte(uint8_t data);
  129. // 软件SPI接收单字节
  130. static uint8_t SoftSPI_ReadByte(void) ;
  131. // 初始化 ADS1256
  132. void ADS1256_Init(void);
  133. // 复位
  134. void ADS1256_Reset(void);
  135. // 读取芯片 ID(高 4 位)
  136. uint8_t ADS1256_ReadID(void);
  137. // 设置输入通道(MUX 寄存器值)
  138. void ADS1256_SetChannel(uint8_t mux);
  139. // 设置增益
  140. void ADS1256_SetGain(ADS1256_Gain_t gain);
  141. // 设置采样率
  142. void ADS1256_SetDataRate(ADS1256_DataRate_t dr);
  143. // 启动一次转换
  144. void ADS1256_StartConversion(void);
  145. // 读取数据(需判断 DRDY 是否为低)
  146. bool ADS1256_ReadData(int32_t* out);
  147. // 寄存器读取出来的整数转为浮点数电压值
  148. float ADS1256_ConvertToVoltage(int32_t raw, float vref, int gain);
  149. // 寄存器操作
  150. uint8_t ADS1256_ReadRegister(uint8_t reg);
  151. void ADS1256_WriteRegister(uint8_t reg, uint8_t value);
  152. void ADS1256_SetClockSource(uint8_t useInternal);
  153. bool ADS1256_IsUsingExternalClock(void);
  154. #endif // __ADS1256_H__