查看: 5352|回复: 7

[求助] 关于SPI接口读写TF卡

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
    发表于 2020-5-18 11:44:38 | 显示全部楼层 |阅读模式
    本人最近刚开始接触NXP的MCU,有一个项目在用KL46Z的开发板,使用MCUXpresso的IDE+SDK。

    目前需要用SPI1口外接的TF卡做数据缓存,但不必要使用FatFS。所以看到SDK里有SDSPI的API,觉得可以直接使用的话会简单一点。

    但是调用此中间件时发现,不知如何与SPI的接口连接上,SDK的文档Chapter 33 SPI based Secure Digital Card (SDSPI) 里也没有说明。

    按我的理解这个中间件是在SPI函数的上层,因此应该有函数调用SPI 驱动里的函数,但是不知道如何运作的。查了很多帖子和文档依然困惑。

    不知哪位高人能详细指点一下。 如果这个SDSPI的中间件不能用的话,有什么解决方案更好么。如果能有基于MCUXpresso的IDE+SDK的代码分享就更好了。

    另外,TF卡用mBed的代码跑过,读写没有问题,因此硬件都是好的。

    多谢各位了!NXP community里的回答和文档一样让人迷惑,希望这里能有高人明示,感谢!
    我知道答案 目前已有7人回答
    头大~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
     楼主| 发表于 2020-5-18 11:55:54 | 显示全部楼层
    细节是这样的:

    SDSPI_Init(sdspi_card_t *card) 这个初始化函数用的结构体定义如下:
    typedef struct _sdspi_card
    {
        sdspi_host_t *host;       /*!< Host state information */
        uint32_t relativeAddress; /*!< Relative address of the card */
        uint32_t flags;           /*!< Flags defined in _sdspi_card_flag. */
         。。。。。。。(此处省略)
    } sdspi_card_t;

    其中 sdspi_host_t 结构体定义如下:
    typedef struct _sdspi_host
    {
        uint32_t busBaudRate; /*!< Bus baud rate */

        status_t (*setFrequency)(uint32_t frequency);                   /*!< Set frequency of SPI */
        status_t (*exchange)(uint8_t *in, uint8_t *out, uint32_t size); /*!< Exchange data over SPI */
    } sdspi_host_t;

    这两个结构体和SPI端口并无关联,如何对应到我用的SPI1口上?另外第一个结构体里的各种参数如何获取呢,还是初始化函数自己读取然后填入?
    头大~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25480
    最后登录
    2025-9-9
    发表于 2020-5-18 16:38:49 | 显示全部楼层
    stephenfz 发表于 2020-5-18 11:55
    细节是这样的:

    SDSPI_Init(sdspi_card_t *card) 这个初始化函数用的结构体定义如下:

    sdspi_card_t结构体你得自己在比如main里去定义变量然后自己初始化,sdspi_host_t结构体需要你去实现setFrequency,和exchange函数,然后同样你要定义这个结构体变量,然后把实现的函数地址传给变量。这两个函数实现最后是会调用spi的传输数据的函数。这个东西还是很复杂的,kl46貌似没有现成的代码,你最好要么换开发板,要么换个方案做数据缓存,要么一个人默默研究,你只能去参考其他的关于sd卡的代码,自己去看和改
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
     楼主| 发表于 2020-5-18 22:39:34 | 显示全部楼层
    本帖最后由 stephenfz 于 2020-5-18 22:43 编辑
    小恩GG 发表于 2020-5-18 16:38
    sdspi_card_t结构体你得自己在比如main里去定义变量然后自己初始化,sdspi_host_t结构体需要你去实现setF ...

    谢谢版主大人回复!

    终于明白了! 现在看换开发板可能不现实了,其他的存储方案目前也没头绪。惨了,看来尽快实现是不现实了

    不知道版主大人或各位高手有没有MCUXpresso的IDE+SDK工具链下的类似代码可以分享呢?再次感谢!!!
    SPI接口与TF通信部分的一些参数和细节还不是很清楚,望高人传授!感谢!
    头大~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25480
    最后登录
    2025-9-9
    发表于 2020-5-19 09:08:33 | 显示全部楼层
    stephenfz 发表于 2020-5-18 22:39
    谢谢版主大人回复!

    终于明白了! 现在看换开发板可能不现实了,其他的存储方案目前也没头绪。惨了,看来 ...

    你大概可以参考k64的库,有sdcard_polling例程你可以参考,例程还算简单
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
     楼主| 发表于 2020-5-19 12:27:13 | 显示全部楼层
    小恩GG 发表于 2020-5-19 09:08
    你大概可以参考k64的库,有sdcard_polling例程你可以参考,例程还算简单

    谢谢指点! 正在看K64F的例子,终于有头绪了

    这个例子里的结构体和函数的嵌套看得头都大了~

    有问题再请教,再次感谢!~
    头大~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
     楼主| 发表于 2020-6-1 10:06:24 | 显示全部楼层
    前段时间把这个问题解决了,分享一下给以后遇到此问题的朋友参考,思路和版主说的一样,就不多解释了,谢谢版主!

    status_t sd_spi_SetBps(uint32_t frequency)
    {
            uint32_t    sourceClock;
            //status_t    result;

            if (SD_SPI_BASE == SPI1)
                sourceClock = CLOCK_GetFreq(kCLOCK_CoreSysClk);
            else if (SD_SPI_BASE == SPI0)
                sourceClock = CLOCK_GetFreq(kCLOCK_BusClk);

            SPI_MasterSetBaudRate(SD_SPI_BASE, frequency, sourceClock);

            return kStatus_Success;
    }

    status_t sd_spi_Exchange(uint8_t *in, uint8_t *out, uint32_t size)
    {
            status_t status = kStatus_Success;

            // SPI transefer config
            spi_transfer_t    sd_spi_transfer = {
        .txData    = in,        // Send buffer
        .rxData    = out,       // Receive buffer
        .dataSize  = size       // Transfer bytes
        };

            status = SPI_MasterTransferBlocking(SD_SPI_BASE, &sd_spi_transfer);

            return status;
    }

    sdspi_host_t    sd_host = {
        .busBaudRate     = SPI_BAUDRATE_24M,    // set SPI Baud Rate to 24MHz for SD Card
        .setFrequency    = sd_spi_SetBps,       // set callback of (*setFrequency) in sdspi_host_t
        .exchange        = sd_spi_Exchange      // Set callback of (*exchange) in sdspi_host_t
    };
    头大~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25480
    最后登录
    2025-9-9
    发表于 2020-6-2 09:21:07 | 显示全部楼层
    stephenfz 发表于 2020-6-1 10:06
    前段时间把这个问题解决了,分享一下给以后遇到此问题的朋友参考,思路和版主说的一样,就不多解释了,谢谢 ...

    感谢分享哟
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-9 20:00 , Processed in 0.110692 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表