1+ #include " esp32_adc_driver.h"
2+
3+ #if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32) && defined(SOC_MCPWM_SUPPORTED) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3))
4+
5+ #include " freertos/FreeRTOS.h"
6+ #include " freertos/task.h"
7+ #include " rom/ets_sys.h"
8+ #include " esp_attr.h"
9+ #include " esp_intr.h"
10+ #include " soc/rtc_io_reg.h"
11+ #include " soc/rtc_cntl_reg.h"
12+ #include " soc/sens_reg.h"
13+
14+ static uint8_t __analogAttenuation = 3 ;// 11db
15+ static uint8_t __analogWidth = 3 ;// 12 bits
16+ static uint8_t __analogCycles = 8 ;
17+ static uint8_t __analogSamples = 0 ;// 1 sample
18+ static uint8_t __analogClockDiv = 1 ;
19+
20+ // Width of returned answer ()
21+ static uint8_t __analogReturnedWidth = 12 ;
22+
23+ void __analogSetWidth (uint8_t bits){
24+ if (bits < 9 ){
25+ bits = 9 ;
26+ } else if (bits > 12 ){
27+ bits = 12 ;
28+ }
29+ __analogReturnedWidth = bits;
30+ __analogWidth = bits - 9 ;
31+ // SET_PERI_REG_BITS(SENS_SAR_START_FORCE_REG, SENS_SAR1_BIT_WIDTH, __analogWidth, SENS_SAR1_BIT_WIDTH_S);
32+ // SET_PERI_REG_BITS(SENS_SAR_READER1_CTRL_REG, SENS_SAR1_SAMPLE_BIT, __analogWidth, SENS_SAR1_SAMPLE_BIT_S);
33+
34+ // SET_PERI_REG_BITS(SENS_SAR_START_FORCE_REG, SENS_SAR2_BIT_WIDTH, __analogWidth, SENS_SAR2_BIT_WIDTH_S);
35+ // SET_PERI_REG_BITS(SENS_SAR_READER2_CTRL_REG, SENS_SAR2_SAMPLE_BIT, __analogWidth, SENS_SAR2_SAMPLE_BIT_S);
36+ }
37+
38+ void __analogSetCycles (uint8_t cycles){
39+ __analogCycles = cycles;
40+ // SET_PERI_REG_BITS(SENS_SAR_READER1_CTRL_REG, SENS_SAR1_SAMPLE_CYCLE, __analogCycles, SENS_SAR1_SAMPLE_CYCLE_S);
41+ // SET_PERI_REG_BITS(SENS_SAR_READER2_CTRL_REG, SENS_SAR2_SAMPLE_CYCLE, __analogCycles, SENS_SAR2_SAMPLE_CYCLE_S);
42+ }
43+
44+ void __analogSetSamples (uint8_t samples){
45+ if (!samples){
46+ return ;
47+ }
48+ __analogSamples = samples - 1 ;
49+ SET_PERI_REG_BITS (SENS_SAR_READER1_CTRL_REG, SENS_SAR1_SAMPLE_NUM, __analogSamples, SENS_SAR1_SAMPLE_NUM_S);
50+ SET_PERI_REG_BITS (SENS_SAR_READER2_CTRL_REG, SENS_SAR2_SAMPLE_NUM, __analogSamples, SENS_SAR2_SAMPLE_NUM_S);
51+ }
52+
53+ void __analogSetClockDiv (uint8_t clockDiv){
54+ if (!clockDiv){
55+ return ;
56+ }
57+ __analogClockDiv = clockDiv;
58+ SET_PERI_REG_BITS (SENS_SAR_READER1_CTRL_REG, SENS_SAR1_CLK_DIV, __analogClockDiv, SENS_SAR1_CLK_DIV_S);
59+ SET_PERI_REG_BITS (SENS_SAR_READER2_CTRL_REG, SENS_SAR2_CLK_DIV, __analogClockDiv, SENS_SAR2_CLK_DIV_S);
60+ }
61+
62+ void __analogSetAttenuation (uint8_t attenuation)
63+ {
64+ __analogAttenuation = attenuation & 3 ;
65+ uint32_t att_data = 0 ;
66+ int i = 10 ;
67+ while (i--){
68+ att_data |= __analogAttenuation << (i * 2 );
69+ }
70+ WRITE_PERI_REG (SENS_SAR_ATTEN1_REG, att_data & 0xFFFF );// ADC1 has 8 channels
71+ WRITE_PERI_REG (SENS_SAR_ATTEN2_REG, att_data);
72+ }
73+
74+ void IRAM_ATTR __analogInit (){
75+ static bool initialized = false ;
76+ if (initialized){
77+ return ;
78+ }
79+
80+ __analogSetAttenuation (__analogAttenuation);
81+ __analogSetCycles (__analogCycles);
82+ __analogSetSamples (__analogSamples + 1 );// in samples
83+ __analogSetClockDiv (__analogClockDiv);
84+ __analogSetWidth (__analogWidth + 9 );// in bits
85+
86+ SET_PERI_REG_MASK (SENS_SAR_READER1_CTRL_REG, SENS_SAR1_DATA_INV);
87+ SET_PERI_REG_MASK (SENS_SAR_READER2_CTRL_REG, SENS_SAR2_DATA_INV);
88+
89+ SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_FORCE_M); // SAR ADC1 controller (in RTC) is started by SW
90+ SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR1_EN_PAD_FORCE_M); // SAR ADC1 pad enable bitmap is controlled by SW
91+ SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_FORCE_M); // SAR ADC2 controller (in RTC) is started by SW
92+ SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_SAR2_EN_PAD_FORCE_M); // SAR ADC2 pad enable bitmap is controlled by SW
93+
94+ CLEAR_PERI_REG_MASK (SENS_SAR_POWER_XPD_SAR_REG, SENS_FORCE_XPD_SAR_M); // force XPD_SAR=0, use XPD_FSM
95+ SET_PERI_REG_BITS (SENS_SAR_POWER_XPD_SAR_REG, SENS_FORCE_XPD_AMP, 0x2 , SENS_FORCE_XPD_AMP_S); // force XPD_AMP=0
96+
97+ CLEAR_PERI_REG_MASK (SENS_SAR_AMP_CTRL3_REG, 0xfff << SENS_AMP_RST_FB_FSM_S); // clear FSM
98+ SET_PERI_REG_BITS (SENS_SAR_AMP_CTRL1_REG, SENS_SAR_AMP_WAIT1, 0x1 , SENS_SAR_AMP_WAIT1_S);
99+ SET_PERI_REG_BITS (SENS_SAR_AMP_CTRL1_REG, SENS_SAR_AMP_WAIT2, 0x1 , SENS_SAR_AMP_WAIT2_S);
100+ SET_PERI_REG_BITS (SENS_SAR_POWER_XPD_SAR_REG, SENS_SAR_AMP_WAIT3, 0x1 , SENS_SAR_AMP_WAIT3_S);
101+ while (GET_PERI_REG_BITS2 (SENS_SAR_SLAVE_ADDR1_REG, 0x7 , SENS_SARADC_MEAS_STATUS_S) != 0 ); // wait det_fsm==
102+
103+ initialized = true ;
104+ }
105+
106+ void __analogSetPinAttenuation (uint8_t pin, uint8_t attenuation)
107+ {
108+ int8_t channel = digitalPinToAnalogChannel (pin);
109+ if (channel < 0 || attenuation > 3 ){
110+ return ;
111+ }
112+ __analogInit ();
113+ if (channel > 7 ){
114+ SET_PERI_REG_BITS (SENS_SAR_ATTEN2_REG, 3 , attenuation, ((channel - 10 ) * 2 ));
115+ } else {
116+ SET_PERI_REG_BITS (SENS_SAR_ATTEN1_REG, 3 , attenuation, (channel * 2 ));
117+ }
118+ }
119+
120+ bool IRAM_ATTR __adcAttachPin (uint8_t pin){
121+
122+ int8_t channel = digitalPinToAnalogChannel (pin);
123+ if (channel < 0 ){
124+ return false ;// not adc pin
125+ }
126+
127+ int8_t pad = digitalPinToTouchChannel (pin);
128+ if (pad >= 0 ){
129+ uint32_t touch = READ_PERI_REG (SENS_SAR_TOUCH_CONF_REG);
130+ if (touch & (1 << pad)){
131+ touch &= ~((1 << (pad + SENS_TOUCH_OUTEN_S)));
132+ WRITE_PERI_REG (SENS_SAR_TOUCH_CONF_REG, touch);
133+ }
134+ } else if (pin == 25 ){
135+ CLEAR_PERI_REG_MASK (RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE); // stop dac1
136+ } else if (pin == 26 ){
137+ CLEAR_PERI_REG_MASK (RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE); // stop dac2
138+ }
139+
140+ pinMode (pin, ANALOG);
141+
142+ __analogInit ();
143+ return true ;
144+ }
145+
146+ bool IRAM_ATTR __adcStart (uint8_t pin){
147+
148+ int8_t channel = digitalPinToAnalogChannel (pin);
149+ if (channel < 0 ){
150+ return false ;// not adc pin
151+ }
152+
153+ if (channel > 9 ){
154+ channel -= 10 ;
155+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
156+ SET_PERI_REG_BITS (SENS_SAR_MEAS2_CTRL2_REG, SENS_SAR2_EN_PAD, (1 << channel), SENS_SAR2_EN_PAD_S);
157+ SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
158+ } else {
159+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
160+ SET_PERI_REG_BITS (SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S);
161+ SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
162+ }
163+ return true ;
164+ }
165+
166+ bool IRAM_ATTR __adcBusy (uint8_t pin){
167+
168+ int8_t channel = digitalPinToAnalogChannel (pin);
169+ if (channel < 0 ){
170+ return false ;// not adc pin
171+ }
172+
173+ if (channel > 7 ){
174+ return (GET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DONE_SAR) == 0 );
175+ }
176+ return (GET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DONE_SAR) == 0 );
177+ }
178+
179+ uint16_t IRAM_ATTR __adcEnd (uint8_t pin)
180+ {
181+
182+ uint16_t value = 0 ;
183+ int8_t channel = digitalPinToAnalogChannel (pin);
184+ if (channel < 0 ){
185+ return 0 ;// not adc pin
186+ }
187+ if (channel > 7 ){
188+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DONE_SAR) == 0 ); // wait for conversion
189+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
190+ } else {
191+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DONE_SAR) == 0 ); // wait for conversion
192+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
193+ }
194+
195+ // Shift result if necessary
196+ uint8_t from = __analogWidth + 9 ;
197+ if (from == __analogReturnedWidth) {
198+ return value;
199+ }
200+ if (from > __analogReturnedWidth) {
201+ return value >> (from - __analogReturnedWidth);
202+ }
203+ return value << (__analogReturnedWidth - from);
204+ }
205+
206+ void __analogReadResolution (uint8_t bits)
207+ {
208+ if (!bits || bits > 16 ){
209+ return ;
210+ }
211+ __analogSetWidth (bits); // hadware from 9 to 12
212+ __analogReturnedWidth = bits; // software from 1 to 16
213+ }
214+
215+ uint16_t IRAM_ATTR adcRead (uint8_t pin)
216+ {
217+ int8_t channel = digitalPinToAnalogChannel (pin);
218+ if (channel < 0 ){
219+ return false ;// not adc pin
220+ }
221+
222+ __analogInit ();
223+
224+ if (channel > 9 ){
225+ channel -= 10 ;
226+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
227+ SET_PERI_REG_BITS (SENS_SAR_MEAS2_CTRL2_REG, SENS_SAR2_EN_PAD, (1 << channel), SENS_SAR2_EN_PAD_S);
228+ SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
229+ } else {
230+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
231+ SET_PERI_REG_BITS (SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S);
232+ SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
233+ }
234+
235+ uint16_t value = 0 ;
236+
237+ if (channel > 7 ){
238+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DONE_SAR) == 0 ); // wait for conversion
239+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
240+ } else {
241+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DONE_SAR) == 0 ); // wait for conversion
242+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
243+ }
244+
245+ // Shift result if necessary
246+ uint8_t from = __analogWidth + 9 ;
247+ if (from == __analogReturnedWidth) {
248+ return value;
249+ }
250+ if (from > __analogReturnedWidth) {
251+ return value >> (from - __analogReturnedWidth);
252+ }
253+ return value << (__analogReturnedWidth - from);
254+ }
255+
256+
257+ #endif
0 commit comments