SIM800 : make a voice call and listen DTMF

Hello,
I would like to make a voice call with a SIM800L GSM module, and do actions depending on the DTMF code received.
I have found many examples of sketches which answer incoming calls, but I fail writting a piece of code for making a call.
Here is what I tried, inspired of http://cassiopeia.hk/arduino-dtmf/

/*
SIM800L gsm module with Arduino UNO on 5V usb
Tom Tobback Feb 2015
http://cassiopeia.hk/arduino-dtmf/
*/

#include <SoftwareSerial.h>
SoftwareSerial sim800(8, 7);

int current_status;
boolean appel_done = false;

void setup() {
   Serial.begin(9600);
   sim800.begin(9600);
   simInit();
} 

void loop() {
   if (!appel_done) {
      sim800.println("ATD06xxxxxxx;");
      appel_done = true;
   }
   
   current_status = checkStatus();

   if (current_status == 0) {
      Serial.println("waiting for call");
   } else {
      if (current_status == 4) { // in call after auto answer
         Serial.println("Appel en cours");

         int DTMF = checkDTMF();
         if (DTMF > 0) { // -255 if nothing received
            Serial.print("received DTMF: ");
            Serial.println(DTMF);

            switch (DTMF) {
               case 8:
                  sim800.println("ATH");
                  break;
            }
         }
      }
   }
}

boolean simInit() { // SIM CHECK OK
   delay(1000); // wait for sim800 to settle a bit

   sim800.println("AT+CBC"); // battery level
   simReply();
   sim800.println("AT+CLVL=80"); // set speaker volume 0-100
   simReply();
   sim800.println("AT+CRSL=80"); // set ringer volume 0-100
   simReply();
   sim800.println("AT+CMIC=0,10"); // set mic to gain level 0-15
   simReply();
   sim800.println("AT+CALS=19"); // set alert/ring tone
   simReply();
   sim800.println("ATS0=1"); // automatically answer call after 1 ring
   simReply();
   sim800.println("AT+DDET=1,1000,0,0"); // activate DMTF decoding
   simReply();
}

void simReply() { // SIM REPLY
   delay(500);
   while (sim800.available()) {
      char c = sim800.read();
      if (c != '\n') Serial.write(c); // replace new line with space
      else Serial.print(" ");
      delay(5);
   }
   Serial.println();
}

void simFlush() {
   while (sim800.available()) sim800.read();
}

int checkStatus() { // CHECK STATUS FOR RINGING or IN CALL
   sim800.println("AT+CPAS"); // phone activity status: 0= ready, 2= unknown, 3= ringing, 4= in call
   delay(100);
   if (sim800.find("+CPAS: ")) { // decode reply
      char c = sim800.read(); // gives ascii code for status number
   // simReply(); // should give ‘OK’ in Serial Monitor
      return c - 48; // return integer value of ascii code
   }
   else return -1;
}

int checkDTMF() {
   if (sim800.find("+DTMF:")) {
      return sim800.parseInt();
      simFlush();
   }
}

The call is placed, but no DTMF code is shown and the module hangs up after a few seconds (without pressing 8).
Would you please help to sort this out?

https://www.raviyp.com/embedded/191-sim900-dtmf-commands