极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29065|回复: 7

arduino控制ISD1760语音芯片

[复制链接]
发表于 2012-11-3 15:37:37 | 显示全部楼层 |阅读模式
本帖最后由 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);
}
回复

使用道具 举报

发表于 2012-12-2 17:15:00 | 显示全部楼层
这个指定位置怎么获取?
回复 支持 反对

使用道具 举报

 楼主| 发表于 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_PTR  0x08
#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
}
回复 支持 反对

使用道具 举报

发表于 2012-12-6 19:43:15 | 显示全部楼层
mark,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2012-12-6 20:28:43 | 显示全部楼层
mark今天刚刚看到这个板子,貌似很便宜的模块
回复 支持 反对

使用道具 举报

发表于 2012-12-27 22:27:02 | 显示全部楼层
dgw123 发表于 2012-12-5 20:49
看ISD1760的使用手册,里面有读取当前语音的地址的指令。我是这样做的,先手工录音,然后和Arduino板子连接 ...

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

使用道具 举报

发表于 2012-12-28 14:43:24 | 显示全部楼层
{:soso_e120:}ISD系列都很经典了,现在国产也有很多语音芯片,性价比比isd高多了,lz可以去了解下。。
回复 支持 反对

使用道具 举报

发表于 2019-9-16 17:36:21 | 显示全部楼层
楼主有arduino板和语音1760的连线图嘛?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 18:12 , Processed in 0.041746 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表