This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/LAUNCHXL-CC2650:用于 CC2650的 FATFS 模块无法正常工作

Guru**** 2551120 points
Other Parts Discussed in Thread: LAUNCHXL-CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/588674/rtos-launchxl-cc2650-fatfs-module-for-cc2650-does-not-work

器件型号:LAUNCHXL-CC2650

工具/软件:TI-RTOS

因此、我能够通过端口 SDSPI 向 SD 卡写入/读取原始数据。 当我尝试将 FATFS 模块导入我的项目时、我的 f_mount 和 f_mkdir 不起作用。 我的 sns芯 片组如下所示:

#include 
#include "Board.h"
#include "sd.h"
#include "ti/mW/fatfs/ff.h"

FIL src;
FRESULT fr;
FATFS FatFs_SDCARD;

if (!sd_open (&extFlashState)){
System_printf ("ExtFlash_open 失败\n");
转至清理
;}

SD_IOctrl (&extFlashState、get_secte_count、&n);

FR =-1;
FR = f_mount (&FatFs_SDCARD、"0:"、1);


if (fr = FR_OK){
System_printf ("驱动器已安装...");
}
否则{
System_printf ("错误!!!!");
}

fr = f_mkdir ("testdir");
if (fr = FR_OK){
System_printf ("创建的目录");System_flush ();
}
其他
System_printf ("错误:\n"fr);System_flush (); 

两个函数调用都会打印出错误。 是否需要修改 diskio/ff 文件以使其与 SDSPI (sd.h sd.c)配合使用?

