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);
} 这个指定位置怎么获取? 看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
} mark,谢谢楼主 mark今天刚刚看到这个板子,貌似很便宜的模块 dgw123 发表于 2012-12-5 20:49 static/image/common/back.gif
看ISD1760的使用手册,里面有读取当前语音的地址的指令。我是这样做的,先手工录音,然后和Arduino板子连接 ...
现在才看到 回复,非常感谢,那块闲置很久的1760终于可以复活了,非常感谢! {:soso_e120:}ISD系列都很经典了,现在国产也有很多语音芯片,性价比比isd高多了,lz可以去了解下。。 楼主有arduino板和语音1760的连线图嘛?
页:
[1]