This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:双 SPI 从器件问题

Guru**** 2390755 points
Other Parts Discussed in Thread: HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106295/rm46l852-dual-spi-slave-issue

器件型号:RM46L852
主题中讨论的其他器件:HALCOGEN

大家好!

我开发了一个正在工作的从器件 SPI 接口、现在我需要另一个接口。 事实是、使用相同的配置、相同的代码结构无法正常工作。 我检查了硬件、不建议使用。

主要差异来自字节之间的延迟(由 MSP430进行检测)。 另一件事是、我将 SP1和 SP4用于从器件接口、当我查看文件 SPI.c 时、我发现 HALCOGEN 生成了 SPI1中断作为 MIBSPI、SPI4作为 SPI4中断。 问题是否可以从那里解决?

在调试模式下、如果我在 MIBSPI1和 SP14中断中置入断点、它会在 Mibspi1HighLevelInterrupt 中停止(只有在 spiSendAndGetData 调用中调用该断点似乎可以、因为现在该从器件上没有感应到数据)、用于发送缓冲区为空、在 spi4LowLevelInterrupt 和 spiHighLevelInterrupt 中没有位置。

这里是我的 Halcogen 项目和 MSP430主器件感应到的 SPI 信号图片。

e2e.ti.com/.../RM46L852_5F00_HALCOGEN.zip

任何想法都很有帮助!

此致、

Fabian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好 Fabian、

    我正在读取您的代码、稍后再回来。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    附件只是 HAL 生成的驱动程序。 我找不到您的代码。  

    我注意到 SPI 时钟相位已启用。 SPI 主器件是否需要此功能?  如果相位被启用、数据在 SPICLK 的第一个上升沿和随后的下降沿前半个周期被输出。 输入数据锁存在 SPICLK 的上升沿。

    SPI 主器件必须为 SPI 从器件发送和接收数据提供 SPI 时钟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复!

    抱歉、我没有将代码放入文件夹。 这是我使用的状态机。 :

           switch (state_machine) {
            case MSP430_STATE_MACHINE_COMMUNICATION_END :
                previous_state_machine = MSP430_STATE_MACHINE_COMMUNICATION_END;
                state_machine = MSP430_STATE_MACHINE_WAIT_FOR_COMMAND;
                gpio_set(msp430_interface_params->msp430_slave_ready_gpio, 0U);
                vTaskDelay(pdMS_TO_TICKS(msp430_interface_params->task_period));
                break;
            case MSP430_STATE_MACHINE_WAIT_FOR_COMMAND :
                previous_state_machine = MSP430_STATE_MACHINE_WAIT_FOR_COMMAND;
                memset(&MSP430_DATA_RX[0], 0x00, sizeof(MSP430_DATA_RX[0]) * MSP430_DATA_SIZE);
                memset(&MSP430_DATA_TX[0], 0x44, sizeof(MSP430_DATA_TX[0]) * MSP430_DATA_SIZE);
                //spi_slave_transfer(msp430_interface_params->msp430_spi_slave_handle, &MSP430_DATA_RX[0], &MSP430_DATA_TX[0], MSP430_FRAME_SIZE_COMMAND_LENGTH);
                spiSendAndGetData(spiREG4, &msp430_spi_slave_config, 1, &MSP430_DATA_RX[0], &MSP430_DATA_TX[0]);
                gpio_set(msp430_interface_params->msp430_slave_ready_gpio, 1U);
                msp430_slave_delay = 0;
                while((SpiRxStatus(spiREG4) != SPI_COMPLETED) && (msp430_slave_delay < APP_MSP430_DELAY_MAX)) {
                    msp430_slave_delay++;
                }
                if(msp430_slave_delay == APP_MSP430_DELAY_MAX) {
                    state_machine = MSP430_STATE_MACHINE_COMMUNICATION_END;
                }
                else if((MSP430_DATA_RX[MSP430_COMMAND_FRAME_INDEX_START_OF_COMMUNICATION] == MSP430_FRAME_VALUE_START_OF_FRAME)
                        && (MSP430_DATA_RX[MSP430_COMMAND_FRAME_INDEX_END_OF_COMMUNICATION] == MSP430_FRAME_VALUE_END_OF_FRAME)) {
                } else {
                    state_machine = MSP430_STATE_MACHINE_COMMUNICATION_END;
                }
                break;
            case MSP430_STATE_MACHINE_SEND_STATUS :
                previous_state_machine = MSP430_STATE_MACHINE_SEND_STATUS;
                state_machine = MSP430_STATE_MACHINE_COMMUNICATION_END;
                break;
            default:
                state_machine = MSP430_STATE_MACHINE_COMMUNICATION_END;
                break;
            }

    使用:

    spi_config_t msp430_spi_slave_config = {
         .CS_HOLD = FALSE, .WDEL = FALSE, .DFSEL = SPI_FMT_0, .CSNR = SPI_CS_0};

     >我注意到 SPI 时钟相位已启用。 SPI 主器件是否需要此功能?

    不需要、MSP430不需要它、但我选择保留另一个从器件的配置。

    此致、

    Fabian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="505290" URL"/support/microriers/arm-based microrims-group/arm-based microriers/f/arm based microrims-forum/1106295/rm46l852-dual-spi-slave-issue"]我开发了一个正在运行的从 SPI 接口、现在我需要另一个接口。 [/报价]

    使用 RM46Lx 的 SPI 从器件以前是否工作?  

    您是否启用了中断(IRQ)?  

    如何保证在 SPI 主设备将数据传输到从设备之前调用 spiSendAndGetData()?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="45190" url="支持/微控制器/基于 ARM 的微控制器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-论坛/1106295/rm46l852-dual-spI-slave-issue/4100275#4100275]*使用 RM46Lx 的 SPI 从站以前是否起作用?  [/报价]

    是的、它在我想实现第二个 SPI 从器件的同一个芯片上。

    [~ userid="45190" url="支持/微控制器/arm-based 微控制器组/arm -based 微控制器/f/arm -based 微控制器-forum/1106295/rm46l852-dual-spI-slave-issue/4100275#4100275]\n 您是否启用了中断(IRQ)?  [/报价]

    是的。

    [引用 userid="45190" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1106295/rm46l852-dual-spI-slave-issue/4100275#4100275"]您如何保证 GetSpidAndData ()在发送 spi/slave 数据之前调用了 GetSpiter[?]

    在我提供的代码上有一个被称为 SLAVE_READY 的信号、告知主器件从器件已准备好接收数据。 因此它确保从站在主站发送数据之前调用 spiSendAndGetData()。

    是否可以在同一设备上有多个从设备? 我认为是这样、但我更愿意提问。

    我还使用 FreeRTOS,它是否会产生影响?

    此致、

    Fabian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="505290" url="支持/微控制器/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1106295/rm46l852-dual-spI-slave-issue/4100717#4100717"]是否可以在同一设备上具有多个从设备?引用/引用

    是的、您可以连接的从器件数量与 SPI 主器件的片选引脚数量相同。 例如、如果 MSP430 SPI 模块有4个 nCS 引脚、您可以将4个从器件连接到此 SPI 模块。

    [~ userid="505290" url="支持/微控制器/arm-based 微控制器-group/arm-based 微控制器/f/arm-based 微控制器-forum/1106295/rm46l852-dual-spI-slave-issue/4100717#4100717"]我还可以使用 FreeRTOS 吗?引用/引用

    在 FreeRTOS 下使用 SPI 应该可以。