How to Controll Nuvoton ISD1760 Chip?

//define pins
#define DATAOUT     11   //mosi
#define DATAIN	12   //miso
#define SPICLOCK    13   //sck
#define SLAVESELECT 10   //ss

//opcodes
#define PU	    0x01
#define STOP	  0x02
#define RESET	 0x03
#define CLR_INT     0x04
#define RD_STATUS   0x05
#define RD_PLAY_PTR 0x06
#define PD	    0x07
#define RD_REC_PTR  0x08
#define DEVID	 0x09
#define PLAY	  0x40
#define REC	   0x41
#define REC_LED	   0x51//record with LED on
#define ERASE	 0x42
#define G_ERASE     0x43
#define RD_APC	0x44
#define WR_APC1     0x45
#define WR_APC2     0x65
#define WR_NVCFG    0x46
#define LD_NVCFG    0x47
#define FWD	   0x48
#define CHK_MEM     0x49
#define EXTCLK	0x4A
#define SET_PLAY    0x80
#define SET_REC     0x81
#define SET_REC_LED    0x91//set record with LED on
#define SET_ERASE   0x82

#define WAIT_TIME 10//waiting time (ms) after SS=LOW at least 500ns
#define WAIT_TIME2 100

int start_adress = 0x010;//test address to record
int end_adress = 0x024;//20unit

void setup() {
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK, OUTPUT);
  pinMode(SLAVESELECT, OUTPUT);
  
  initialize();
}

void initialize()
{
   byte clr;
    
  digitalWrite(SLAVESELECT, HIGH); //disable device
  digitalWrite(SPICLOCK, HIGH); //SCLK
  digitalWrite(DATAOUT, LOW); //MOSI
  
  SPCR = B01111111; //data lsb, clock high when idle, samples on falling
  clr = SPSR;
  clr = SPDR;
  delay(10);

  //start serial
  Serial.begin(9600);
  Serial.println("Sketch is starting up");

  pu();
  clear_int();
}

void loop() 
{
    char c;
    boolean f;
    boolean rec_fg = false;
    boolean play_fg = false;
     
   if(Serial.available())
    {
       c = Serial.read();
      switch(c)
      {
         case '0':
           initialize();
           break;
         case '1':
           set_erase(start_adress, end_adress);
           break;
         case '2':
           set_rec(start_adress, end_adress);
           rec_fg = true;
           break;
         case '3':
           set_play(start_adress, end_adress);
           play_fg = true;
           break;
         case 'l':
           clear_int();
           break;
         case 'y':
           play();
           play_fg = true;
           break;
         case 'r':
           rec();
           rec_fg = true;
           break;
         case 'f':
           fwd();
           break;
         case 'z':
           eraseAll();
         break;
         case 'e':
           erase();
         break;
         case 'p':
           stop();
           break;
         case 's':
           reset();
           break;
         case 'a':
           write_apc(true, false, 7);//mic in & no moniter on recording
           break;
         case 'b':
           write_apc(false, false, 7);//analog in & no moniter on recording
           break;
         case 'c':
           Serial.println(read_apc(), BIN);//read apc
         break;  
         case 'd':
           Serial.println(read_status(), BIN);//read status
      }
    }
      
    if(play_fg == true)
    {
      ready_play_wait();
      play_fg = false;
    }
    if(rec_fg == true)
    {
      ready_rec_check();
      rec_fg = false;
    }
}

void pu()//power up
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(PU); // power up
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT, HIGH);
  delay(WAIT_TIME2);
  
  Serial.println("power up end");
}

void clear_int()// clear interupt
{
   digitalWrite(SLAVESELECT, LOW);
   delay(WAIT_TIME);
   spi_transfer(CLR_INT); // clear interupt and eom bit
   spi_transfer(0x00); // data byte
   digitalWrite(SLAVESELECT, HIGH);
   delay(WAIT_TIME2);
   Serial.println("clear int end");
}

void reset()// reset
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(RESET); // resett
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT, HIGH);
  delay(WAIT_TIME2);
  
  Serial.println("reset end");
}

void play()
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(PLAY); // play
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT, HIGH);
  delay(WAIT_TIME2);
  
  Serial.println("play start");
}

void stop()
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(STOP); // stop
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT, HIGH);
  delay(WAIT_TIME2);
  
  Serial.println("stop end");
}

void rec()
{
   uint8_t data[2] = {0xFF,0xFF};
   
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  //spi_transfer(REC);// record
  data[0] = spi_transfer(REC_LED);// record with LED on
  data[1] = spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT, HIGH);
  
  delay(WAIT_TIME2);
}

void set_erase(int starta, int enda)
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(SET_ERASE); // clear interupt and eom bit
  spi_transfer(0); // data byte

  spi_transfer(starta & 255); // data byte start
  spi_transfer(starta >> 8); // data byte last 3 bits
  spi_transfer(enda & 255); // data byte stop
  spi_transfer(enda >> 8); // data byte last 3 bits
  spi_transfer(0); // data byte blank
  digitalWrite(SLAVESELECT, HIGH);  
  delay(WAIT_TIME2);
  
  Serial.println("set erase end");
}

void set_play(int starta, int enda)
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  spi_transfer(SET_PLAY); // clear interupt and eom bit
  spi_transfer(0); // data byte

  spi_transfer(starta & 255); // data byte start
  spi_transfer(starta >> 8); // data byte last 3 bits
  spi_transfer(enda & 255); // data byte stop
  spi_transfer(enda >> 8); // data byte last 3 bits
  spi_transfer(0); // data byte blank
  digitalWrite(SLAVESELECT, HIGH);  
  delay(WAIT_TIME2);
  
  Serial.println("set play end");
}

void set_rec(int starta, int enda)
{
  digitalWrite(SLAVESELECT, LOW);
  delay(WAIT_TIME);
  //spi_transfer(SET_REC); // clear interupt and eom bit
  spi_transfer(SET_REC_LED);//set record with LED on
  spi_transfer(0); // data byte

  spi_transfer(starta & 255); // data byte start
  spi_transfer(starta >> 8); // data byte last 3 bits
  spi_transfer(enda & 255); // data byte stop
  spi_transfer(enda >> 8); // data byte last 3 bits
  spi_transfer(0); // data byte blank
  digitalWrite(SLAVESELECT, HIGH);  
  delay(WAIT_TIME2);
  
  Serial.println("set rec end");
}