查看: 5528|回复: 17

[其他] SPI 报错

[复制链接]
  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
    发表于 2017-12-29 11:09:27 | 显示全部楼层 |阅读模式
    k64 spi2+dma 做从机和stm32通信,调用DSPI_MasterTransferEDMA(EXAMPLE_DSPI_MASTER_BASEADDR, &g_dspi_edma_m_handle, &masterXfer)后返回值不是kStatus_Success,是kDSPI_Busy,一直打印There is error when start DSPI_SlaveTransferEDMA,代码如下stm32这边程序是没问题的,此程序是按照库里面demo修改的,求解,谢谢,

    1. <blockquote>void SPI2_Slave_Transfer(uint8_t *txdata,uint8_t *rxdata,uint8_t size)
    复制代码



    最佳答案

    zsltx 发表于 2018-1-6 14:08 我的开发环境是keil mdk 5 ,我发给你的是我这边编译没问题的啊。你需要把ksdk2.1复制到每个工程里面,ks ... 你说的把SDK2.1复制到每个工程里面,请给出具体步骤。 另外我这边已经没有 ...
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2017-12-29 14:15:24 | 显示全部楼层
    楼主你好!
    有没有测试下SPI的波形,K64有没有把SPI数据发送出来呢?看看SPI波形什么情况了呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
     楼主| 发表于 2017-12-29 14:21:21 | 显示全部楼层
    数据通过示波器看是有的,但是错误的数据,
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2017-12-29 14:25:36 | 显示全部楼层
    zsltx 发表于 2017-12-29 14:21
    数据通过示波器看是有的,但是错误的数据,

    代码发送的数据,和错误的数据差别多大?
    你可以少发送几个byte,然后测试下看看,SPI总线上是所有数据都出错,还是只是前面正确后面错误。
    另外,你的主从之间的相位极性要调整一致了。
    STM32做主机,发数据,K64做从机,接数据发送数据。可以debug看看,接收数据是否能够成功?
    另外,你也可以尝试下先不用DMA,直接用SPI 从机,是否能正确?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
     楼主| 发表于 2017-12-29 14:33:11 | 显示全部楼层
    小恩GG 发表于 2017-12-29 14:15
    楼主你好!
    有没有测试下SPI的波形,K64有没有把SPI数据发送出来呢?看看SPI波形什么情况了呢?
    ...

    k64给stm32要发数据的时候通过一个gpio下降沿作为通知,要求在一帧数据发送完成后在拉高gpio,免的这帧数据没发送完下一帧数据又来了,我该怎么检测这帧数据已发送完,我想数据传输完成后开始执行回调函数,于是把gpio拉高放在回调函数里面,结果不行。或者我该怎么检测spi的某一个引脚表明传输完成,抓别人正常板子是在最后一个sck拉高这个gpio,

    回调函数如下

    void DSPI_SlaveUserCallback(SPI_Type *base, dspi_slave_edma_handle_t *handle, status_t status, void *userData)
    {
        if (status == kStatus_Success)
        {
            //PRINTF("DSPI2--It's a successful salve transfer. \r\n\r\n");
        }       

        if (status == kStatus_DSPI_Error)
        {
            PRINTF("DSPI2--Error occured in this salve transfer. \r\n\r\n");
        }

        GPIO_SetPinsOutput(GPIOB, 1U << nRF_OUT_S_PIN);
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2017-12-29 14:56:31 | 显示全部楼层
    zsltx 发表于 2017-12-29 14:33
    k64给stm32要发数据的时候通过一个gpio下降沿作为通知,要求在一帧数据发送完成后在拉高gpio,免的这帧数 ...

    你这个结构是官方K64的SDK SPI代码。
    如果从机接收结束,会调用DSPI_SlaveUserCallback,这个时候可以认为发送结束了。
    原则上调用    DSPI_SlaveTransferNonBlocking(EXAMPLE_DSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer);之后,直接等待callback里面的标志置位即可。
    那么你现在的情况是,调用    DSPI_SlaveTransferNonBlocking(EXAMPLE_DSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer);之后,callback也能进,就是状态是错误的,数据是错误的,是这个意思吗?
    如果数据错误,可以把SPI波形发出来看看吗?
    建议你主机先少发几个字节,比如发8个字节,然后从机看下。
    另外,从机发送需要在主机发送之前就调用好。你可以尝试只搞一桢,然后让从机先上电等着,然后再主机上电发送SPI master数据。同时采集SPI bus数据。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
     楼主| 发表于 2017-12-29 15:54:56 | 显示全部楼层
    小恩GG 发表于 2017-12-29 14:56
    你这个结构是官方K64的SDK SPI代码。
    如果从机接收结束,会调用DSPI_SlaveUserCallback,这个时候可以认 ...


    示波器抓到的,如下,四个通道从上往下依次是 sck,cs,mosi,miso,之前说错了,示波器上miso看没数据,后面两张是放大的



    333.jpg 111.jpg 222.jpg

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
     楼主| 发表于 2017-12-29 16:06:04 | 显示全部楼层
    小恩GG 发表于 2017-12-29 14:56
    你这个结构是官方K64的SDK SPI代码。
    如果从机接收结束,会调用DSPI_SlaveUserCallback,这个时候可以认 ...

    按照官方sdk提供的demo在回调函数里面添加了isTransferCompleted传输完场标志,但是我加入while等待
    while (!isTransferCompleted) {}时就卡死了这了,什么都不执行
      
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-12-16 15:24
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    12

    主题

    61

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2018-1-24
     楼主| 发表于 2017-12-29 17:40:20 | 显示全部楼层
    小恩GG 发表于 2017-12-29 14:56
    你这个结构是官方K64的SDK SPI代码。
    如果从机接收结束,会调用DSPI_SlaveUserCallback,这个时候可以认 ...

    这是我 的代码,你可以测试下,ksdk2.1太大无法上传,麻烦你添加一下

    slave.zip (7.53 MB, 下载次数: 1)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2018-1-2 10:51:22 | 显示全部楼层
    zsltx 发表于 2017-12-29 17:40
    这是我 的代码,你可以测试下,ksdk2.1太大无法上传,麻烦你添加一下

    楼主你好!
    顺便告诉我下,你主机的CLK频率多少?发送的数据是多少,我看我这边复现下。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 23:58 , Processed in 0.114829 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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