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.

[参考译文] TMDSCNCD28335:两个 F28335器件之间的 F28335 SPI 通信

Guru**** 654100 points
Other Parts Discussed in Thread: TMDSCNCD28335, TMDSDOCK28335
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195534/tmdscncd28335-f28335-spi-conmmunication-between-two-f28335-device

器件型号:TMDSCNCD28335
主题中讨论的其他器件: TMDSDOCK28335

大家好、

我帮助客户提出问题。

"

我正在尝试开始使用 F28335上的 SPI 功能。 现在、我将使用两 个带扩展坞的 TMDSCNCD28335控制卡。 在我尝试启动时、我计划在 SPI 中将板1用作主器件、并将板2用作从器件。 器件1将与第二个单元一起将时间数据发送到器件2。 器件2将仅向器件1发送0xF 的虚拟数据。 对于我的解串项目、我使用的是由 EPWMSOCA 触发的 ADC 中断、而不是 SPI 中断。 我修改了控制套件中的演示代码以完成此任务。 但它看起来器件1/2接收到的数据都是随机值、而不是我加载到发送器缓冲器中的值。 以下是我的 SPI 部分代码:

 

器件#1

void InitSpiFifoMaster()
{/*
不带 FIFO*的初始化 SPI 从模式/SpiaRegs.SPICCR.bit.SPISWRESET
 = 0//重置 SPI

SpiaRegs.SPICCR.bit.SPICHAR = 0xF//将 SPI charater 长度设置为16位(0xF) SpiaRegs.SPICCR.bit.SPICAR = 0>SPICTAL.SPICT.1>SPICT.MASTER.LE.SPICTRL.TAL.LE.SPICT.1>
发送。 
设置为0将通过设置输出线路高
SpiaRegs.SPIBRR = 0x0063来禁用下一个字的 TX//设置波特率:40MHz/(0x63+0x1)=40MHz/100=400bps
SpiaRegs.SPIPRI.bit.FREE = 1//启用自由运行、连续 SPI 操作、无论暂停发生
//*设置 SPI FIFO 寄存器*/
SpiaRegs.SPIFFTX.bit.SPIRST = 1//
启用 SPIFFTX = 1;SPIFFIF.SPIF.SPIF.SPIF.SPIF.SPIFS/ SPIF.SPIF.SPIF.SPIF.SPIFFFIFO = 1;SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIFT. 
//从复位模式
SpiaRegs.SPIFFTX.bit.TXFFINTCLR 释放 TX FIFO = 1//清除 TXFIFO 中断(W1C:写入以清除)
SpiaRegs.SPIFFTX.bit.TXFFIL = 0x00//将 TX FIFO 中断电平设置为0
 FIFO SpiRegs.SPIFX.BIT = 1
;RXIFFR.BIT = 1;接收 RXIFFRIFORT.TXT.TXIF.SIT.TXIF.SIT.SIT.TXT.SIT.SIT.SIT.SITX = 1; //清除 SPI FIFO RXFFINTCLR 标志(W1C:写入一个以清除)
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x0//将 RX FIFO 中断电平设置为0
SpiaRegs.SPIFFCT.bit.TXDLY = 0x00//将 FIFO 发送延迟设置为零

SpiaRegs.SPICESRCR.SPICESCR.bit 1//从复位模式释放 SPI


void SpiTxDat (uint16 TX)

/*主器件发送到从器件的时间*/
GpioDataRegs.gpACLEar.gpio19 = 1
SpiaRegs.SPITXBUF = TX//将数据加载到 SPI 输出缓冲
器,而(SpiDataRegs.SPIFX.gpiFET =

 1)= 1;/SpiRXIF.GPIO= 1;
//接收到数据!/SpiDataRegs.piRXIFx = 1;GPI = 1;GPI = 1;GPI 数据接收到数据 

 

器件#2

void InitSpiFifoSlave()
{/*Initializa
 SPI 从模式,不带 FIFO*/
SpiaRegs.SPICCR.bit.SPISWRESET = 0//重置 SPI

SpiaRegs.SPICCR.bit.SPICHAR = 0xF//将 SPI charater 长度设置为16位(0xF) SpiaRegs.SPICCR.bit.SPICAR = 0>SPICTAL.SPICT.USTRL.1>SPICTAL.LE.SPICT.USTRISTALM.0
;/SPICT.USTRISTL.BIT.1<bit.SPICTALT.0;/SPICTALT. 
设置为0将通过设置输出线路高
SpiaRegs.SPIBRR = 0x0063来禁用下一个字的 TX//设置波特率:40MHz/(0x63+0x1)=40MHz/100=400bps
SpiaRegs.SPIPRI.bit.FREE = 1//启用自由运行、连续 SPI 操作、无论暂停发生
//*设置 SPI FIFO 寄存器*/
SpiaRegs.SPIFFTX.bit.SPIRST = 1//
启用 SPIFFTX = 1;SPIFFIF.SPIF.SPIF.SPIF.SPIF.SPIFS/ SPIF.SPIF.SPIF.SPIF.SPIFFFIFO = 1;SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIF.SPIFT. 
//从复位模式
SpiaRegs.SPIFFTX.bit.TXFFINTCLR 释放 TX FIFO = 1//清除 TXFIFO 中断(W1C:写入以清除)
SpiaRegs.SPIFFTX.bit.TXFFIL = 0x00//将 TX FIFO 中断电平设置为0
 FIFO SpiRegs.SPIFX.BIT = 1
;RXIFFR.BIT = 1;接收 RXIFFRIFORT.TXT.TXIF.SIT.TXIF.SIT.SIT.TXT.SIT.SIT.SIT.SITX = 1; //清除 SPI FIFO RXFFINTCLR 标志(W1C:写入一个以清除)
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x0//将 RX FIFO 中断级别设置为0
SpiaRegs.SPIFFCT.bit.TXDLY = 0x00//将 FIFO 发送延迟设置为零 SpiaRegs.SPICF.SpiSpi1.SPICF







 = 0x00;同时将 SpiF = 0xSpiRF.SPIRF.SPIRF.SPIRF.SpiSpiSpiSpiSpiSpiSpiSpiSpiSpin.***.SpiSpin.SPCR.SpiSpiSpiSpiSpiSpiSpiSpin.SPIF.SpiSpiSpiSpiSpin.Spi //等待数据被接收
DataSpiRx = SpiaRegs.SPIRXBUF

 

我不确定我的代码中哪种设置是错误的。

"

非常感谢你的帮助。

此致、

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

    您好!

    请通过探测扩展坞上的相应信号来检查 SPI 引脚上的活动。 如果未观察到 SPI 引脚上的活动、请仔细检查引脚复用配置(未显示在代码段中)。 最好查看电路板原理图/文档、以确保推出 SPI 引脚不需要任何硬件设置。  

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

    您好、Gus、

    感谢你的帮助。
    我使用 DSP2833x_SPI.c 中的演示代码函数配置 GPIO 引脚 随附的文本文件是用于 SPI 通信的 GPIO 配置的代码段。 器件1和器件2通过跳线连接。 这两个器件均配置 GPIO 16/17/18/19作为 SPI 相关功能。
    屏幕截图显示了两个器件之间的信号。 尽管两个电路板上的两个 GPIO-19都配置为具有 I/O 的 SPISTEA SPISTEA 信号仍然异常。 我在这两个波形上仔细检查了我的连接、但我没有发现任何连接问题。 如果我将另一个 GPIO 引脚设置为输出以替代主器件上的 SPISTEA 引脚、是否起作用?

    e2e.ti.com/.../SPI_5F00_GPIO_5F00_Init.txt

    此致

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

    您能否澄清一下您使用的是哪个 controlCARD 修订版和哪个集线站? 在此(www.ti.com/.../TMDSPREX28335) 资源管理器套件上、您使用的 SPI 引脚转至板上的编解码器。 我看不到从编解码器上断开 GPIO19/SPISTE 的方法。 但不确定这是您使用的电路板。

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

    您好、Gus、

    感谢你的帮助。

    我正在使用 TMDSDOCK28335的评估套件。 控制卡为 TMDSCNCD28335 [R2.2]。 坞站是在以下链接中带有 DIMM-100插槽的插槽:
    www.ti.com/.../sprufr5i.pdf

    如果在该集线站上使用 GPIO-19、能否将 GPIO-57用作 SPISTEA? 同时、GPIO-57不是对接板上的布局、我似乎需要从 DIMM-100引脚焊接跳线。

    此致、

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

    非常感谢您澄清了您使用的电路板。 这对您有很大帮助。 GPIO19应该正常工作、所以不确定为什么看不到它切换。 我确实注意到的一点是、您在 pimux 中将 GPIO19配置为 SPISTEA、但仍使用 GPIO 设置和清除指令。 当配置为 SPISTEA 时、该引脚将直接由主器件驱动、无需使用 GPIO 设置/清除功能。

    您可以尝试以下几项操作:

    • 在主器件侧、将 GPIO19配置为 GPIO、并尝试使用设置/清除功能进行切换。 请注意、在从器件侧、您需要使用配置为 SPISTEA 的 GPIO19。
    • 如果 GPIO19未切换、请尝试暂时断开主器件/从器件之间的 GPIO19引脚、以查看主器件是否可以切换此引脚。
    • 最后、尝试使用任何其他 GPIO 引脚作为主器件侧的片选。 在这种情况下、您需要将引脚配置为 GPIO、并使用设置/清除指令切换引脚。 在从器件侧、您需要使用配置为 SPISTEA 的 GPIO19。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gus、

    感谢您对 SPISTEA 引脚的建议。 到目前为止、我已经使 SPI 与两个 F28335 MCU 之间的16字 FIFO TX/RX 缓冲器一起工作。 波特率设置为400kbps、数据传输频率为50Hz。
    通过轮询 SpiaRegs.SPIFFRX.bit.RXFFST 的寄存器位、代码在无限循环中运行。 一旦其值达到16、软件将弹出 RXFIFO。 至于 TXFIFO、主器件会在通信开始前将数据输入 ADC 中断。 当寄存器 SpiaRegs.SPIFFTX.bit.TXFFST 为0时、从器件按压。 在这里、从器件传输到主器件的数据存在重大延迟。
    这里是我将数据推入 FIFO 缓冲区/从 FIFO 缓冲区弹出数据的顺序。

    图片--

    因此、从主器件传输到从器件的数据延迟较小。 从器件到主器件的数据具有~20ms 的延迟。 您有什么建议可以缩短此延迟时间吗?

    此致、

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

    Zhonghui、

    很高兴知道问题已解决。 我想知道分辨率是多少?

    关于您的新问题:从站只能在主站生成时钟时发送数据。 由于主设备每20ms (50Hz)传输一次数据、在当前实施中、从设备传输的数据需要很长时间才能到达主设备。 如果您需要更快、您可以做的一件事是让主器件每20ms 传输一个额外的虚拟字。 因此、在这个虚拟周期中、从器件可以将数据发送回主器件。