ISD17XX モジュールをArduinoで操作する

お仕事が忙しくてなかなか更新ができていませんでしたが、

またトラ技Jrの依頼をいただきました。喜び。

 

ISD1700シリーズという音声録音ICがあります。

そのモジュールをArduinoで操作するためのソースコードを載せておきます。

基本はSPI制御となります。

注意するべき点としては、SPISettingsを使用して、ISD1700に合わせた通信設定をすることです。

SPIの同期クロックが1MHz以上だと動作サポートしていないようなので、1MHz以下のクロックで動作するように設定します。

また、SlaveSelectピンとクロックピンはアイドル状態の時はHIGHにして、MOSIピンはLOWになるように設定しておきます。

 

以下のようにしておけば問題なしです。

 


SPISettings settingsA(500000, LSBFIRST, SPI_MODE3);

SPI.begin();
SPI.beginTransaction(settingsA);

pinMode(slavePin,OUTPUT);
digitalWrite(slavePin,HIGH);

 

これを踏まえて、シリアルコンソールでアルファベット入力で操作できるようにコードを書きました。

下記のWEBページとプログラムを参考にしています。

参考WEB1

参考WEB2

 

上記参考WEBのGITHUBのプログラム、私の動作環境だと動かなかったのですが、ちょっといじれば多分動くと思います。

手っ取り早く動かしたい方は、下記コードご参考あれ。

 


#include <SPI.h>
#include "ISD17XX.h"

const int slavePin = 10;
SPISettings settingsA(500000, LSBFIRST, SPI_MODE3);

void setup() {
 // put your setup code here, to run once:
 SPI.begin();
 SPI.beginTransaction(settingsA);
 
 pinMode(slavePin,OUTPUT);
 digitalWrite(slavePin,HIGH);
 
 Serial.begin(115200);
}

void loop() {
 // put your main code here, to run repeatedly:
 char c;
 char reads[3];
 if(Serial.available()){
  c = Serial.read();
  switch(c){
   case 'A':
     sendCmd(PowerUp);
     break;
   case 'B':
     sendCmd(Stop);
     break;
   case 'C':
     sendCmd(Reset);
     break;
   case 'D':
     sendCmd(ClearInt);
     break;
   case 'E':
     sendCmd(ReadStatus,0x00);
     break;
   case 'F':
     sendCmd(PowerDown);
     break;
   case 'G':
     sendCmd(Device);
     break;
   case 'H':
     sendCmd(Play);
     break;
   case 'I':
     sendCmd(Record);
     break;
   case 'J':
     sendCmd(Erase);
     break;
   case 'K':
     sendCmd(AllErase);
     break;
   case 'L':
     sendCmd(Forward);
     break;
   case 'M':
     sendCmd(ReadPlayPoint,0x00,0x00);
     break;
   case 'N':
     sendCmd(ReadRecordPoint,0x00,0x00);
     break;
   case 'O':
     sendCmd(SetPlayAdd);
     break;
   case 'P':
     sendCmd(SetRecordAdd);
     break;
   case 'Q':
     sendCmd(SetEraseAdd);
     break;
   case 'R':
     sendCmd(ReadAPC);
     break;
   case 'S':
     //D0-2 : 000,D3:0,D4:0,D5:0,D6:1,D7:0,D8:0,D9:0,D10:0,D11:0
     //00000100,000
     sendCmd_APC(WriteAPC,0x04,0x00);
     //sendCmd(WriteNV);
     break;
   case 'T':
     sendCmd(WriteNV);
     break;
  }
 }
}

void sendCmd(int cmd){
 char reads[2];
 char prints[100];
 digitalWrite(slavePin,LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 digitalWrite(slavePin,HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 Serial.println("■------------■");
}

void sendCmd(int cmd,int data){
 char reads[3];
 char prints[100];
 digitalWrite(slavePin,LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data);
 digitalWrite(slavePin,HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 Serial.println("■------------■");
}

void sendCmd(int cmd,int data0,int data1){
 char reads[4];
 char prints[100];
 digitalWrite(slavePin,LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data0);
 reads[3] = SPI.transfer(data1);
 digitalWrite(slavePin,HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 printBits(reads[3]);
 Serial.println("■------------■");
}

void sendCmd(int cmd,int data0,int data1,int data2){
 char reads[5];
 char prints[100];
 digitalWrite(slavePin,LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(0x00);
 reads[2] = SPI.transfer(data0);
 reads[3] = SPI.transfer(data1);
 reads[4] = SPI.transfer(data2);
 digitalWrite(slavePin,HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 printBits(reads[3]);
 Serial.println("■------------■");
}

void sendCmd_APC(int cmd,int data0,int data1){
 char reads[3];
 char prints[100];
 digitalWrite(slavePin,LOW);
 reads[0] = SPI.transfer(cmd);
 reads[1] = SPI.transfer(data0);
 reads[2] = SPI.transfer(data1);
 digitalWrite(slavePin,HIGH);
 Serial.println("■---RESULT---■");
 printBits(reads[0]);
 printBits(reads[1]);
 printBits(reads[2]);
 Serial.println("■------------■");
}

void printBits(byte myByte){
 for(byte mask = 0x80; mask; mask >>= 1){
 if(mask & myByte)
  Serial.print('1');
 else
  Serial.print('0');
 }
 Serial.println();
}


 

//common Command
#define PowerUp 0x01
#define Stop 0x02
#define Reset 0x03
#define ClearInt 0x04
#define ReadStatus 0x05
#define PowerDown 0x07
#define Device 0x09

//Memory Access Command
#define Play 0x40
#define Record 0x41
#define Erase 0x42
#define AllErase 0x43
#define Forward 0x48
#define ReadPlayPoint 0x06
#define ReadRecordPoint 0x08
#define SetPlayAdd 0x80
#define SetRecordAdd 0x81
#define SetEraseAdd 0x82

//Analog Configuration Command
#define ReadAPC 0x44
#define WriteAPC 0x65
#define WriteNV 0x46

//Set Address

 

コメントを残す

メールアドレスが公開されることはありません。