首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑FatFS泛型示例用于dsPIC

编辑FatFS泛型示例用于dsPIC
EN

Stack Overflow用户
提问于 2013-05-15 18:03:00
回答 1查看 1.8K关注 0票数 1

我试图使用FatFS (e.html)作为一种使用SPI与SD卡进行通信的方式。

FatFS网站有很多例子,但我发现它们不容易理解或遵循。在可下载的zip中,有两个例子适用于我,一个是通用的微控制器,另一个是PIC24。虽然PIC24看起来与我的dsPIC33F非常相似,但是代码很难理解,因为我并不关心特定的应用程序。

泛型代码更容易理解,并且执行一个非常简单的应用程序,创建一个txt文件,写入它,然后关闭它。但是,我很难修改代码来使用我的PIC。

我拿到了dsPIC33FJ128GP802。我在通用示例中添加了代码,以重新映射SPI引脚,设置内部振荡器,并设置和启动SPI模块:

代码语言:javascript
复制
// 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卡是:

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

有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相同):

代码语言:javascript
复制
#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)。任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 15:09:01

整理好了。很多东西都变了,所以请看这个空间,我很快就会上传代码和一些信息,希望它能在这种情况下帮助其他人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16571982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档