sample and play see http://mbed.org/users/okini3939/notebook/I2S_TLV320AIC23B/

Dependencies:   I2SSlave TLV320 mbed

Fork of i2s_audio_echo by Suga koubou

Committer:
okini3939
Date:
Tue Dec 11 02:12:14 2012 +0000
Revision:
1:2aeba027f61e
Parent:
0:68f7b69ecca0
sampler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:68f7b69ecca0 1 #include "mbed.h"
okini3939 0:68f7b69ecca0 2 #include "TLV320.h"
okini3939 1:2aeba027f61e 3 #include "PRAM.h"
okini3939 0:68f7b69ecca0 4
okini3939 1:2aeba027f61e 5 #define BLOCK_SIZE 64
okini3939 1:2aeba027f61e 6 #define BLOCK_NUM 3
okini3939 1:2aeba027f61e 7
okini3939 1:2aeba027f61e 8 #define MODE_STOP 0
okini3939 1:2aeba027f61e 9 #define MODE_REC 1
okini3939 1:2aeba027f61e 10 #define MODE_PLAY 2
okini3939 0:68f7b69ecca0 11
okini3939 0:68f7b69ecca0 12 Serial pc(USBTX, USBRX);
okini3939 1:2aeba027f61e 13
okini3939 1:2aeba027f61e 14 SPI _spi(p11, p12, p13);
okini3939 1:2aeba027f61e 15 PRAM memory(_spi, p14); // SPI PRAM
okini3939 1:2aeba027f61e 16
okini3939 0:68f7b69ecca0 17 TLV320 audio(p9, p10, 0x34, p5, p6, p7, p8, p16); // I2S Codec
okini3939 1:2aeba027f61e 18
okini3939 1:2aeba027f61e 19 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 1:2aeba027f61e 20 DigitalIn play(p28), rec(p29), stop(p30);
okini3939 0:68f7b69ecca0 21
okini3939 1:2aeba027f61e 22 volatile int mode = MODE_STOP;
okini3939 1:2aeba027f61e 23 volatile int addr_r, num_r;
okini3939 1:2aeba027f61e 24 volatile int addr_w, num_w;
okini3939 1:2aeba027f61e 25 int buf_r[BLOCK_NUM][BLOCK_SIZE / 4];
okini3939 1:2aeba027f61e 26 int buf_w[BLOCK_NUM][BLOCK_SIZE / 4];
okini3939 1:2aeba027f61e 27
okini3939 1:2aeba027f61e 28 volatile int mem_r, mem_w;
okini3939 1:2aeba027f61e 29 volatile int flg_r = -1, flg_w = -1;
okini3939 1:2aeba027f61e 30
okini3939 1:2aeba027f61e 31 extern "C" void HardFault_Handler() {
okini3939 1:2aeba027f61e 32 register unsigned int _msp __asm("msp");
okini3939 1:2aeba027f61e 33 printf("Hard Fault! address: %08x\r\n", *((unsigned int *)(_msp + 24)));
okini3939 1:2aeba027f61e 34 printf("buf: %d %d %d\r\n", num_w, addr_w, mem_w);
okini3939 1:2aeba027f61e 35 exit(-1);
okini3939 1:2aeba027f61e 36 }
okini3939 0:68f7b69ecca0 37
okini3939 0:68f7b69ecca0 38 // interrupt TLV320 send/recv
okini3939 0:68f7b69ecca0 39 void isr_audio () {
okini3939 1:2aeba027f61e 40 int i;
okini3939 0:68f7b69ecca0 41 int buf[4];
okini3939 0:68f7b69ecca0 42
okini3939 0:68f7b69ecca0 43 // I2S input
okini3939 0:68f7b69ecca0 44 audio.read();
okini3939 1:2aeba027f61e 45
okini3939 1:2aeba027f61e 46 switch (mode) {
okini3939 1:2aeba027f61e 47 case MODE_STOP:
okini3939 1:2aeba027f61e 48 for (i = 0; i < 4; i ++) {
okini3939 1:2aeba027f61e 49 buf[i] = audio.rxBuffer[i];
okini3939 1:2aeba027f61e 50 }
okini3939 1:2aeba027f61e 51 audio.write(buf, 0, 4);
okini3939 1:2aeba027f61e 52 break;
okini3939 1:2aeba027f61e 53
okini3939 1:2aeba027f61e 54 case MODE_REC:
okini3939 1:2aeba027f61e 55 for (i = 0; i < 4; i ++) {
okini3939 1:2aeba027f61e 56 buf[i] = audio.rxBuffer[i];
okini3939 1:2aeba027f61e 57 buf_w[num_w][addr_w] = buf[i];
okini3939 1:2aeba027f61e 58 addr_w ++;
okini3939 1:2aeba027f61e 59 }
okini3939 1:2aeba027f61e 60 if (addr_w >= BLOCK_SIZE / 4) {
okini3939 1:2aeba027f61e 61 addr_w = 0;
okini3939 1:2aeba027f61e 62 flg_w = num_w;
okini3939 1:2aeba027f61e 63 num_w ++;
okini3939 1:2aeba027f61e 64 if (num_w >= BLOCK_NUM) {
okini3939 1:2aeba027f61e 65 num_w = 0;
okini3939 1:2aeba027f61e 66 }
okini3939 1:2aeba027f61e 67 led3 = 1;
okini3939 1:2aeba027f61e 68 }
okini3939 1:2aeba027f61e 69 audio.write(buf, 0, 4);
okini3939 1:2aeba027f61e 70 break;
okini3939 1:2aeba027f61e 71
okini3939 1:2aeba027f61e 72 case MODE_PLAY:
okini3939 1:2aeba027f61e 73 for (i = 0; i < 4; i ++) {
okini3939 1:2aeba027f61e 74 buf[i] = buf_r[num_r][addr_r];
okini3939 1:2aeba027f61e 75 addr_r ++;
okini3939 1:2aeba027f61e 76 }
okini3939 1:2aeba027f61e 77 if (addr_r >= BLOCK_SIZE / 4) {
okini3939 1:2aeba027f61e 78 addr_r = 0;
okini3939 1:2aeba027f61e 79 num_r ++;
okini3939 1:2aeba027f61e 80 if (num_r >= BLOCK_NUM) {
okini3939 1:2aeba027f61e 81 num_r = 0;
okini3939 1:2aeba027f61e 82 }
okini3939 1:2aeba027f61e 83 flg_r = num_r + 1 < BLOCK_NUM ? num_r + 1 : 0;
okini3939 1:2aeba027f61e 84 led4 = 1;
okini3939 1:2aeba027f61e 85 }
okini3939 1:2aeba027f61e 86 audio.write(buf, 0, 4);
okini3939 1:2aeba027f61e 87 break;
okini3939 0:68f7b69ecca0 88 }
okini3939 0:68f7b69ecca0 89
okini3939 0:68f7b69ecca0 90 }
okini3939 0:68f7b69ecca0 91
okini3939 0:68f7b69ecca0 92 int main() {
okini3939 0:68f7b69ecca0 93
okini3939 1:2aeba027f61e 94 pc.baud(115200 * 8);
okini3939 1:2aeba027f61e 95 rec.mode(PullUp);
okini3939 1:2aeba027f61e 96 play.mode(PullUp);
okini3939 1:2aeba027f61e 97 stop.mode(PullUp);
okini3939 0:68f7b69ecca0 98
okini3939 0:68f7b69ecca0 99 audio.power(0x02); // mic off
okini3939 0:68f7b69ecca0 100 audio.outputVolume(1, 1); // headphone off
okini3939 1:2aeba027f61e 101 audio.inputVolume(0.7, 0.7);
okini3939 0:68f7b69ecca0 102 audio.frequency(44100);
okini3939 0:68f7b69ecca0 103 audio.attach(&isr_audio);
okini3939 0:68f7b69ecca0 104 audio.start(RECEIVE);
okini3939 0:68f7b69ecca0 105 printf("Audio ready\r\n");
okini3939 1:2aeba027f61e 106 led1 = 1;
okini3939 0:68f7b69ecca0 107
okini3939 1:2aeba027f61e 108 for (;;) {
okini3939 1:2aeba027f61e 109 if (rec == 0 && mode == MODE_STOP) {
okini3939 1:2aeba027f61e 110 printf("rec\r\n");
okini3939 1:2aeba027f61e 111 addr_w = 0; num_w = 0;
okini3939 1:2aeba027f61e 112 mem_w = 0;
okini3939 1:2aeba027f61e 113 flg_w = -1;
okini3939 1:2aeba027f61e 114 led2 = 1;
okini3939 1:2aeba027f61e 115 mode = MODE_REC;
okini3939 1:2aeba027f61e 116 }
okini3939 1:2aeba027f61e 117 if (play == 0 && mode == MODE_STOP) {
okini3939 1:2aeba027f61e 118 printf("play\r\n");
okini3939 1:2aeba027f61e 119 addr_r = 0; num_r = 0;
okini3939 1:2aeba027f61e 120 mem_r = 0;
okini3939 1:2aeba027f61e 121 flg_r = 0;
okini3939 1:2aeba027f61e 122 led2 = 1;
okini3939 1:2aeba027f61e 123 mode = MODE_PLAY;
okini3939 1:2aeba027f61e 124 }
okini3939 1:2aeba027f61e 125 if (stop == 0 && mode != MODE_STOP) {
okini3939 1:2aeba027f61e 126 printf("stop\r\n");
okini3939 1:2aeba027f61e 127 led2 = 0;
okini3939 1:2aeba027f61e 128 mode = MODE_STOP;
okini3939 1:2aeba027f61e 129 }
okini3939 0:68f7b69ecca0 130
okini3939 1:2aeba027f61e 131 if (mode == MODE_PLAY) {
okini3939 1:2aeba027f61e 132 if (mem_r >= mem_w) {
okini3939 1:2aeba027f61e 133 printf("end\r\n");
okini3939 1:2aeba027f61e 134 led2 = 0;
okini3939 1:2aeba027f61e 135 mode = MODE_STOP;
okini3939 1:2aeba027f61e 136 }
okini3939 1:2aeba027f61e 137 }
okini3939 1:2aeba027f61e 138
okini3939 1:2aeba027f61e 139 if (flg_w >= 0) {
okini3939 1:2aeba027f61e 140 // printf("W %d %d\r\n", flg_w, mem_w);
okini3939 1:2aeba027f61e 141 memory.write(BLOCK_SIZE * mem_w, (char *)buf_w[flg_w], BLOCK_SIZE);
okini3939 1:2aeba027f61e 142 mem_w ++;
okini3939 1:2aeba027f61e 143 flg_w = -1;
okini3939 1:2aeba027f61e 144 led3 = 0;
okini3939 1:2aeba027f61e 145 }
okini3939 1:2aeba027f61e 146 if (flg_r >= 0) {
okini3939 1:2aeba027f61e 147 // printf("R %d %d\r\n", flg_r, mem_r);
okini3939 1:2aeba027f61e 148 memory.read(BLOCK_SIZE * mem_r, (char *)buf_r[flg_r], BLOCK_SIZE);
okini3939 1:2aeba027f61e 149 mem_r ++;
okini3939 1:2aeba027f61e 150 flg_r = -1;
okini3939 1:2aeba027f61e 151 led4 = 0;
okini3939 1:2aeba027f61e 152 }
okini3939 0:68f7b69ecca0 153 }
okini3939 0:68f7b69ecca0 154
okini3939 0:68f7b69ecca0 155 audio.stop();
okini3939 0:68f7b69ecca0 156 printf("exit\r\n");
okini3939 0:68f7b69ecca0 157 }