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.

[参考译文] CCS/TMS570LS1227:具有多芯片选择的 SPI

Guru**** 2252410 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/580692/ccs-tms570ls1227-spi-with-multi-chip-select

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

工具/软件:Code Composer Studio

大家好。 我正在开发基于德州 TMS570 MCU 的电路板。 我在具有3个芯片选择引脚的 SPI3接口上遇到问题、我不使用多缓冲器模式。 在 SPI3上、我连接了3个模拟器件 Gyro P/N ADXRS453。 我使用 SCLK、MISO、MOSI、SCS (0)、SCS (1)、 SCS (2)。 我想独立读取每个传感器。

要在读取使用前选择特定的芯片选择引脚、请执行以下操作:

dataconfig1_t.CSNR   = SPI_CS_0;

dataconfig1_t.CSNR   = SPI_CS_1;

dataconfig1_t.CSNR   = SPI_CS_2;

但是、当我尝试读取单个传感器(即 在线 SCS (1)上的传感器)时、所有3个芯片选择将同时激活!!! (全部3个 CS 变为低电平!!)。 如何 通过编程方式设置单芯片选择? 我已经将 halcogen 中的所有3个芯片选择设置为功能、我是否必须将 它们设置为 GPIO、而不是手动设置 cs?  

void spiInit (void)

/*用户代码开始(2)*/
/*用户代码结束*/


   /**@b 初始化@b SPI3 */

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

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

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

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

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

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

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

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

   /**-设置中断级别*/
   spiREG3->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 */

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

   /**-启用中断*/
   spiREG3->INT0 =(spiREG3->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 SPI3 @b 端口*/

   /**- SPI3端口输出值*/
   spiREG3->PC3 =   (uint32)((uint32) 1U <<0U) /* SCS[0]*/
                   |(uint32)((uint32) 1U << 1U) /* scs[1]*/
                   |(uint32)((uint32) 1U << 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 */
                   |(uint32)((uint32) 0U << 11U);/* SOMI *

   /**- SPI3端口方向*/
   spiREG3->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 */
                   |(uint32)((uint32) 0U << 11U);/* SOMI *

   /**- SPI3端口开漏使能*/
   spiREG3->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 */
                   |(uint32)((uint32) 0U << 11U);/* SOMI *

   /**- SPI3端口上拉/下拉选择*/
   spiREG3->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 */
                   |(uint32)((uint32) 1U <<11U);/* SOMI */

   /**- SPI3端口上拉/下拉使能*/
   spiREG3->PC7 =  (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) 0U <<9U) /* CLK */
                   |(uint32)((uint32) 0U <<10U) /* SIMO */
                   |(uint32)((uint32) 0U << 11U);/* SOMI *

   /* SPI3将所有引脚设置为功能*/
   spiREG3->PC0 =  (uint32)((uint32) 1U <<0U) /* SCS[0]*/
                   |(uint32)((uint32) 1U << 1U) /* scs[1]*/
                   |(uint32)((uint32) 1U << 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) 1U <<9U) /* CLK */
                   |(uint32)((uint32) 1U <<10U) /* SIMO */
                   |(uint32)((uint32) 1U <<11U);/* SOMI */

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

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


/*用户代码开始(3)*/
/*用户代码结束*/

 

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

    您是否具有 CS 信号的外部上拉电阻? 如果没有、请启用内部上拉控制并设置上拉。

    您的代码显示您已禁用所有 CS 信号的拉动控制。

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

    您可以在功能模式下使用 CS 引脚、无需 GPIO 模式。 请注意、API 和硬件需要一个用于选择 CS 的掩码。 例如、0xFE 将选择 CS0、0xFD CS1等。 如果需要、这允许使用已编码芯片选择来扩展片选择数量并使用外部硬件。

    此致、
    Christian
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我启用了上拉电阻器、但我遇到了相同的问题:我将 SCS (0)、SCS (1)和 SCS (2)设置为正常工作、如果我想使用 CS0、则设置 dataconfig1_t.CSNR = SPI_CS_0;(或0xFEU)、我使用 spiTransmitData (...) 功能。 但我注意到、所有3芯片选择都将激活、而不仅仅是 CS0!!!! 在空闲状态下、所有芯片选择在高电平上都是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我有相同的问题。 如何解决此问题?

    谢谢!!

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

    您遇到了什么问题? 与 Maurizio 一样吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复
    这是我的愚蠢错误。 我将'SPI_PIN_CS0'设置为'SPI_CS_0'。 哈哈