読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

ここらでソース公開

いま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ファイルを再生できる、しかもデータロガーにもなるオーディオプレーヤを作るのが目標やった。。。

というわけで、ここらで今までの成果を(あまり進化してないけど)少しばかり。

f:id:Lynx-EyED:20060513235630j:image

?再生は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