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

YunTu Forum

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

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

已定时 已固定 已锁定 已移动 已解决 YTM32B1M系列
4 帖子 3 发布者 1.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
    • 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
      • 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
            • ,FrankieF Frankie 将这个主题标记为已解决

          • 云途开发生态介绍

            快速上手云途开发生态

          • 云途论坛规则/Yuntu Forum Rules

            发帖前请查看

          • YT CONFIG TOOL调查问卷

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

          • can
            25
            demo
            22
            lin stack
            13
            uds
            13
            md14
            6
            yt-link
            6
            fbl
            5
            adc模块
            4
            Online Users
            • 登录

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