我试图使用FatFS (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.图片至SD卡是:
有FatFS经验的人能帮我做必要的改动吗?到目前为止,运行代码的距离一直到f_open,在那里它返回错误FR_NOT_READY。
现在,我不想做任何花哨的事情,只需创建一个文件并将其写入。我见过许多使用外部晶体振荡器的应用程序,但我没有。这对SPI来说是必需的吗?我对SPI很陌生,在此之前我一直在使用I2C。
在这个通用示例的mmcbb.c文件中,我不得不进行一些更改以删除我所得到的一些错误,我用自己的函数替换了他们的延迟函数,以创建一个与抛出错误的时间类似的延迟,我还删除了在disk_initialize(字节pdrv)中出现的disk_initialize(字节pdrv)中出现的当它抛出一个错误时出现的disk_initialize(),并在进入任何FatFS代码之前初始化了端口,就在主代码开始时。在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)。任何帮助都将不胜感激!
发布于 2013-05-17 15:09:01
整理好了。很多东西都变了,所以请看这个空间,我很快就会上传代码和一些信息,希望它能在这种情况下帮助其他人。
https://stackoverflow.com/questions/16571982
复制相似问题