查看: 8729|回复: 5

[求助] 关于硬件SPI用软件CS片选(又来了)

[复制链接]
  • TA的每日心情
    开心
    2024-6-14 08:06
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    42

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    247
    最后登录
    2024-6-14
    发表于 2019-5-15 21:08:25 | 显示全部楼层 |阅读模式
    又来问关于用硬件SPI,CS用软件的问题。在K64平台上实验的,
    先看用硬件cs的波形,10M波特率,传8位,一帧差不多就1us时间。

    10M硬件CS

    10M硬件CS

    用软件cs,10M波特率,传8位,一帧要12us时间。

    10M软件CS

    10M软件CS

    库是用SDK_2.4.2_MK64FN1M0xxx12,相关操作代码如下
        masterConfig.whichCtar = kDSPI_Ctar0;
        masterConfig.ctarConfig.baudRate = TRANSFER_BAUDRATE;
        masterConfig.ctarConfig.bitsPerFrame = 8U;
        masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh;
        masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge;
        masterConfig.ctarConfig.direction = kDSPI_MsbFirst;
        masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;
        masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;
        masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;

        masterConfig.whichPcs = EXAMPLE_DSPI_MASTER_PCS_FOR_INIT;
        masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow;

        masterConfig.enableContinuousSCK = false;
        masterConfig.enableRxFifoOverWrite = false;
        masterConfig.enableModifiedTimingFormat = false;
        masterConfig.samplePoint = kDSPI_SckToSin0Clock;

        srcClock_Hz = DSPI_MASTER_CLK_FREQ;
        DSPI_MasterInit(EXAMPLE_DSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz);

        DSPI_MasterTransferCreateHandle(EXAMPLE_DSPI_MASTER_BASEADDR, &g_m_handle, DSPI_MasterUserCallback, NULL);

        while (1)
        {
                           
                                    masterXfer.txData = masterTxData;
            masterXfer.rxData = NULL;
            masterXfer.dataSize = TRANSFER_SIZE;
                                    masterXfer.configFlags = kDSPI_MasterCtar0 | kDSPI_MasterPcsContinuous|EXAMPLE_DSPI_MASTER_PCS_FOR_TRANSFER;
                                    GPIO_PinWrite(GPIOD,11,0);
            DSPI_MasterTransferNonBlocking(EXAMPLE_DSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer);               
                                    while((SPI2->SR)>>SPI_SR_TCF_SHIFT &0x01U)//判断是否传输完成
                                    {
                                            GPIO_PinWrite(GPIOD,11,1);
                                            SPI2->SR |=SPI_SR_TCF(0);//传输完成,清0
                                    }
                           


    当时只觉得速度慢了点,毕竟用软件CS了,但是随之该了波特率,神奇的事情发生了。
    接下来是用软件cs,用1M波特率,传8位,是传8位,但是。。。。

    1M软件CS

    1M软件CS

    从波形上看,是传了2针数据,可是我配置的是传8位呀。接下来在实验了,用100k的波特率,好了又发生了神奇的事情

    100k软件CS

    100k软件CS

    CS不输出了,软件仿真了一下,断点打在while((SPI2->SR)>>SPI_SR_TCF_SHIFT &0x01U)里面,的确是进不去了,可是再把断点打到while上,程序运行到while上,我在点运行,结果程序跑到了while里面的断点了,这就又理解不了了。
    对了,SPI的配置没有变,用 了例程的,只是改了波特率与软件CS。
    各位看看,是我在操作寄存器的时候少了什么步骤吗?

    最佳答案

    看来这个问题只有我能回答了。。。。。 首先,关于软件实现的波形为什么CS的时间为什么会比硬件自身的时间长,这个问题大家都懂,简单来说,就是你软件实现的时候先拉高了CS,再去配置SPI,然后写数据,这些都是需要 ...
    天气不错
    回复

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2019-5-17 16:23:34 | 显示全部楼层
    你这边只是贴出来软件CS的波形图,你可以贴出硬件控制的CS的波形图也贴出来比较一下,还有你说的debug奇怪现象是否每次都能复现
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-6-14 08:06
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    42

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    247
    最后登录
    2024-6-14
     楼主| 发表于 2019-5-17 19:27:00 | 显示全部楼层
    小恩GG 发表于 2019-5-17 16:23
    你这边只是贴出来软件CS的波形图,你可以贴出硬件控制的CS的波形图也贴出来比较一下,还有你说的debug奇怪 ...

    第一张图片就是硬件CS呢
    天气不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2019-5-21 15:14:50 | 显示全部楼层
    122541325 发表于 2019-5-17 19:27
    第一张图片就是硬件CS呢

    好的,你说的debug奇怪现象是否每次都能复现呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-6-14 08:06
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    42

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    247
    最后登录
    2024-6-14
     楼主| 发表于 2019-5-21 21:03:17 | 显示全部楼层
    小恩GG 发表于 2019-5-21 15:14
    好的,你说的debug奇怪现象是否每次都能复现呢?

    是呢,每次都是这样的
    天气不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-7-4 09:29
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    1

    主题

    48

    帖子

    10

    中级会员

    Rank: 3Rank: 3

    积分
    257
    最后登录
    2019-12-23
    发表于 2019-5-28 17:21:22 | 显示全部楼层
    看来这个问题只有我能回答了。。。。。
    首先,关于软件实现的波形为什么CS的时间为什么会比硬件自身的时间长,这个问题大家都懂,简单来说,就是你软件实现的时候先拉高了CS,再去配置SPI,然后写数据,这些都是需要时间的,所以,时间就会变长咯。
    其次呢,我们来解决你的第二个问题,也就是你所说的“奇怪的现象”,我觉得这个可能是你对你所使用的API不是特别了解,你用的是NonBlocking的API,这个API有什么特点呢?就是不用等待数据传输完成,数据写入后就返回,数据传输完成后会有callback。问题就出现在这里,当你用10M的波特率的时候,CPU频率不变,但是外部IN/OUT上的SPI数据传输变快了,也就是当外部数据刚好发送完成,TCF置1了,你的软件程序也就跑到了while处,刚好,清标志位。一个循环执行一次。然后,你把波特率调整到1M的时候,API直接返回的时候,这个时候TCF还没置1,你就直接跳到了下一次发送,然后发送过程中,TCF置1了,然后就只发送了2个。第三次,你调整波特率到100K,更慢了,也就是说,数据在PIN脚上的传输时间更长了,在软件执行第二次循环时,第一个数据都没发完,然后就永远也检测不到TCF置1。这就是你的时许图出现不同现象的原因。
    一句话,对于SDK的理解不是特别的透彻,而且软件实现上也有问题,while那个等状态的逻辑有问题。要想用软件实现CS,你必须要保证数据在外部总线(PIN)上传输完成,而不是在FIFO的状态。希望对你有帮助。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-6 23:03 , Processed in 0.110670 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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