ここらでソース公開
いまSH-2とFPGA(SPARTAN XC3S50)とADuC7026を同時に使っていて何がなんだかわかりません。何がしたいのだろうか状態です。完璧な5月病です(笑
SH-2のソースコード中に
signal DAT_FIFO :std_logic_vector(7 downto 0);
などと記述してしまう始末。何してまんねん。
(確かsyntax error near "signal"みたいなエラー吐いたorz)
そんな中、トラ技の読者コメントに投稿したら採用されてSR8C15CPを頂きました。ありがたいです。
ちょっとだけ我に返りました。
そうだUSBにつなげられてoggファイルを再生できる、しかもデータロガーにもなるオーディオプレーヤを作るのが目標やった。。。
というわけで、ここらで今までの成果を(あまり進化してないけど)少しばかり。
?再生は8bitリニアPCM,stereo,44.1kHzデータのみ対応。音声出力端子はp1_2とp1_3端子です。PWMで出力するので22uHインダクタと0.47uFの積層セラで2次LPFを接続してください。
ちなみにかなりの大音量なので、イヤホンとかで試すと耳に悪影響があります。コンポ用のアンプ内蔵スピーカーなどでボリュームを調整しながら試してください
?今のところ録音機能はない。ただしコメントアウトしてコンパイルさせないようにしてあるだけ。外せば使えます。p1_0,p1_1ピンが録音用端子です。ただしサンプリング周波数が44.1kHzよりずっと早いので適宜
asm ("nop");
を挿入してやらないと再生した時に面白いことになります。
?MMC/SDカードとの通信の配線はトラ技2006年4月号のR8C/15連載を参照してください。
?MMC/SDが壊れるので電源電圧はDC3.3Vで駆動してください。MMC/SDの耐圧は上限3.7Vです。(256MBのSDに5Vを加えて5枚壊しました(泣))
?すべては自己責任で。何があっても責任取れません。自由に使ってください。
では
/***********************************************************************/ /* */ /* FILE :MMC_TRG_1.c */ /* DATE :Fri, Apr 21, 2006 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :Other */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.0). */ /* */ /***********************************************************************/ #include#define MMC_SCS p3_4 void set_CLK20(void); void init_AD(void); void init_PWM(void); //////////////////////////////////////////////// void set_CLK20(void){ prc0=1; cm1=0x08; cm0=0x08; asm("nop"); asm("nop"); asm("nop"); asm("nop"); ocd2=0; prc0=0; } //////////////////////////////////////////////// void init_PWM(void){ //--------------------------- // timer C //--------------------------- tcc00=0; tcc02=0; tcc01=0; //f1 select tcc12=1; tcc13=1; //output compare mode tcc15=1; tcc14=1; //Compare0 much -> output='H' tcc17=1; tcc16=0; //compare1 much -> output='L' tcout6=0; //output is not reverse tcout1=0; tcout3=0; //for test tcout2=1; //enable CMP0_2/AN10/p1_2 p1_2=1; //enable output pd1_2=1; tm1=0x02ef; tm0=0x0000; //cmp1ic = 0x06; // コンペア1割り込み許可(レベル6) tcc00=1; //--------------------------- // timer Z //--------------------------- tzmr = 0x50; pum = 0; tcss = 0x0; tzs = 1; prez = 0; //--------------------------- // timer X //--------------------------- // pd1_7 = 0; // txmr = 0x11; // prex = 0; // txs = 1; // } //////////////////////////////////////////////// void init_AD(void){ /* A/D */ md = 0; // adgsel0 = 1; // p1 group chosen ch2 = 1; // chosen AN8/p1_0 ch1 = 0; ch0 = 0; adcap = 0; // A/D starting bit switch 0:starts by setting adst cks1 = 0; // f2 cks0 = 1; bits = 1; // 10bit mode vcut = 1; // Vref turn on smp = 1; // sample & Hold enable // adic = 0x06; //enable AD interrupt drr0=1; pd1_0=0; p1_0=1; drr1=1; pd1_1=0; p1_1=1; } //////////////////////////////////////////////// // MMC read & write //////////////////////////////////////////////// void main(void){ char dummy; int w,i; set_CLK20(); //////////////// init port ///////////////////// p3=0b10010000; pd3=0b10010000; //////////////// init AD /////////////////////// //-------------------------- init_AD(); init_PWM(); adst = 1; //conversion start //-------------------------- p1_6 = 1; pd1_6 = 0; //input //pd1_5 = 1; //p1_5=1; sser=0; ssmr2= 0x41; sscrh=0x60; //master f1/256 ssmr=0x08; sssr=0; ///////////////////////////////////////////////// // MMC initialize // sser = 0x10 means te=1 re=0 // sser = 0x08 means te=0 re=1 ///////////////////////////////////////////////// sser = 0x10; //te=1 re=0 for(w=10;w!=0;w--) { while(!tdre_sssr); sstdr = 0xff; } while(!tend_sssr); //wait transmit ///////////////////////////////////////////////// // transmit CMD0 ///////////////////////////////////////////////// MMC_SCS = 0; sser = 0x10; //te=1 re=0 while(!tdre_sssr); sstdr = 0xff; //dummy while(!tend_sssr); while(!tdre_sssr); sstdr = 0x40; //CMD0=40_0000_0000_95h while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x95; while(!tdre_sssr); while(!tend_sssr); //wait trans end //---------------------------- // wait R1 resp //---------------------------- sser = 0x08; //te=0 re=1 rsstp_sscrh=1; //receive 1 byte dummy = ssrdr; //dummy read for(w=16;w!=0;w--) { while(!rdrf_sssr); //wait resp dummy = ssrdr; if(!(dummy & 0x80))break; }//timed out ///////////////////////////////////////////////// // transmit CMD1 ///////////////////////////////////////////////// do{ sser = 0x10; //te=1 re=0 orer_sssr = 0; //clear overrun flag while(!tdre_sssr); sstdr = 0xff; //dummy while(!tend_sssr); while(!tdre_sssr); sstdr = 0x41; //CMD1=41_00FF_8000_99h while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0xff; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x80; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x99; while(!tdre_sssr); while(!tend_sssr); //wait trans end //---------------------------- // wait R1 resp //---------------------------- sser = 0x08; //te=0 re=1 orer_sssr=0; //clear overrun flag rsstp_sscrh=1; //receive 1 byte dummy = ssrdr; //dummy read for(w=16;w!=0;w--) { while(!rdrf_sssr); //wait resp dummy = ssrdr; if(!(dummy & 0x80))break; }//timed out }while(dummy != 0x00); for (w=100;w!=0;w--); //wait exiting In-Idle-State // sser = 0; sscrh = 0x66; //master, f1/4 /* ///////////////////////////////////////////////// // transmit CMD25(multiple write) ///////////////////////////////////////////////// do{ sser = 0x10; //te=1 re=0 orer_sssr = 0; //clear overrun flag while(!tdre_sssr); sstdr = 0xff; //dummy while(!tend_sssr); while(!tdre_sssr); sstdr = 0x59; //CMD25=59_0000_0000_01h while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x01; while(!tdre_sssr); while(!tend_sssr); //wait trans end //---------------------------- // wait R1 resp //---------------------------- sser = 0x08; //te=0 re=1 orer_sssr = 0; //clear overrun flag rsstp_sscrh = 1; //receive 1 byte dummy = ssrdr; //dummy read for(w=16;w!=0;w--) { while(!rdrf_sssr); //wait resp dummy = ssrdr; if(!(dummy & 0x80))break; }//timed out }while(dummy != 0x00); //---------------------------- // start writing //---------------------------- while(1){ while(!rdrf_sssr); sser = 0x10; //te=1 re=0 orer_sssr = 0; //clear overrun flag while(!tdre_sssr); sstdr = 0xfc; //multiple write start token while(!tend_sssr); for(w=256;w!=0;w--){ while(!tdre_sssr); while(!ir_adic); //AD conversion finished? while(!ir_cmp1ic); tm0 = ad >> 3; sstdr = tm0; // write DATA ch0 = 1; //change AN8/AN9 adst = 1; while(!tend_sssr); while(!tdre_sssr); while(!ir_adic); //AD conversion finished? while(!ir_tzic); tzsc = 255; //Low period dummy = ad >> 3; //High period tzpr = dummy; sstdr = dummy; // write DATA ch0 = 0; adst = 1; while(!tend_sssr); } // while(!tend_sssr); while(!tdre_sssr); sstdr = 0xff; //CRC while(!tend_sssr); while(!tdre_sssr); sstdr = 0xff; //CRC while(!tend_sssr); //---------------------------- // receive resp. //---------------------------- while(!tdre_sssr); sser = 0x08; //te=0 re=1 orer_sssr=0; //clear overrun flag rsstp_sscrh=1; //receive 1 byte dummy = ssrdr; //dummy read while(1){ while(!rdrf_sssr); if*1break; }//timed out //}while(dummy != 0x00); dummy = ssrdr; //----------------------------- // read start //----------------------------- while(1){ while(!rdrf_sssr); if(ssrdr==0xfe){ //get start token? for(w=256;w!=0;w--){ while(!rdrf_sssr); while(ir_cmp1ic==0); dummy = ssrdr; tm0 = dummy; for(i=17;i!=0;i--);44.1kHz while(!rdrf_sssr); while(!ir_tzic); tzsc = 255; //Low period tzpr = ssrdr; //High period } while(!rdrf_sssr); dummy = ssrdr; //CRC while(!rdrf_sssr); dummy = ssrdr; //CRC } } while(1); }
*1:ssrdr&0x0f)==5)break; //get resp. } while(1){ while(!rdrf_sssr); if(ssrdr!=0)break; //wait busy } if(p1_6==0)break; } while(!rdrf_sssr); sser = 0x10; //te=1 re=0 orer_sssr = 0; //clear overrun flag while(!tdre_sssr); sstdr = 0xff; //dummy while(!tend_sssr); while(!tdre_sssr); sstdr = 0xfd; //stop tran token while(!tdre_sssr); while(!tend_sssr); //////////////////////////////////////////////// sser = 0x08; //te=0 re=1 orer_sssr=0; //clear overrun flag dummy = ssrdr; while(1){ while(!rdrf_sssr); if(ssrdr != 0x00)break; //wait busy } while(1){ while(!rdrf_sssr); if(ssrdr != 0x00)break; } //wait while(!rdrf_sssr);*/ ///////////////////////////////////////////////// // transmit CMD18(multiple read) ///////////////////////////////////////////////// //do{ sser = 0x10; //te=1 re=0 orer_sssr = 0; //clear overrun flag while(!tdre_sssr); sstdr = 0xff; //dummy while(!tend_sssr); while(!tdre_sssr); sstdr = 0x52; //CMD18=52_0000_0000_01h while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x00; while(!tend_sssr); while(!tdre_sssr); sstdr = 0x01; while(!tdre_sssr); while(!tend_sssr); //wait trans end //---------------------------- // wait R1 resp //---------------------------- sser = 0x08; //te=0 re=1 //orer_sssr = 0; //clear overrun flag rsstp_sscrh = 1; //receive 1 byte dummy = ssrdr; //dummy read for(w=16;w!=0;w--) { while(!rdrf_sssr); //wait resp dummy = ssrdr; if(!(dummy & 0x80