跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. 直接配置SPI master的寄存器,发送数据正常,但接收不到数据,也无法产生RX中断.

直接配置SPI master的寄存器,发送数据正常,但接收不到数据,也无法产生RX中断.

已定时 已固定 已锁定 已移动 未解决 YTM32B1M系列
4 帖子 3 发布者 110 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • oinobodyO 离线
    oinobodyO 离线
    oinobody
    编写于 最后由 编辑
    #1

    由于一些原因,我需要手动配置寄存器来收发发送spi报文(本机做master):
    一下是我写参照Spi_SyncTransmit写的发送并接收的函数:

    // 给data寄存器填入数据,即等于发送.
    uint32_t Spi_SendTxData(uint32_t spiIndex, uint32_t data)
    {
        SPI_Type* SpiBases[SPI_INSTANCE_COUNT] = SPI_BASE_ADDRS;
        volatile SPI_Type* BasePtr = SpiBases[spiIndex];
        BasePtr->CTRL = 0x5;
        BasePtr->TXCFG = 0x2000017;
        BasePtr->CLK = 0xa;
        BasePtr->TXFIFO = 0x2000002;
        BasePtr->RXFIFO = 0x2000002;
        BasePtr->CTRL |= SPI_CTRL_EN_MASK;
        Spi_Lld_SetIntMode(BasePtr, SPI_RX_DATA_FLAG, TRUE); // 使能rx中断
        BasePtr->DATA = data;
        // 延时
        for(int i = 0; i < 1000; i++) {;}
        return BasePtr->DATA;  // 接收数据: 此处一直是0
    }
    
    // 中断处理 : 此中断进不来.
    void SPI0_IRQHandler(void)
    {
        SPI_Type* SpiBases[SPI_INSTANCE_COUNT] = SPI_BASE_ADDRS;
        volatile SPI_Type* BasePtr = SpiBases[0];
        if (((BasePtr->STS >> SPI_RX_DATA_FLAG) & 1U) == 1)
        {
            g_readDa = BasePtr->DATA;
        }
    }
    

    逻辑分析仪上,可见SO是有数据的,见下图:
    c3f3a558-7e7b-403d-80b6-a9edaf890740-image.png

    // 步进电机的spi管理接口.
    uint32_t Spi_SendCmdToStepMotor(uint32_t cmd)
    {
        // uint32_t data = cmd;
        // Spi_WriteIB(SpiConf_SpiChannel_SpiChannel_1, (const Spi_DataBufferType *)&data);
        // Spi_SyncTransmit(SpiConf_SpiChannel_SpiChannel_1);
        // uint32_t readData = 0;
        // Spi_ReadIB(SpiConf_SpiChannel_SpiChannel_1, (Spi_DataBufferType *)&readData);
        // return readData;
        return Spi_SendTxData(0, cmd);
    }
    

    用Spi_SyncTransmit接口(上面注释中的代码)是正常收发的, 用Spi_SendTxData收不到.
    求助,Spi_SendTxData中该如何做才能收到MISO上传输的数据?

    1 条回复 最后回复
    0
    • DigaD 离线
      DigaD 离线
      Diga
      编写于 最后由 编辑
      #2

      看一下 STS 状态寄存器什么情况

      1 条回复 最后回复
      0
      • FrankF 离线
        FrankF 离线
        Frank YunTu
        编写于 最后由 编辑
        #3

        把 RXFIFO 的watermark值配成0试下,另外Spi_SyncTransmit接口没有使用中断。

        1 条回复 最后回复
        0
        • oinobodyO 离线
          oinobodyO 离线
          oinobody
          编写于 最后由 编辑
          #4

          这是一个薛定谔式的问题:
          使用VSCODE+Coretex-Debug插件调试代码,会遇到如下情况:
          2950a8f0-45a2-4bae-bcdd-58cb66120ac8-image.png

          断点进来的这一刻刻,在左边的watch界面可以看到DATA寄存器中有值;
          但是执行113行后,retData是0;

          经过多次对比排查发现可能是如下原因:
          DATA寄存器是FIFO的出口,读一次清一个. COUNT也会减少一次.
          当断点执行到此处时,寄存器中的数据被左边的watch窗口读走了,等113行执行的时候,数据已经消失.

          如果在113行后面打断点,确保进断点的时候,retData = BasePtr->DATA; 这一行已经执行过,就可以看到retData中是有数据的.

          😊 😊 😊

          1 条回复 最后回复
          0

        • 云途开发生态介绍

          快速上手云途开发生态

        • 云途论坛规则/Yuntu Forum Rules

          发帖前请查看

        • YT CONFIG TOOL调查问卷

          帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

        • can
          19
          demo
          19
          uds
          13
          lin stack
          10
          md14
          6
          fbl
          5
          yt-link
          5
          adc模块
          4
          Online Users
          jiankang_wangJ
          jiankang_wang
          EkkoE
          Ekko
          LlllllL
          Llllll
          YQHY
          YQH
          gaoShengG
          gaoSheng
          • 登录

          • 登录或注册以进行搜索。
          • 第一个帖子
            最后一个帖子
          0
          • 版块
          • 最新
          • 标签
          • 热门