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.

[参考译文] RTOS/am3359:SPI 环回示例

Guru**** 2542580 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/617055/rtos-am3359-spi-loopback-example

器件型号:AM3359

工具/软件:TI-RTOS

你(们)好

我自己的电路板是 icev2AM335x.I 要嵌入目录 为 "pdk_am335x_1_0_5\packages/ti\drv\spi\examples\mcspiLoopbackApp\src"(windows)的程序

我要做的是在 mcspiLoopbackApp\src 中添加一些代码

例如

boardCfg = Board_init_PINMUX_CONFIG |
       Board_init_module_clock |
       Board_init_uart_stdio;
   board_init (boardCfg);

并使用 SPI1单通道发送和接收数据

并将 引脚 SPI_d0和 SPI_D1短接

检查引脚复用

检查寄存器

写入 CONTRAL_MODULE 寄存器以设置引脚复用模式

我已经做了我应该做的任何事情

但是、当在 McSPIVerifyData 中启动时、我也无法正常工作

我检查 mcspi_tx0和 mcspi_rx0

我发现 mcspi_rx0值为0

那么、我认为 am335支持 回送吗?

只需短接 SPI1_d0和 SPI_D1  ,SPI1主器件就可以 自行发送和接收。

如果支持,请告诉我应该检查什么才能使用 icveam335x 中的 loopbackapp

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    程序就在那里

    #define MCSPI_Instance 1
    SPI_Params gSpiParams ={
    SPI_OPER_MODE_BLOCKING、/*传输模式*/
    SemaphoreP_WAIT_FOREVY、//* transferTimeout *
    null、 /* transferCallbackFxn */
    SPI_MASTER、 /*模式*/
    1000000、 /*比特率*/
    8、 /* dataSize */
    SPI_POL0_PHA0、 /*帧格式*/
    null /*定制*/
    };

    空 SPI_TEST (UARg arg0、UARg arg1)

    //SPI_Params spiParams; /* SPI 参数结构*/
    //SPI_Handle 句柄; /* SPI 句柄*/
    SPI_Transaction 事务; /* SPI 事务*/
    int32_t RetVal; /*返回值*/



    SPI_log ("\n McSPI 内部环回测试应用已启动\n");
    SPI_log ("\n 传输模式为中断模式\n");
    /*如有必要,修改默认 SPI 配置*/

    spi_initconfig();


    /* Init SPI 驱动程序*/
    spi_init();

    /*打开 MCSPI 实例1驱动程序*/
    gSpiHandle = SPI_open (MCSPI_Instance、&gSpiParams);
    if (gSpiHandle ==空)

    printf ("\n 打开 MCSPI 驱动程序时出错\n");


    McSPIInitializeBuffers();



    transaction.count = McSPI_DATA_COUNT;
    transaction.txBuf = gTxBuffer;
    transaction.rxBuf = gRxBuffer;
    SPI_TRANSFCTION (gSpiHandle、事务);

    McSPIBuffervalue();
    RetVal = McSPIVerifyData();

    if (RetVal!= 0)

    SPI_log ("\n McSPI 数据传输失败\n"\});


    其他

    SPI_log ("\n McSPI 数据传输成功\n"\});


    SPI_Close (gSpiHandle);



    while (1);


    在 main()函数中还有 board_init()
    就是这样
    Board_moduleClockInit();//init SPI clk
    Board_pinmuxConfig ();//mcspi0 mcspi1 pinmux 它是正确的引脚地址
    Board_uartStdioInit();//init UART

    请告诉我在项目中应该检查什么
    我已读取 SPI_v1.c 和 SPI_SoC.c 以检查寄存器。 当我调试时一切都很好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    爱迪生、
    我们需要一些时间来研究这个问题并返回给您。

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我问了两次这个问题,但没有人帮助我…
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    爱迪生、

    您看到的具体错误是什么? 您有一些调试数据吗?
    您是否能够在引脚上放置逻辑分析仪来查看行为?
    McSPIVerifyData 会发生什么情况?

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    e2e.ti.com/.../617951
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我检查 SPI_V0.c、发现 SPI 使用的方法与此类似
    静态 NOR_STATUS NOR_spiCmdRead (SPI_Handle handle、
    uint8_t * cmdBuf、
    uint32_t cmdlen、
    uint8_t * rxBuf、
    uint32_t rxLen)

    SPI_Transaction 事务; /* SPI 事务结构*/
    uint32_t xferEnable;
    uint32_t terminateXfer = 0;
    布尔 返回值;

    /*启用传输*/
    xferEnable = 1;
    SPI_CONTROL (handle、SPI_V0_CMD_Xfer_ACTIVATE、(void *)&xferEnable);

    /*如果没有读取数据,请在写入结束时释放 CS */
    if (rxLen =0)

    terminateXfer = 1;


    /*写入命令*/
    transaction.txBuf = cmdBuf;
    transaction.rxBuf =空;
    transaction.count = cmdlen;
    transaction.arg =(void *)&terminateXfer;

    RetVal = SPI_transfer (handle、&transaction);



    首先启用 CS 或环回模式或其他模式

    SPI_V0中的函数代码是
    静态 int32_t SPI_CONTRAL_V0 (SPI_Handle handle、uint32_t cmd、const void *参数)

    SPI_V0_HWAttrs const *hwAttrs = NULL;
    uint32_t *cmd_args =(uint32_t *) arg;
    内部32_t RetVal = SPI_STATUS_SUCCESS;

    /*输入参数验证*/
    OSAL_ASSERT (handle == NULL);

    /*获取对象和 hwAttrs 的指针*/
    hwAttrs = handle->hwAttrs;

    开关(cmd)

    案例 SPI_V0_CMD_Xfer_ACTIVATE:
    如果(CMD_args[0])

    SPIXferEnablehwAttrs->baseAddr;

    其他

    SPIXferDisable (hwAttrs->baseAddr);

    中断;

    SPI_V0_CMD_RE环 回情况:
    如果(CMD_args[0])

    SPILoopbackEnable (hwAttrs->baseAddr);

    其他

    SPILoopbackDisable (hwAttrs->baseAddr);

    中断;

    案例 SPI_V0_CMD_PWRDOWN:
    如果(CMD_args[0])

    SPIPwrDownEnable (hwAttrs->baseAddr);

    其他

    SPIPwrDownDisable (hwAttrs->baseAddr);

    中断;

    案例 SPI_V0_CMD_DELAY:
    SPIDelaySetup (hwAttrs->baseAddr、cmd_args[0]、cmd_args[1]);
    中断;

    案例 SPI_V0_CMD_SHIFT_DIR:
    SPISetShiftDir (hwAttrs->baseAddr、cmd_args[0]);
    中断;

    默认值:
    RetVal = SPI_STATUS_UNDEFINEDCMD;
    中断;

    返回 RetVal;



    但 AM335x 使用 SPI_v1
    静态 int32_t SPI_CONTRAL_v1 (SPI_Handle handle、uint32_t cmd、const void *参数)

    /*输入参数验证*/
    OSAL_ASSERT (handle == NULL);

    返回 SPI_STATUS_UNDEFINEDCMD;

    它不执行任何操作、只需设置事务结构并开始通过 SPI 传输数据


    SPI V0和 SPI V1具有不同的寄存器操作。 以传输数据、我应该怎么做
    它接收全部为0