2013-05-15 8 views
1

SPI를 사용하여 SD 카드와 통신하는 수단으로 FatFS (http://elm-chan.org/fsw/ff/00index_e.html)를 사용하려고합니다.dsPIC의 FatFS 일반 예 수정

FatFS 웹 사이트에는 여러 가지 예가 있지만 이해하기 쉽거나 따르기가 쉽지 않습니다. 두 가지 예제가 다운로드 가능한 zip에 적용됩니다. 하나는 '일반'마이크로 컨트롤러 용이고 다른 하나는 PIC24 용입니다. PIC24가 이상적으로 내 dsPIC33F와 비슷하게 보일지라도 코드는 이해하기가 쉽지 않으며 특정 응용 프로그램을 사용하면 신경 쓰지 않아도됩니다.

일반 코드는 훨씬 이해하기 쉽고, txt 파일을 작성하고 쓰고 닫는 아주 간단한 응용 프로그램을 수행합니다. 그러나, 내 PIC와 함께 작동하도록 코드를 변경하는 데 어려움을 겪고 있습니다.

나는 dsPIC33FJ128GP802를 가지고 있습니다. 나는 SPI 핀을 다시 매핑 일반적인 예에 ​​코드를 추가 한 내부 오실레이터를 설정하고, 설정하고 SPI 모듈 시작했습니다

// Configure Oscillator to operate the device at 40Mhz 
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 
// Fosc= 8M*40/(2*2)=80Mhz for 8M input clock 
PLLFBD = 38; // M=40 
CLKDIVbits.PLLPOST = 0; // N1=2 
CLKDIVbits.PLLPRE = 0; // N2=2 
OSCTUN = 0;    // Tune FRC oscillator, if FRC is used 

// Unlocks PPS, make change, and locks again. 
__builtin_write_OSCCONL(OSCCONL & ~(1 << 6)); 

// OUTPUT 
RPOR6bits.RP12R = 7; // RP12 = SDO1 which is SPI1 DATA OUTPUT. 
RPOR7bits.RP15R = 8; // RP15 = SCK1OUT which is SPI1 CLOCK OUTPUT. 

// INPUT 
RPINR21bits.SS1R = 13; // RP13 = SS1R which is SPI1 SLAVE/CHIP SELECT. 
RPINR20bits.SDI1R = 14; // RP14 = SDI1R which is SPI DATA INTPUT. 

__builtin_write_OSCCONL(OSCCONL | (1 << 6)); 

SPI1STAT = 0; 
SPI1STATbits.SPIEN = 0; // Disable SPI module. 
SPI1STATbits.SPISIDL = 0; // Continue in idle mode. 
SPI1STATbits.SPIROV = 0; // No overflow. 
SPI1STATbits.SPITBF = 0; // Transmit started, SPIxTXB is empty. 
SPI1STATbits.SPIRBF = 0; // Receive is not complete, SPIxRXB is empty. 

SPI1CON1 = 0; 
SPI1CON1bits.DISSCK = 0; // Internal clock enabled. 
SPI1CON1bits.DISSDO = 0; // SD0 controlled by the module. 
SPI1CON1bits.MODE16 = 0; // 8 bit mode. 
SPI1CON1bits.SMP = 0; // Input data sampled at middle of data output time. 
SPI1CON1bits.CKE = 1; // Serial output data changes on transition from idle. 
SPI1CON1bits.SSEN = 0; // Slave select is not used by the module. 
SPI1CON1bits.CKP = 0; // Idle state for clock is low. 
SPI1CON1bits.MSTEN = 1; // Master mode enabled. 
SPI1CON1bits.SPRE = 0b000; // Secondary prescale 8:1 
SPI1CON1bits.PPRE = 0b01; // Primary prescale 16:1. 

SPI1CON2 = 0; 
SPI1CON2bits.FRMEN = 0; // Framed SPI disabled. 
SPI1CON2bits.SPIFSD = 0; // Framed sync pulse output.(N/A) 
SPI1CON2bits.FRMPOL = 0; // Framed sync pulse is active-low.(N/A) 
SPI1CON2bits.FRMDLY = 0; // Framed sync pulse precedes first bit clock.(N/A) 

SPI1STATbits.SPIEN = 1; // Enable SPI module. 

SD 카드 PIC는 다음과 같습니다

  • RP15을 , SPI 클럭 출력, SCK
  • RP14, SPI 데이터 입력, DO (데이터 출력).
  • RP13, SPI 슬레이브 선택, CS.
  • RP12, SPI 데이터 출력, DI (데이터 입력).
  • SD 카드 CD가 연결되지 않았습니다.

FatFS 사용 경험이있는 사람이 필요한 변경을 할 수 있도록 도와주세요. 지금까지 코드를 실행하면 오류 FR_NOT_READY를 반환하는 f_open까지 도달합니다.

지금은 아무 것도하지 않으려 고합니다. 그냥 파일을 만들어서 쓰십시오. 필자는 외부 크리스털 발진기를 사용하는 많은 어플리케이션을 보았습니다. 이것이 SPI의 필요성입니까? SPI를 처음 접했고 I2C를 사용하기 시작했습니다.

일반 예제에 대한 mmcbb.c 파일 내에서 내가 얻은 오류를 제거하기 위해 몇 가지 변경 사항을 적용해야했지만, 지연 기능은 내 자신의 기능으로 대체하여 비슷한 타이밍의 지연을 생성했습니다. 오류가 발생하면서 disk_initialize (BYTE pdrv)에 나타나는 INIT_PORT()도 제거했는데 오류가 발생하여 포트를 초기화하기 전에 FatFS 코드로 들어가기 전에 포트를 초기화했습니다.

#define CS_H()  PORTBbits.RB13 |= 0x01 /* Set MMC CS "high" */ 
#define CS_L()  PORTBbits.RB13 &= 0xFE /* Set MMC CS "low" */ 
#define CK_H()  PORTBbits.RB15 |= 0x02 /* Set MMC SCLK "high" */ 
#define CK_L()  PORTBbits.RB15 &= 0xFD /* Set MMC SCLK "low" */ 
#define DI_H()  PORTBbits.RB14 |= 0x04 /* Set MMC DI "high" */ 
#define DI_L()  PORTBbits.RB14 &= 0xFB /* Set MMC DI "low" */ 
#define DO  (PORTBbits.RB12 & 0x08) /* Test for MMC DO ('H':true, 'L':false) */ 
: mmcbb.c의 상단에 (제가 위에서 설정 RBX 핀이 RPX와 동일) 해당 포트를 필요 #DEFINE는 내가했던 SPI를 설정하는 방법에 추가 할 수있다

비트 연산자가 이미 있었고, PORTBbits.RBxx를 추가하기 만했습니다.

모든 변경 사항이 있지만 특히 SD 카드 조작에 대한 모든 라이브러리 (FatFS 및 MDDFS) 사용에 대한 정보를 찾는 것으로 나타났습니다. 어떤 도움을 주시면 감사하겠습니다!

답변

1

로 분류됩니다. 많은 부분이 변경되어이 공간을 보았습니다. 곧 코드와 일부 정보를 업로드하여 곧이 상황에서 다른 사람들을 도울 수 있기를 바랍니다.