#include <24FJ64GA002.h> #fuses FRC,NOJTAG,OSCIO,NOWDT,NOPROTECT//内部クロック #use delay(internal=8000000) //クロック8MHz #pin_select U1TX=PIN_B7 #pin_select U1RX=PIN_B6 #use RS232(BAUD=9600,xmit=PIN_B7,rcv=PIN_B6) #define WT 20 #define CS PIN_B5 #define DI PIN_B4//SDCのDIに繋がってる #define CLK PIN_B3 #define SDO PIN_A2//SDCのDOに繋がってる //int8 cmd_list[8]={0,1,16,17,24}; // 0リセット 1初期化 16ブロック長 17リード 24ライト] int8 indata[512]; int8 file[10][32]; void w_spi8(int8 cmd){ int j; output_low(CS); for(j=0;j<8;j++){ if(cmd&0x80) output_high(DI); else output_low(DI); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); cmd<<=1; } //output_high(CS); } void dum8(){ int j; output_high(CS); for(j=0;j<8;j++){ output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); } output_low(CS); } void w_spi(int data){//16bitのデータ送信 int j; output_low(CS); for(j=0;j<16;j++){ if(data&0x8000) output_high(DI); else output_low(DI); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); data<<=1; } //output_high(CS); } void w_spi32(long data){//32bitのデータ送信 int j; output_low(CS); for(j=0;j<32;j++){ if(data&0x80000000) output_high(DI); else output_low(DI); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); data<<=1; } //output_high(CS); } int8 get_spi(){//spiデータを得る int j; int8 data; data=0; output_low(CS);//CSアサートにして output_high(DI); /* while(input(SDO)==1){//0がくるまで待ち output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); }*/ for(j=0;j<7;j++){ if(input(SDO)==0)data=data|0; else data=data|1; //data=data|input(SDO); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); data<<=1; } data=data|input(SDO); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); //output_high(CS); return data; } void s_write(long address,int8 data[]){//シングルスレッドライト int8 res=0xff; int j; get_spi();//8クロック流す get_spi();//念のためもう一回 res=0xff;dum8(); w_spi8(0b01011000);//CMD24 w_spi32(address); w_spi8(0); while(res==0xff) res=get_spi();//レスポンス得る //====================================================== printf("test:%x\n\r",res); delay_ms(200);res=0xff; //====================================================== get_spi();//8bitクロック output_low(CS); output_low(DI); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); for(j=0;j<512;j++){ w_spi8(data[j]); } res=0xff; while(res==0xff) res=get_spi();//レスポンス得る //====================================================== printf("test:%x\n\r",res); delay_ms(200);res=0; //====================================================== while(res!=0xff) res=get_spi();//busy待ち get_spi();//8bitクロック get_spi();//念のためもう一回 } int8 get_spi2(){//spiデータを得る int j; int8 data; data=0; output_low(CS);//CSアサートにして output_high(DI); for(j=0;j<16;j++){ output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); } for(j=0;j<7;j++){ if(input(SDO)==0)data=data|0; else data=data|1; //data=data|input(SDO); output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); data<<=1; } data=data|input(SDO); //output_high(CS); return data; } void init(){ int8 makedata[512]; int8 crc; int j,i; long a1,a2,a3; int8 res,res2=1; crc=0;res=0xff; delay_ms(200);//電源安定待ち for(j=0;j<512;j++) makedata[j]=0; for(j=0;j<20;j++) makedata[j]=0x63; output_high(DI); output_high(CS); for(j=0;j<90;j++){//74クロック以上入れる output_high(CLK); delay_us(WT); output_low(CLK); delay_us(WT); } output_low(CS); w_spi8(0x40);//CMD0 w_spi32(0); w_spi8(0x95);//CRC while(res==0xff) res=get_spi();//レスポンス受ける //================================================== //確認用 //printf("%x\n\r",res); // delay_ms(200); //================================================== res=0; while(1){res=0xff; dum8(); w_spi8(0x41);//CMD1 w_spi(0); w_spi(0); //w_spi8(0b11111001); //crc++; while(res==0xff) res=get_spi();//レスポンス受ける res2<<=1; if(res==0) break; //============================================================= //確認用 // printf("%x::%x\n\r",res,res2); // delay_ms(200); //============================================================= } //================================================ //確認用 //output_high(PIN_B11); //=============================================== res=0xff;dum8(); w_spi8(0x50);//CMD16 w_spi(0x0000); //512byte受信に設定 w_spi(0x0200); w_spi8(0); while(res==0xff) res=get_spi(); //============================================================= //確認用 //============================================================= res=0xff;dum8(); w_spi8(0x51);//CMD17 w_spi(0x0000); //受信モードにセット w_spi(0x0000); w_spi8(0); while(res==0xff) res=get_spi(); res=0xff; //============================================================= //確認用 printf("CMD17:%x:\n\r",res); delay_ms(200);res=0xff;dum8(); //============================================================= while(res==0xff) res=get_spi(); for(j=0;j<512;j++){ indata[j]=get_spi(); } output_high(DI); // for(j=446;j<461;j++){ // printf("%x ",indata[j]); // delay_ms(200); // } //delay_ms(200); a1=indata[454]&0xff; get_spi();//8クロック流す get_spi();//念のためもう一回 res=0xff;dum8(); w_spi8(0x51);//CMD17 w_spi32(a1*512); w_spi8(0); while(res==0xff) res=get_spi(); res=0xff; //============================================================= //確認用 printf("CMD17:%x:\n\r",res); delay_ms(200);res=0xff;dum8(); //============================================================= while(res==0xff) res=get_spi(); for(j=0;j<512;j++){ indata[j]=get_spi(); } a2=indata[22]&0xff; get_spi();//8クロック流す get_spi();//念のためもう一回 res=0xff;dum8(); w_spi8(0x51);//CMD17 w_spi32((0x0300)*512); w_spi8(0); while(res==0xff) res=get_spi(); res=0xff; //============================================================= //確認用 printf("%x\n\r",a2); delay_ms(200); //============================================================= while(res==0xff) res=get_spi(); for(i=0;i<10;i++){ for(j=0;j<32;j++){ file[i][j]=get_spi(); } } for(i=0;i<512-320;i++) get_spi(); for(i=0;i<10;i++){ if(file[i][0]!=0xe5&&file[i][0]!=0){ a3=file[i][27]&0xff; a3<<=8; a3=a3|(file[i][26]&0xff); } } get_spi();//8クロック流す get_spi();//念のためもう一回 get_spi();//8クロック流す get_spi();//念のためもう一回 res=0xff;dum8(); w_spi8(0x51);//CMD17 w_spi32((a1+a2+a2+33)*512); w_spi8(0); while(res==0xff) res=get_spi(); //============================================================= //確認用 printf("%x::%x\n\r",a1,a2); delay_ms(200); res=0xff;dum8(); //============================================================= while(res==0xff) res=get_spi(); for(j=0;j<512;j++){ indata[j]=get_spi(); } for(j=0;j<30;j++){ printf("%x:",indata[j]); delay_ms(200); } s_write((a1+a2+a2+33)*512,makedata); } void main(){ init(); while(1){ } }