#include "p24FJ64GA002.h" #include "spi.h"//spi _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1 & FWDTEN_OFF) _CONFIG2(IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) #define CLOCK 32 #define SPI1_CS LATBbits.LATB6 #define SPI1_CLK LATBbits.LATB7 #define SPI1_DO LATBbits.LATB8 #define LED1 LATAbits.LATA0 #define LED2 LATAbits.LATA1 #define SW1 PORTBbits.RB2 void delay_us(int usec);//usec void delay_ms(int msec);//msec void mmc_spi(void);//mmcをspiモードへ unsigned int SPICONValue1 = ENABLE_SCK_PIN & ENABLE_SDO_PIN & SPI_MODE8_ON & SPI_SMP_ON & SPI_CKE_OFF & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_LOW & MASTER_ENABLE_ON & SEC_PRESCAL_1_1 & PRI_PRESCAL_1_1; unsigned int SPICONValue2 = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & FRAME_POL_ACTIVE_HIGH & FRAME_SYNC_EDGE_COINCIDE & FIFO_BUFFER_ENABLE; unsigned int SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR; unsigned int SPI1_RES; int main(void){ int i = 0; int swck = 0; //io TRISA = 0x0000;//0x0000,0000,0000,0000 TRISB = 0x0224;//0x0000,0010,0010,0100 CNPU1 = 0x0040;//0x0000,0000,0100,0000 CNPU2 = 0x09E0;//0x?000,1001,1110,0000 AD1PCFG = 0xFFFF;//アナログ入力設定0でアナログ1でデジタル。初期はオール0。 //spi RPINR20bits.SDI1R = 9; RPOR4bits.RP8R = 7;//7=dataout RPOR3bits.RP7R = 8;//8=clock OpenSPI1(SPICONValue1,SPICONValue2,SPISTATValue); ConfigIntSPI1(SPI_INT_DIS & SPI_INT_PRI_6); LATAbits.LATA0 = 0; LATAbits.LATA1 = 0; //mmc_spi(); SPI1_CS = 1; delay_ms(1000); while(1){ if(SW1 == 0){ if(swck == 0){ delay_ms(10); if(SW1 == 0){ mmc_spi(); swck = 1; } } }else{ swck = 0; } }//while }//main void mmc_spi(void){ //int SPI1_RES = 0; int i = 0; int delay_r = 0; SPI1_CS = 1; SPI1_CLK = 1; SPI1_DO = 1; for(i=0;i<10;i++) WriteSPI1(0xFFFF);//ダミークロック80up delay_r = 2; while(delay_r > 0) delay_r--;//クロックタイミングが合わないので遅延 SPI1_CS = 0;//SDチップセレクト //CMD0 0x400000000095 の送信 WriteSPI1(0x40); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x95); while(ReadSPI1() != 0x01){//spiレスポンス受信 WriteSPI1(0xFFFF);//受信用ダミークロック } LED1 = 1;//デバッグ用LED1 while(ReadSPI1() != 0x00){//spiレスポンス受信 //CMD1 0x410000000095 の繰り返し送信 WriteSPI1(0x41); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x00); WriteSPI1(0x0095); WriteSPI1(0xFFFF);//受信用ダミークロック } LED2 = 1;//デバッグ用LED2 SPI1_CS = 1;//SDチップセレクト解除 WriteSPI1(0xFFFF);//ダミークロック } //----- usec_delay void delay_us(int usec){ usec = (int)(CLOCK*usec)/40; while(usec){ asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); usec--; } } //----- msec delay void delay_ms(int msec){ int i; for(i=0;i