dgw123 发表于 2012-11-3 15:37:37

arduino控制ISD1760语音芯片

本帖最后由 dgw123 于 2012-11-3 19:45 编辑

这两天,在学习ISD1760语音学习板,板子上有7个按键,可以按键控制录音,播放啥的,同时还引出了SPI程序控制接口,ARDUINO板子刚好支持SPI接口,我就想用他来控制,写程序前,先上网搜索教程,找了半天没有找到,倒是在国外一个网站搜到了一篇老的教程,网址http://arduino.cc/forum/index.php/topic,38867.0.html,参考了下,仿照着写了下面一个程序,可以用程序控制在指定位置放音。SPI.transfer(0x80)语句里的0x80是ISD1760里的指令代码,详细见说明文档。


* CS - to digital pin 10(SS pin)
* SDI - to digital pin 11 (MOSI pin)
* CLK - to digital pin 13 (SCK pin)

 
#include <SPI.h>


 
const int slaveSelectPin = 10;

void setup() {
 

pinMode (slaveSelectPin, OUTPUT);
   SPI.begin();
SPCR = B01111111;
   delay(10);

digitalWrite(slaveSelectPin,LOW);
SPI.transfer(0x01); // power up
SPI.transfer(0x00); // data byte
digitalWrite(slaveSelectPin,HIGH);
delay(100);

digitalWrite(slaveSelectPin,LOW);
SPI.transfer(0x04); // clear interupt and eom bit
SPI.transfer(0x00); // data byte
digitalWrite(slaveSelectPin,HIGH);
delay(100);
}

void loop() {
    digitalWrite(slaveSelectPin,LOW);
 
SPI.transfer(0x80);
SPI.transfer(0x00);
SPI.transfer(47);
SPI.transfer(0x00);
SPI.transfer(113);
SPI.transfer(0x00);
SPI.transfer(0x00);
   
digitalWrite(slaveSelectPin,HIGH);
delay(3000);
}

wasdpkj 发表于 2012-12-2 17:15:00

这个指定位置怎么获取?

dgw123 发表于 2012-12-5 20:49:35

看ISD1760的使用手册,里面有读取当前语音的地址的指令。我是这样做的,先手工录音,然后和Arduino板子连接,板子里下载一个程序用来读当前录音的地址,然后手动按键控制下一条语音,再读出当前语音的地址,于是所有语音地址都读出来了。然后再用上面的程序控制播放哪一条语音。
//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_PTR0x08
#define DEVID       0x09
#define PLAY      0x40
#define REC         0x41
#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    0x49
#define SET_REC   0x81
#define SET_ERASE   0x82

void setup() {

byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); //disable device
SPCR = B01111111; //data lsb, clock high when idle, samples on falling
clr=SPSR;
clr=SPDR;
delay(10);

//start serial
Serial.begin(9600);

digitalWrite(SLAVESELECT,LOW);
spi_transfer(PU); // power up
spi_transfer(0x00); // data byte
digitalWrite(SLAVESELECT,HIGH);
delay(100);

digitalWrite(SLAVESELECT,LOW);
spi_transfer(CLR_INT); // clear interupt and eom bit
spi_transfer(0x00); // data byte
digitalWrite(SLAVESELECT,HIGH);
delay(100);

}

void loop() {


digitalWrite(SLAVESELECT,LOW);
spi_transfer(PLAY); // clear interupt and eom bit
spi_transfer(0x00); // data byte
digitalWrite(SLAVESELECT,HIGH);
   
   byte byte1;
byte byte2;
byte byte3;
   byte byte4;

   digitalWrite(SLAVESELECT,LOW);
    byte1 = spi_transfer(RD_PLAY_PTR); // clear interupt and eom bit
    byte2 = spi_transfer(0x00); // data byte
    byte3 = spi_transfer(0x00); // data byte
    byte4 = spi_transfer(0x00);
    digitalWrite(SLAVESELECT,HIGH);
   Serial.println(byte1);
      Serial.println(byte2);
       Serial.println(byte3);
      Serial.println(byte4);
   delay(9000);

   
}



char spi_transfer(volatile char data)
{
SPDR = data;                  // Start the transmission
while (!(SPSR & (1<<SPIF)))   // Wait for the end of the transmission
{
};
return SPDR;                  // return the received byte
}

hui1072 发表于 2012-12-6 19:43:15

mark,谢谢楼主

ttyp 发表于 2012-12-6 20:28:43

mark今天刚刚看到这个板子,貌似很便宜的模块

wasdpkj 发表于 2012-12-27 22:27:02

dgw123 发表于 2012-12-5 20:49 static/image/common/back.gif
看ISD1760的使用手册,里面有读取当前语音的地址的指令。我是这样做的,先手工录音,然后和Arduino板子连接 ...

现在才看到 回复,非常感谢,那块闲置很久的1760终于可以复活了,非常感谢!

Ansifa 发表于 2012-12-28 14:43:24

{:soso_e120:}ISD系列都很经典了,现在国产也有很多语音芯片,性价比比isd高多了,lz可以去了解下。。

阿K 发表于 2019-9-16 17:36:21

楼主有arduino板和语音1760的连线图嘛?
页: [1]
查看完整版本: arduino控制ISD1760语音芯片