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.
大家好、
我帮助客户提出问题。
"
我正在尝试开始使用 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 设置/清除功能。
您可以尝试以下几项操作:
您好、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 传输一个额外的虚拟字。 因此、在这个虚拟周期中、从器件可以将数据发送回主器件。