谢谢、

Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Henry、

    由于这个问题与 TI-RTOS 最相关、我将进入他们的论坛、看起来他们能够提供最佳支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是 TI-RTOS 的哪个版本? 您是否正在调用 disk_register 将驱动程序连接到 FatFS?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Sean 和 Todd、

    很抱歉,我本应该更清楚地说明这一点。 我在 TI LaunchXL-CC2650平台上使用 TIROS_cc13xx_cc26xx_2_21_00_06和 CCS 7.1 。

    在我的 sd.h 和 SD/c 文件中、我有一些与 SPI 通信的函数(SPI_CLOSE、SPI_OPEN、SPI_PARAMS_INIT、SPI_TRANSF...) 以及一些修改 diskio.c 中函数的函数(初始化、diskWrite、diskRead、Ioctrl)。

    这是我的 SD SPI 协议、是我正在处理的项目的第一部分。 它能够使用 diskRead 和 diskWrite 对 SD 卡进行初始化、获取介质大小(get_sector_count)、读取原始数据并将其写入。 但是、我没有使用 diskio.c 函数原型中的驱动器编号、而是使用一个存储 SPI_Handle、SPI_params、PIN_Handle、...的 SD 对象。 至芯片选择、sendcmd、从 SPI 总线(rxSPI、txSPI)读取数据和向 SPI 总线写入数据。

    如果我想 实施 FatFS 系统以使用这些函数、我应该怎么做? (我没有调用 disk_register)

    谢谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Disk_register 将所有函数挂钩到 FatFS 模块中。 您可以查看 FatFS 文档以了解更多详细信息。 下面是一个 SPI 闪存驱动程序也被连接到网络 上的 FatFS的示例:processors.wiki.ti.com/.../TI-RTOS_Examples_SerialFlash。 当然、它适用于不同的器件和闪存类型、但将驱动程序连接到 FatFS 的概念是相同的。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Todd 的帮助。 如果我花了一些时间来尝试一下、如果遇到混淆/问题、您是否介意再回来寻求额外帮助? 这是我第一次使用 RTOS。

    谢谢、
    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    我在这里有一个问题:我看到你有一个 disk_register 函数、该函数挂钩其他函数(init、Ioctrl、读取、写入、状态)、并在你的 AT45DBFatFs_open 函数中调用。 需要挂钩的函数是否必须具有相同的格式(参数的数量和类型?)
    由于我的版本稍有不同、因此我没有 Uchar drv、并且使用包含 SPI_Handle、SPI_params、PIN_Handle、PIN_STATUS...的新定义类型

    ----------

    已编辑:

    NVM、似乎它们需要采用相同的格式、我正在尝试编写包装程序函数以查看其是否正常工作。


    谢谢、
    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的。 它们需要相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的患者 Todd。

    ...it's 非常奇怪。 我已经到了它能够初始化所有内容、注册新的 disk_*()函数(disk_register)、但停留在函数 f_mount 的地步。 其 fresult 返回 FR_DISK_ERR (在低级磁盘 I/O 层中发生硬错误)。 尽管我尝试在 Windows 上手动格式化 SD 卡。

    代码片段如下所示:

    if (!sd_open (&extFlashState)){//init SPI 和 open PIN
    System_abort ("ExtFlash_open 失败\n");
    转至清理
    ;}
    
    SD_IOctrl (&extFlashState、get_secte_count、&n);//获取扇区数
    system_printf ("扇区的编号:%d\n"n);System_flush ();
    
    if (extFlashState.SPI.Handle == NULL){
    System_abort ("SPI_open failed\n");
    转至清理
    ;}
    CC26xxFATFS_INIT (extFlashState);
    CC26xxFATFS_PARAMS_INIT (&params);
    Handle = CC26xxFATFS_OPEN (extFlashState.SPI.Handle、&params、drive_NUM);
    
    if (handle =NULL || extFlashState.SPI.handle == NULL){
    system_abort ("CC26xxFATFS_open 失败\n");
    转至清理
    ;}
    //此处函
    
    
    数 CC26xxFATFS_OPEN 失败:
    
    CC26xxFATFS_Handle CC26xxFATFS_OPEN (SPI_Handle spiHandle、
    CC26xxFATFS_Params *参数、UINT drv)
    {
    DRESULT 结果;
    FRESULT fresult;
    通用 密钥;
    
    if (drv >_volumes){
    返回(NULL);
    }
    CC26xxFATFS_Handle handle =&(CC26xxFATFObjects[drv]);
    
    /*确定设备是否已打开*/
    KEY = Hwi_disable();
    if (handle->driveNumber!= CC26xxFATFS_DRIVE_NOT LOADed){
    Hwi_restore (key);
    返回(NULL);
    }
    /*标记为正在使用*/
    handle->driveNumber = drv;
    Hwi_restore (key);
    
    /*注册新的 disk_*()函数*/
    dresult = disk_register (handle -> driveNumber、
    CC26xxFATFS_diskInitialize、
    CC26xxFATFS_diskStatus、
    CC26xxFATFS_diskRead、
    CC26xxFATFS_diskWrite、
    CC26xxFATFS_diskIoctrl);
    
    /*检查驱动器错误*/
    if (dresult!= RES_OK){
    log_error1 ("未注册磁盘功能@驱动器编号%d "、
    handle->driveNumber);
    
    CC26xxFATFS_CLOSE (句柄);
    返回(NULL);
    }
    
    //sd_open (&handle->sd_Obj);
    
    fresult = f_mount (&(handle->filesystem)、&(handle->driveNumber)、1);
    log ("fresult结果 位于 f_mount %d\n"、fresult");
    if (fresult!= FR_OK){
    log_error1 ("\nCC26xxFATFS 驱动器未安装@驱动器编号%d\n"、
    handle->driveNumber);
    //此处失败
    CC26xxFATFS_CLOSE (句柄);
    返回(NULL);
    }
    
    Log_Print1 (Diags_User1、"CC26xxFATFS 已打开@驱动器编号%d)、
    handle->driveNumber);
    返回(句柄);
    }
    

    我的输出值如下:

    [Cortex_M3_0]启动
    SD_open 启动
    SD_initialize 启动
    SD_initialize 结束 
    卡类型:3 SD_OPEN 扇 区结束编号:7774208 磁盘状态:0 SD_OPEN START SD_diskRead 在 f_mount 后启动 SD_diskRead 结束 fresult 1 CC26xxFATFS 驱动器未安装@驱动器编号0 CC26xxFATFS_open 失败

    您是否对我如何解决它有任何想法? 在 disk_read、disk_write 或 disk_ioctl 函数中的某个位置似乎存在错误、但我找不到错误。

    谢谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我感到困惑的是,如果我将 f_mount 函数更改为延迟装载(第3个参数 f_mount (&(handle ->文件系统)、(TCHAR*)&(handle->driveNumber)、0);)我的 f_open 稍后会抱怨相同的东西, FR_disk_ERR。

     disk 函数中的错误是否是我挂钩到 disk_register 中的错误?

    谢谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Huy、

    我删除了另一个线程。 听起来一切都很好。 问题是什么?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嘿、Todd、抱歉、我的问题是我没有验证路径、所以在函数 f_open 中调用时它会卡住。

    Henry