#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_B2//SDCのDOに繋がってる //int8 cmd_list[8]={0,1,16,17,24}; // 0リセット 1初期化 16ブロック長 17リード 24ライト 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 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); } 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++){ 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 crc; int j; int8 res; crc=0; delay_ms(200);//電源安定待ち 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); } w_spi8(0b01000000);//CMD0 w_spi(0); w_spi(0); w_spi8(0b10010101);//CRC res=get_spi();//レスポンス受ける //================================================== //確認用 //get_spi(); //if(res==0x01) output_high(PIN_B12); // else if(res==0x00) output_low(PIN_B12); //else output_low(PIN_B13); printf("%x\n\r",res); delay_ms(200); //================================================== res=0; while(1){ w_spi8(0b01000001);//CMD1 w_spi(0); w_spi(0); w_spi8(0b11111001); //crc++; res=get_spi();//レスポンス受ける if(res==0) break; //============================================================= //確認用 // else if(res==0x01) output_high(PIN_B8); // else if(res==0x09) output_high(PIN_B14); //else output_low(PIN_B9); printf("%x\n\r",res); delay_ms(200); //============================================================= } //================================================ //確認用 output_high(PIN_B11); }//=============================================== void main(){ init(); while(1){ } }