极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7179|回复: 4

【分享】ISD 1760PY 录音模块的arduino代码

[复制链接]
发表于 2014-4-30 07:12:29 | 显示全部楼层 |阅读模式
在arduino uno调试成功,代码源于链接下。修改了两处错误。

按照文件头定义连接arduino和1760py口。模块淘宝买的28rmb。

http://forum.arduino.cc/index.php/topic,96463.0.html

  1. //define pins
  2. #define DATAOUT     11   //mosi
  3. #define DATAIN        12   //miso
  4. #define SPICLOCK    13   //sck
  5. #define SLAVESELECT 10   //ss

  6. //opcodes
  7. #define PU            0x01
  8. #define STOP          0x02
  9. #define RESET         0x03
  10. #define CLR_INT     0x04
  11. #define RD_STATUS   0x05
  12. #define RD_PLAY_PTR 0x06
  13. #define PD            0x07
  14. #define RD_REC_PTR  0x08
  15. #define DEVID         0x09
  16. #define PLAY          0x40
  17. #define REC           0x41
  18. #define REC_LED           0x51//record with LED on
  19. #define ERASE         0x42
  20. #define G_ERASE     0x43
  21. #define RD_APC        0x44
  22. #define WR_APC1     0x45
  23. #define WR_APC2     0x65
  24. #define WR_NVCFG    0x46
  25. #define LD_NVCFG    0x47
  26. #define FWD           0x48
  27. #define CHK_MEM     0x49
  28. #define EXTCLK        0x4A
  29. #define SET_PLAY    0x80
  30. #define SET_REC     0x81
  31. #define SET_REC_LED    0x91//set record with LED on
  32. #define SET_ERASE   0x82

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

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

  37. void setup() {
  38.   pinMode(DATAOUT, OUTPUT);
  39.   pinMode(DATAIN, INPUT);
  40.   pinMode(SPICLOCK, OUTPUT);
  41.   pinMode(SLAVESELECT, OUTPUT);
  42.   
  43.   initialize();
  44. }

  45. void initialize()
  46. {
  47.    byte clr;
  48.    
  49.   digitalWrite(SLAVESELECT, HIGH); //disable device
  50.   digitalWrite(SPICLOCK, HIGH); //SCLK
  51.   digitalWrite(DATAOUT, LOW); //MOSI
  52.   
  53.   SPCR = B01111111; //data lsb, clock high when idle, samples on falling
  54.   clr = SPSR;
  55.   clr = SPDR;
  56.   delay(10);

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

  60.   pu();
  61.   clear_int();
  62. }

  63. void loop()
  64. {
  65.     char c;
  66.     boolean f;
  67.     boolean rec_fg = false;
  68.     boolean play_fg = false;
  69.      
  70.    if(Serial.available())
  71.     {
  72.        c = Serial.read();
  73.       switch(c)
  74.       {
  75.          case '0':
  76.            initialize();
  77.            break;
  78.          case '1':
  79.            set_erase(start_adress, end_adress);
  80.            break;
  81.          case '2':
  82.            set_rec(start_adress, end_adress);
  83.            rec_fg = true;
  84.            break;
  85.          case '3':
  86.            set_play(start_adress, end_adress);
  87.            play_fg = true;
  88.            break;
  89.          case 'l':
  90.            clear_int();
  91.            break;
  92.          case 'y':
  93.            play();
  94.            play_fg = true;
  95.            break;
  96.          case 'r':
  97.            rec();
  98.            rec_fg = true;
  99.            break;
  100.          case 'f':
  101.            fwd();
  102.            break;
  103.          case 'z':
  104.            eraseAll();
  105.          break;
  106.          case 'e':
  107.            erase();
  108.          break;
  109.          case 'p':
  110.            stop();
  111.            break;
  112.          case 's':
  113.            reset();
  114.            break;
  115.          case 'a':
  116.            write_apc(true, false, 7);//mic in & no moniter on recording
  117.            break;
  118.          case 'b':
  119.            write_apc(false, false, 7);//analog in & no moniter on recording
  120.            break;
  121.          case 'c':
  122.            Serial.println(read_apc(), BIN);//read apc
  123.          break;  
  124.          case 'd':
  125.            Serial.println(read_status(), BIN);//read status
  126.       }
  127.     }
  128.       
  129.     if(play_fg == true)
  130.     {
  131.       ready_play_wait();
  132.       play_fg = false;
  133.     }
  134.     if(rec_fg == true)
  135.     {
  136.       ready_rec_check();
  137.       rec_fg = false;
  138.     }
  139. }

  140. void pu()//power up
  141. {
  142.   digitalWrite(SLAVESELECT, LOW);
  143.   delay(WAIT_TIME);
  144.   spi_transfer(PU); // power up
  145.   spi_transfer(0x00); // data byte
  146.   digitalWrite(SLAVESELECT, HIGH);
  147.   delay(WAIT_TIME2);
  148.   
  149.   Serial.println("power up end");
  150. }

  151. void clear_int()// clear interupt
  152. {
  153.    digitalWrite(SLAVESELECT, LOW);
  154.    delay(WAIT_TIME);
  155.    spi_transfer(CLR_INT); // clear interupt and eom bit
  156.    spi_transfer(0x00); // data byte
  157.    digitalWrite(SLAVESELECT, HIGH);
  158.    delay(WAIT_TIME2);
  159.    Serial.println("clear int end");
  160. }

  161. void reset()// reset
  162. {
  163.   digitalWrite(SLAVESELECT, LOW);
  164.   delay(WAIT_TIME);
  165.   spi_transfer(RESET); // resett
  166.   spi_transfer(0x00); // data byte
  167.   digitalWrite(SLAVESELECT, HIGH);
  168.   delay(WAIT_TIME2);
  169.   
  170.   Serial.println("reset end");
  171. }

  172. void play()
  173. {
  174.   digitalWrite(SLAVESELECT, LOW);
  175.   delay(WAIT_TIME);
  176.   spi_transfer(PLAY); // play
  177.   spi_transfer(0x00); // data byte
  178.   digitalWrite(SLAVESELECT, HIGH);
  179.   delay(WAIT_TIME2);
  180.   
  181.   Serial.println("play start");
  182. }

  183. void stop()
  184. {
  185.   digitalWrite(SLAVESELECT, LOW);
  186.   delay(WAIT_TIME);
  187.   spi_transfer(STOP); // stop
  188.   spi_transfer(0x00); // data byte
  189.   digitalWrite(SLAVESELECT, HIGH);
  190.   delay(WAIT_TIME2);
  191.   
  192.   Serial.println("stop end");
  193. }

  194. void rec()
  195. {
  196.    uint8_t data[2] = {0xFF,0xFF};
  197.    
  198.   digitalWrite(SLAVESELECT, LOW);
  199.   delay(WAIT_TIME);
  200.   //spi_transfer(REC);// record
  201.   data[0] = spi_transfer(REC_LED);// record with LED on
  202.   data[1] = spi_transfer(0x00); // data byte
  203.   digitalWrite(SLAVESELECT, HIGH);
  204.   
  205.   delay(WAIT_TIME2);
  206. }

  207. void set_erase(int starta, int enda)
  208. {
  209.   digitalWrite(SLAVESELECT, LOW);
  210.   delay(WAIT_TIME);
  211.   spi_transfer(SET_ERASE); // clear interupt and eom bit
  212.   spi_transfer(0); // data byte

  213.   spi_transfer(starta & 255); // data byte start
  214.   spi_transfer(starta >> 8); // data byte last 3 bits
  215.   spi_transfer(enda & 255); // data byte stop
  216.   spi_transfer(enda >> 8); // data byte last 3 bits
  217.   spi_transfer(0); // data byte blank
  218.   digitalWrite(SLAVESELECT, HIGH);  
  219.   delay(WAIT_TIME2);
  220.   
  221.   Serial.println("set erase end");
  222. }

  223. void set_play(int starta, int enda)
  224. {
  225.   digitalWrite(SLAVESELECT, LOW);
  226.   delay(WAIT_TIME);
  227.   spi_transfer(SET_PLAY); // clear interupt and eom bit
  228.   spi_transfer(0); // data byte

  229.   spi_transfer(starta & 255); // data byte start
  230.   spi_transfer(starta >> 8); // data byte last 3 bits
  231.   spi_transfer(enda & 255); // data byte stop
  232.   spi_transfer(enda >> 8); // data byte last 3 bits
  233.   spi_transfer(0); // data byte blank
  234.   digitalWrite(SLAVESELECT, HIGH);  
  235.   delay(WAIT_TIME2);
  236.   
  237.   Serial.println("set play end");
  238. }

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

  246.   spi_transfer(starta & 255); // data byte start
  247.   spi_transfer(starta >> 8); // data byte last 3 bits
  248.   spi_transfer(enda & 255); // data byte stop
  249.   spi_transfer(enda >> 8); // data byte last 3 bits
  250.   spi_transfer(0); // data byte blank
  251.   digitalWrite(SLAVESELECT, HIGH);  
  252.   delay(WAIT_TIME2);
  253.   
  254.   Serial.println("set rec end");
  255. }

  256. void erase()
  257. {
  258.   digitalWrite(SLAVESELECT, LOW);
  259.   delay(WAIT_TIME);
  260.   spi_transfer(ERASE);// erase
  261.   spi_transfer(0x00); // data byte
  262.   digitalWrite(SLAVESELECT, HIGH);
  263.   delay(WAIT_TIME2);
  264.   
  265.   Serial.println("erase end");
  266. }

  267. void eraseAll()
  268. {
  269.   digitalWrite(SLAVESELECT, LOW);
  270.   delay(WAIT_TIME);
  271.   spi_transfer(G_ERASE);// g_erase
  272.   spi_transfer(0x00); // data byte
  273.   digitalWrite(SLAVESELECT, HIGH);
  274.   delay(WAIT_TIME2);
  275.   
  276.   Serial.println("erase all end");
  277. }

  278. void fwd()
  279. {
  280.   digitalWrite(SLAVESELECT, LOW);
  281.   delay(WAIT_TIME);
  282.   spi_transfer(FWD); // forward
  283.   spi_transfer(0x00); // data byte
  284.   digitalWrite(SLAVESELECT, HIGH);
  285.   delay(WAIT_TIME2);
  286.   
  287.   Serial.println("forward end");
  288. }

  289. void ready_play_wait()
  290. {
  291.   byte byte1;
  292.   byte byte2;
  293.   byte byte3;

  294.   while(byte3 << 7 != 128)
  295.   {
  296.     digitalWrite(SLAVESELECT, LOW);
  297.     delay(WAIT_TIME);
  298.     byte1 = spi_transfer(RD_STATUS); // clear interupt and eom bit
  299.     byte2 = spi_transfer(0x00); // data byte
  300.     byte3 = spi_transfer(0x00); // data byte
  301.     digitalWrite(SLAVESELECT, HIGH);
  302.     delay(WAIT_TIME2);
  303.   }
  304.   
  305.   delay(100);
  306.   
  307.   Serial.println("play end");
  308. }

  309. void ready_rec_check()
  310. {
  311.   byte byte1;
  312.   byte byte2;
  313.   byte byte3;

  314.   while(byte3 << 7 == 128)
  315.   {
  316.     digitalWrite(SLAVESELECT, LOW);
  317.     delay(WAIT_TIME);
  318.     byte1 = spi_transfer(RD_STATUS); // clear interupt and eom bit
  319.     byte2 = spi_transfer(0x00); // data byte
  320.     byte3 = spi_transfer(0x00); // data byte
  321.     digitalWrite(SLAVESELECT, HIGH);
  322.     delay(WAIT_TIME2);
  323.   }
  324.   
  325.   delay(100);
  326.   
  327.   Serial.println("rec start");
  328. }

  329. char spi_transfer(volatile char data)
  330. {
  331.   SPDR = data;           // Start the transmission
  332.   while (!(SPSR & (1 << SPIF)))     // Wait for the end of the transmission
  333.   {
  334.   };
  335.   return SPDR;           // return the received byte
  336. }

  337. //flag : false=analog in/true=mic in
  338. //flag2 : false=no monitor on recording / true=monitor on recording
  339. //vol : volume max=7 min=0
  340. void write_apc(boolean flag, boolean flag2, int vol)
  341. {
  342.     uint16_t d[12];
  343.       d = 0x00;
  344.     }
  345.     if(flag == true)
  346.       d[6] = 0x01;
  347.     if(flag2 == true)
  348.       d[3] = 0x01;
  349.       
  350.     int vv = 7 - vol;
  351.       
  352.     d[0] = vv & 0x01;
  353.     d[1] = vv & 0x02;
  354.     d[2] = vv & 0x04;
  355.    
  356.     uint16_t apc =  (d[0] | d[1] << 1 | d[2] << 2 | d[3] << 3 | d[4] << 4 | d[5] << 5 | d[6] << 6 | d[7] << 7 | d[8] << 8 | d[9] << 9 | d[10] << 10 | d[11] << 11);
  357.       
  358.     digitalWrite(SLAVESELECT, LOW);
  359.     delay(WAIT_TIME);
  360.     spi_transfer(WR_APC2); // write apc register 2
  361.     spi_transfer(apc & 0xFF); // data byte start
  362.     spi_transfer(apc >> ; // data byte last 3 bits

  363.     digitalWrite(SLAVESELECT, HIGH);
  364.    
  365.     delay(WAIT_TIME2);
  366.    
  367.     Serial.println("write apc end");
  368. }

  369. uint16_t read_apc()
  370. {
  371.   uint16_t apc;
  372.   uint8_t data[4] = {0xFF,0xFF,0xFF,0xFF};
  373.   
  374.   digitalWrite(SLAVESELECT, LOW);
  375.   delay(WAIT_TIME);
  376.   data[0] = spi_transfer(RD_APC); // read apc register
  377.   data[1] = spi_transfer(0);
  378.   data[2] = spi_transfer(0);
  379.   data[3] = spi_transfer(0);
  380.   digitalWrite(SLAVESELECT, HIGH);
  381.   
  382.   delay(WAIT_TIME2);
  383.   
  384.   apc = word(data[3], data[2]);
  385.   
  386.   Serial.println("read apc end");
  387.   
  388.   return apc;
  389. }
  390.   
  391. uint16_t read_status(void)
  392. {
  393.   uint16_t sr1;
  394.   uint8_t data[3] = {0xFF,0xFF,0xFF};
  395.   
  396.   digitalWrite(SLAVESELECT, LOW);
  397.   delay(WAIT_TIME);
  398.   data[0] = spi_transfer(RD_STATUS); // read status register
  399.   data[1] = spi_transfer(0);
  400.   data[2] = spi_transfer(0);
  401.   digitalWrite(SLAVESELECT, HIGH);
  402.   
  403.   delay(WAIT_TIME2);
  404.   
  405.   sr1 = word(data[2], 0xFF);
  406.   return sr1;
  407. }
复制代码
回复

使用道具 举报

发表于 2014-4-30 08:51:36 | 显示全部楼层
不错。。代码好长~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-30 08:55:33 | 显示全部楼层
这个是刚看到的一个官网的data sheet和使用指南,结合代码应该很容易理解

http://www.atvoc.com/rjxz/isd1700.pdf
回复 支持 反对

使用道具 举报

发表于 2014-5-7 17:59:34 | 显示全部楼层
楼主,372行是不是有错?d=0x00是啥?
回复 支持 反对

使用道具 举报

发表于 2014-5-7 18:06:13 | 显示全部楼层
弘毅 发表于 2014-4-30 08:51
不错。。代码好长~

代码很长,错误很多391行移位,373行误入一个括号。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 20:09 , Processed in 0.040153 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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