编辑dsPIC的FatFS通用示例

时间:2013-05-15 18:03:00

标签: sd-card pic spi mplab fat

我正在尝试使用FatFS(http://elm-chan.org/fsw/ff/00index_e.html)作为使用SPI与SD卡通信的方法。

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.

PIC到SD卡是:

  • RP15,SPI时钟输出,到SCK
  • RP14,SPI数据输入,DO(数据输出)。
  • RP13,SPI从机选择,到CS。
  • RP12,SPI数据输出,DI(数据输入)。
  • SD卡CD未连接。

对于有FatFS经验的人,请帮我做一些必要的修改。到目前为止运行代码到f_open,返回错误FR_NOT_READY。

现在我不想做任何花哨的事情,只需创建一个文件并写入它。我见过许多使用外部晶体振荡器的应用,我没有。这是SPI的必需品吗?我是SPI的新手,在此之前一直使用I2C。

在通用示例的mmcbb.c文件中,我必须进行一些更改以删除我得到的一些错误,他们用我自己的函数替换它们的延迟函数来创建类似计时的延迟一个错误,我还删除了出现在disk_initialize(BYTE pdrv)中的INIT_PORT(),因为它抛出了一个错误,我在进入任何FatFS代码之前初始化了端口,就在main的开头。在mmcbb.c的顶部有#define需要相应的端口添加到我设置SPI的方式,我做了(RBx引脚与我上面设置的RPx相同):

#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) */

按位运算符已经存在,我只是添加了PORTBbits.RBxx。

这是我所做的所有改变,但我发现有关使用任何库进行SD卡操作的信息特别难以在线(FatFS和MDDFS)。任何帮助将非常感谢!

1 个答案:

答案 0 :(得分:1)

排序。很多都改变了所以请看这个空间,我将很快上传代码和一些信息,所以希望它能在这种情况下帮助其他人。