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.

[参考译文] TMS570LS0432:SPI CS[0]的奇怪问题

Guru**** 2482105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/713389/tms570ls0432-strange-problems-with-spi-cs-0

器件型号:TMS570LS0432

您好!

我正在尝试在 Launchpad TMS57004上设置 SPI2与硬件驱动的 CS 通信的工作示例。 我正在使用逻辑分析仪来验证输出以及 CLK 和 MOSI 信号是否正常工作、唯一的问题是 CS0信号。 当信号应该为低电平时、信号在传输期间也保持高电平。 但是、如果清零 SPI2DEF 寄存 器中的 CSDEF0位(实际上使 CS 信号反相)、CS 开始工作(当然是反相的)。 我犯了什么错误?

感谢 Črt 的帮助

CSDEF0 = 1、CS 不工作(始终为高电平)

CSDEF0 = 0、CS 反相工作(正如预期的那样、总线对我无用)  

与 SPI2相关的源代码为:

void spiInit (void)
{
spiREG2->GCR0 = 0U;
spiREG2->GCR0 = 1U;

spiREG2->GCR1 =(spiREG2->GCR1 & 0xFFFFFFFCU)|((uint32)((uint32) 1U << 1U)/* CLOKMOD */
| 1U);/*主设备*/

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

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

/**-数据格式0 */
spiREG2->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) 79U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/

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

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

/**-启用中断*/
spiREG2->INT0 =(spiREG2->INT0 & 0xFFFF0000U)
|(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 */

/**- SPI2端口输出值*/
spiREG2->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) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *

/**- SPI2端口方向*/
spiREG2->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 <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *

/**- SPI2端口开漏使能*/
spiREG2->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 <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *

/**- SPI2端口上拉/下拉选择*/
spiREG2->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 <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */

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

/* SPI2将所有引脚设置为功能*/
spiREG2->PC0 =(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 <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */

/**-最后启动 SPI2 */
spiREG2->GCR1 =(spiREG2->GCR1 & 0xFEFFFFFFU)| 0x01000000U;
} 

发送功能


spiDAT1_t 数据通信图; dataconfconfig.DFSEL = SPI_FMT_0; dataconfig CSNR = 1U; dataconfig CS_HOLD = 1U; dataconfig WDEL = 0U; TransmitAndReceiveData (spiREG2、&dataconfig、10U、TX_buffer、RX_buffer);

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

    如果要使用 CS0、请清除 CSNR 的位0。 CSNR 是一个控制所有芯片选择引脚的位掩码。 当没有传输活动时、csdef 的默认值为1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    根据参考手册中的表21-20、为了使用 CS0、CNSR 的位0应该被置位。 我的问题是 CS0根本不起作用。 它起作用、但仅当 csdef 为0 (不适合我的用途)时才起作用。 如果您在我之前的帖子[应该切换 MISO 和 ENABLE 的标签]中查看信号布线、您会发现问题。 您是否有其他想法需要检查什么? 谢谢。

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

    您好!
    请尝试清除 CSNR[0](dataconfig1_t.CSNR   = 0xFE;)

    此致
    米罗

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

    问题已解决。 CS[0]正在工作。 :-)

    谢谢、Črt