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.

[参考译文] TMS570LS1227:SPI1 MISO 接收缓冲器问题

Guru**** 2747375 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/961339/tms570ls1227-spi1-miso-receive-buffer-problem

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

您好!

我使用 SPI1与外部加速计通信。  我可以通过 SPI1成功地向器件发送命令、并使用逻辑分析仪验证是否通过 MISO 线路将正确的数据直接接收到处理器上的 MISO 引脚。  但是、每当我尝试读取 SPI1接收寄存器/缓冲器时、它总是全为零。  我正在轮询模式下运行器件。

我已经尝试监控 SPI 标志寄存器(SPIFLG)的 RXINT 位8、但它始终为0。

CS、CLK 和 MOSI 均按预期和配置工作。  MISO 看起来也是正确的、但我想知道我错过了配置设置还是寄存器读取/标志清除操作。  我尝试使用由 HalCoGen 生成的 spiReceiveData()函数,但结果相同。

如果有任何帮助,将不胜感激。

谢谢你。

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

    瑞克、

    器件是144引脚 PGE 封装还是337焊球 ZWT 封装?

    2.只有 MIBSPI1SOMI[0]可用于在非并行模式下接收数据:引脚94用于 PGE 封装、焊球 G18用于 ZWT 封装。

    3.确保 MIBSPI1SOMI[0]配置为功能引脚而不是 GIO 引脚

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

    您好 QJ、

    我正在使用144引脚 GPC、并且将来自加速计的 MISO 连接到封装的引脚94。  我包含了由下面的 HalCoGen 生成的初始化文件。  我认为 SPI1配置正确、但可能会丢失一些东西。  我在标准 SPI 模式下使用 SPI1、而不使用 ENA。  正如我在上一封电子邮件中提到的、我正在使用来自 SPI.c 的轮询模式函数、加速计正在正确响应、但我在 RXBUF 中只接收零

    感谢你能抽出时间并提供帮助。

    Rick

    //
    //SPI1初始化
    //

    /**使 SPI 退出复位*/
    spiREG1->GCR0 = 0U;
    spiREG1->GCR0 = 1U;

    /** SPI1主控模式和时钟配置*/
    spiREG1->GCR1 =(spiREG1->GCR1 & 0xFFFFFFFCU)|((uint32)((uint32) 1U << 1U)/* CLOKMOD */
    | 1U);/*主设备*/

    /** SPI1使能引脚配置*/
    spiREG1->INT0 =(spiREG1->INT0 & 0xFEFFFFFFU)|(uint32)((uint32) 1U << 24U);//启用 HICHZ */

    /**-延迟*/
    spiREG1->delay =(uint32)((uint32) 0U <<24U)/* C2TDELAY */
    |(uint32)((uint32) 1U <<16U)/* T2CDELAY */
    |(UINT32)((UINT32) 0U <<8U)/* T2EDELAY */
    |(uint32)((uint32) 0U << 0U);// C2EDELAY *

    /**-数据格式0 */
    spiREG1->FMT0 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 1U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 159U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/

    /**-数据格式1 */
    spiREG1->FMT1 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 1U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 159U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/

    /**-数据格式2 */
    spiREG1->FMT2 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 1U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 159U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/

    /**-数据格式3 */
    spiREG1->FMT3 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 1U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 159U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/

    /**-设置中断级别*/
    spiREG1->LVL =(uint32)((uint32) 0U <<9U)/* TXINT */
    |(UINT32)((UINT32) 0U <<8U)/* RXINT */
    |(UINT32)((UINT32) 0U << 6U)/* OVRNINT */
    |(uint32)((uint32) 0U << 4U)/* BIERR */
    |(uint32)((uint32) 0U << 3U)/* DESYNC */
    |(uint32)((uint32) 0U << 2U)/* PARERR */
    |(uint32)((uint32) 0U << 1U)/*超时*/
    |(UINT32)((UINT32) 0U << 0U);/* DLENERR */

    /**-清除所有挂起的中断*/
    spiREG1->FLG |= 0xFFFFFFU;

    /**-启用中断*/
    spiREG1->INT0 =(spiREG1->INT0 & 0xFFFFFF0000U)
    |(UINT32)((UINT32) 0U <<9U)/* TXINT */
    |(UINT32)((UINT32) 0U <<8U)/* RXINT */
    |(UINT32)((UINT32) 0U << 6U)/* OVRNINT */
    |(uint32)((uint32) 0U << 4U)/* BIERR */
    |(uint32)((uint32) 0U << 3U)/* DESYNC */
    |(uint32)((uint32) 0U << 2U)/* PARERR */
    |(uint32)((uint32) 0U << 1U)/*超时*/
    |(UINT32)((UINT32) 0U << 0U);/* DLENERR */

    /**@b 初始化@b SPI1 @b 端口*/

    /**- SPI1端口输出值*/
    spiREG1->PC3 =(uint32)((uint32) 1U <<0U)/* SCS[0]*/
    |(uint32)((uint32) 1U << 1U)/* scs[1]*/
    |(uint32)((uint32) 1U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 1U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 1U << 4U)/* scs[4]*/
    |(uint32)((uint32) 1U <<5U)/* SCS[5]*/
    |(UINT32)((UINT32) 0U <<8U)/* ENA */
    |(uint32)((uint32) 1U <<9U)/* CLK */
    |(uint32)((uint32) 0U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 0U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 0U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 0U << 25U);/* SOMI[1]*

    /**- SPI1端口方向*/
    spiREG1->PC1 =(uint32)((uint32) 1U <<0U)/* SCS[0]*/
    |(uint32)((uint32) 1U << 1U)/* scs[1]*/
    |(uint32)((uint32) 1U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 1U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 1U << 4U)/* scs[4]*/
    |(uint32)((uint32) 1U <<5U)/* SCS[5]*/
    |(UINT32)((UINT32) 0U <<8U)/* ENA */
    |(uint32)((uint32) 1U <<9U)/* CLK */
    |(uint32)((uint32) 1U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 0U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 0U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 0U << 25U);/* SOMI[1]*

    /**- SPI1端口开漏使能*/
    spiREG1->PC6 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
    |(uint32)((uint32) 0U << 1U)/* scs[1]*/
    |(uint32)((uint32) 0U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 0U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 0U << 4U)/* scs[4]*/
    |(uint32)((uint32) 0U << 5U)/* scs[5]*
    |(UINT32)((UINT32) 0U <<8U)/* ENA */
    |(UINT32)((UINT32) 0U <<9U)/* CLK */
    |(uint32)((uint32) 0U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 0U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 0U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 0U << 25U);/* SOMI[1]*

    /**- SPI1端口上拉/下拉选择*/
    spiREG1->PC8 =(uint32)((uint32) 1U <<0U)/* SCS[0]*/
    |(uint32)((uint32) 1U << 1U)/* scs[1]*/
    |(uint32)((uint32) 1U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 1U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 1U << 4U)/* scs[4]*/
    |(uint32)((uint32) 1U <<5U)/* SCS[5]*/
    |(uint32)((uint32) 1U <<8U)/* ENA */
    |(uint32)((uint32) 1U <<9U)/* CLK */
    |(uint32)((uint32) 1U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 1U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 1U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 1U << 25U);/* SOMI[1]*/

    /**- SPI1端口上拉/下拉使能*/
    spiREG1->PC7 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
    |(uint32)((uint32) 0U << 1U)/* scs[1]*/
    |(uint32)((uint32) 0U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 0U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 0U << 4U)/* scs[4]*/
    |(uint32)((uint32) 0U << 5U)/* scs[5]*
    |(UINT32)((UINT32) 0U <<8U)/* ENA */
    |(UINT32)((UINT32) 0U <<9U)/* CLK */
    |(uint32)((uint32) 0U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 0U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 0U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 0U << 25U);/* SOMI[1]*

    /* SPI1将所有引脚设置为功能*/
    spiREG1->PC0 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
    |(uint32)((uint32) 0U << 1U)/* scs[1]*/
    |(uint32)((uint32) 0U << 2U)/* scs[2]*/
    |(UINT32)((UINT32) 0U << 3U)/* SCS[3]*/
    |(uint32)((uint32) 0U << 4U)/* scs[4]*/
    |(uint32)((uint32) 1U <<5U)/* SCS[5]*/
    |(UINT32)((UINT32) 0U <<8U)/* ENA */
    |(uint32)((uint32) 1U <<9U)/* CLK */
    |(uint32)((uint32) 1U <<10U)/* SIMO[0]*/
    |(UINT32)((UINT32) 1U << 11U)/* SOMI[0]*/
    |(uint32)((uint32) 0U << 17U)/* SIMO[1]*/
    |(uint32)((uint32) 0U << 25U);/* SOMI[1]*

    /**-初始化 TX 和 RX 数据缓冲区状态*/
    G_spiPacket_t[0U].TX_DATA_STATUS = SPI_READY;
    G_spiPacket_t[0U].Rx_DATA_STATUS = SPI_READY;

    /**-最后启动 SPI1 */
    spiREG1->GCR1 =(spiREG1->GCR1 & 0xFEFFFFFFU)| 0x01000000U;

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

    您可以尝试不同的时钟极性和时钟相位吗? 输入数据似乎未正确锁存。  

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

    我刚刚尝试了所有四种可能的时钟极性和相位组合、并使用逻辑分析仪验证了这些变化。  

    如我之前发送的初始化代码所示的原始配置是唯一一种外部加速计在指示 SPI 配置时正确响应的模式。  所有数据格式都相同、但我只使用#2。

    /**-数据格式2 */
    spiREG1->FMT2 =(uint32)((uint32) 0U <<24U)// wdelay
    |(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
    |(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
    |(uint32)((uint32) 0U << 21U)//等待启用
    |(uint32)((uint32) 0U << 20U)/*移位方向*/
    |(uint32)((uint32) 1U << 17U)/*时钟极性*/
    |(uint32)((uint32) 0U << 16U)/*时钟相位*/
    |(uint32)((uint32) 159U << 8U)/*波特率预分频*
    |(uint32)((uint32) 16U << 0U);/*数据字长度*/

    我添加了测试代码来检查 SPI 标志寄存器(SPI1FLG)和 SPI RXBUF 寄存器。  我在 SPI1FLG 中接收到的值始终为0x00000200、SPI1RXBUF 始终为0x801F0000。

    我已经成功地在几个不同的微控制器上使用了 SPI 端口、其中一个使用了同一个加速计、但这个却让我感到困惑。

    谢谢。

    Rick

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

    您好 Rick、

    如果 外部加速计需要更长的设置时间、您可以增加 C2TDELAY 以使 加速计有更多的时间准备数据并在正确的时钟边沿输出数据。  

    请尝试增加 C2TDELAY。

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

    您好 QJ、

    加速计工作正常。  问题在于 SPI1 MISO。  使用逻辑分析仪、我验证了使用 SPI1正确初始化加速计、并且我可以从器件持续获取正确的数据。  但是、即使正确的数据出现在连接到 SPI1 MISO 的逻辑分析仪线路上、我也无法读取 SPI1 MISO 数据。  我总是得到所有零。

    我看不到更改时钟相位或极性会如何使 SPIBUF 始终为零。  如果错误、我仍然希望 MISO 提供垃圾数据。  正如我在前一封电子邮件中所说的、我已经根据加速计的要求以及 SPI1应该支持的要求来配置时钟。

    谢谢。

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

    也许我错过了一些东西、我会再次读取您的代码、稍后再回来。

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

    你好

    请尝试我的代码,和结果告诉我。

    ——————————————————————

    uint16_t 命令;//发送数据;

    uint16_t 结果;//您接收数据;

    spiREG1->DAT1 = 0x04FE0000 |命令;
    while ((spiREG1->FLG & 0x100)!=0x100);
    结果=(spiREG1->BUF)& 0xFF;

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

    您好!

    由于 FE 选择 CS_0且我正在使用 CS_5、因此您发送给我的代码无法启用正确的 CS 线路。  因此、加速计从不接收数据、从不发送数据、接收标志位从不设置、系统锁定在 while 环路中。  我正在使用由 HalCoGen 提供的 SPI_CS_5 = 0xDFU 来启用加速计的芯片选择。

    Rick

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

    您好、再说一次、

    我已经连接了 SPI1发送/接收以及加速计的读写协议的屏幕截图。  MOSI 线路的前8位是我请求数据的加速计寄存器。  MOSI 线路的最后8位设置为高电平、因为它们无关。

    MISO 线路的最后8位是从加速计读取的正确数据、用于发送的地址。  我在 RXDATA 中预期看到的是这个特定示例中的0xFF9A。  相反、我得到所有零、并且接收标志永远不会被置位。

     您能看到任何会阻止 SPIBUF RXDATA 域始终如一地寄存所有零的时序或接收位错误吗?  我的数据格式设置为16位、在我使用 SPI 端口的其他微控制器上、接收缓冲器在时钟边沿有效时立即开始将时钟位移入移位寄存器。

    我是否在接收操作或配置上遗漏了什么?

    谢谢。

    Rick

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

    我忘记再添加一个测试。

    我断开了加速计的引脚94 MISO、将其重新配置为 GIO 输出、运行了一个测试环路、该环路只需切换引脚即可正常工作。  硬件连接良好。

    Rick

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

    你好

    无法看到图片

    HCG 软件 文件发布。我认为 配置有问题。

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

    您好、Rick、

    您能否重新发布正确发布的屏幕截图?  

    请将屏幕截图保存到 jpg 图像文件中

    2.点击“插入文件”按钮上传 jpg 图像

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

    仔细检查以确保 SPI1SOMI[0]被配置为功能性信号而不是 GIO 信号:

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

    您好 QJ、

    感谢您发送电子邮件。  我现在使 SPI1工作、可以使用正确的数据读取接收缓冲区标志和 SPI1 BUF。

    SPI1寄存器根据您的信息进行了正确配置。  这是我被分配给的一个现有项目、我发现另一个 SPI 端口的初始化不正确、并且损坏了 SPI1。

    感谢您的帮助和耐心。

    Rick