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.
器件型号:MSP432P401R
我注意到库函数出现了一种奇怪的行为
uint_fast8_t SPI_getInterruptStatus (uint32_t moduleInstance、uint16_t mask)
在 Breif 中、用于检查 UCxTXBUF 在多字节传输期间是否为新字节做好准备、如果之前发送的字节 MSB 为"1"、则将 SPI SIMO 引脚设置为高电平。
我更换了
while (!SPI_getInterruptStatus (DevHandle->SensorSpiModule、SENSE_SPI_Transmit _INTERRUPT));
和以下指令
while (!(UCTXIFG 和 SENSE_SPI_INTERRUPT_FLAG_REGTER));
规避该问题、实际上会对与从 SPI 传感器的通信产生负面影响。
是否仍然是 SPI_getInterruptStatus 的预期行为?
该函数(源位于\TI 中)只需读取 USCI IFG 寄存器、然后使用您提供的掩码对其进行读取。
您所描述的是读取 IFG 会改变(Tx)数据流的效果、这似乎是不可能的。 这不仅仅是对硬件的信任--我已经看到了大量使用这种技术的代码,没有人报告过这样的效果。
您的 driverlib 源是否有损坏的机会? (我做过一次。) 您如何确保"DevHandle->SensorSpiModule"正确?
这里是否有更多上下文?
尊敬的 Bruce:
我也很惊讶。 遗憾的是、我没有保存任何示波器迹线。 无论如何、我正在配置 SPI 传感器、该传感器需要从主器件(MCU)向从器件(传感器)发送 uint16_t 值的序列。
我只能说、我无法从特定寄存器读回数据、是的、更奇怪的是:其他寄存器工作正常。
我将按顺序配置寄存器、对每个寄存器重复以下写入-读取过程:
用示波器仔细分析总线流量我注意到 MOSI 导线在地址字节和虚拟字节之间始终设置为高电平、显然没有理由。 无论如何、它不是在时钟上升沿进行采样、因此从理论上讲、它并不是问题。 在发送配置字节之前、写入例程没有发生这种情况。 更改读忙等待方法可以解决所有问题。
我会尽快重现这种情况、可能是因为库混乱、或者我无意中对代码进行了一些其他更改、现在不管我是如何实现忙等待的、它都能正常工作。
尊敬的 Bruce:
您可以查看下面的示波器迹线:
黄色->芯片选择
蓝色-> MOSI
粉红色->时钟
绿色-> MISO
你说得对:我实际上是在轮询接收标志、
while (!SPI_getInterruptStatus (DevHandle->SensorSpiModule、SENSE_SPI_Transmit _INTERRUPT));
按预期工作:
我对 SPI 控制器进行编程、以便在发送字节之前清除接收中断标志、并在发送字节后等待该标志。 最后、根据 SPI 协议、您可以假设从器件在您返回一个字节后已完全接收到一个字节、对吧? 将以下代码放入读取例程中
//发送地址字节 SPI_transmitData (DevHandle->SensorSpiModule、(uint_fast8_t)(地址|(1<<7))); //等待 RX 缓冲区准备就绪 while (!SPI_getInterruptStatus (DevHandle->SensorSpiModule、SENSE_SPI_Receive_interrupt)); //清除中断标志 SPI_clearInterruptFlag (DevHandle->SensorSpiModule、SENSE_SPI_Receive_interrupt); //发送虚拟字节 SPI_transmitData (DevHandle->SensorSpiModule、0x00);
转到以下跟踪:
在复位或轮询中断标志寄存器时、微控制器似乎不可能毫无理由地设置 MOSI。 因此、获取了最后一个屏幕截图(3)、将传感器 SDI 与 MCU 断开。 意外的 MOSI 信号来自微控制器。 然而、在发送虚拟字节之前进行复位、MOSI 干扰不应影响读取过程、不是吗?
尊敬的 Bruce:
很抱歉、我的回答很晚、但我在回复之前一直在等待收集更多详细信息。
首先:感谢解决方法提示、这是一种有趣的方法来了解何时可以提取数据。
该传感器是 STM 中的 LIS3DSH。 我联系了他们的技术帮助、他们为我提供了一个在备用 STM32eval 上运行的示例项目。 根据示波器迹线、它们管理 SPI 总线的方式与我最初在 MSP432上实施的方式非常相似。 主 SDO 在有效数据字节被传输前保留地址 LSB (最后发送的位)(不是 MSB)、但是在任何情况下读取/写入操作都成功。
怠速运行后、SPI 外设会在 MISO 引脚设置为输出时唤醒、从而影响传感器输出信号吗?
我从 STM 环境中附加一对采集:
写入:
阅读:
尊敬的 Bruce:
我做了一些额外的测试、并尝试对问题的根本原因进行猜测。
您可以查看以下链接以了解更多信息。
https://community.st.com/s/question/0D50X00009kHRHISA4/failure-reading-from-lis3dsh-spi-interface
尊敬的 Bob:
很高兴再次听到你的声音!
您是否查看过我上一篇文章中的链接? 请告诉我您对它的看法,很多人都在看它,但没有人回答。
为了使保持时间计算变得混乱、我尝试使用 SPI_isBusy ()、如下所示:
//发送数据字节 SPI_transmitData (SensorInse->ModuleInstance、(uint_fast8_t) SpiTxByte); //等待 TX 缓冲区准备就绪 while (!spi_getInterruptStatus (SensorInUse->ModuleInstance、SPI_Transmit interrupt_FLAG)); //等待 SPI 准备就绪 while (SPI_isBusy (SensorInUse->ModuleInstance)); //设置 CS GPIO_setOutputHighOnPin (SensorInUse->CsPort、SensorInUse->CsPin);
但在传输结束之前、ChipSel 会变为高电平。
(P.S. 我知道、等待 TX 缓冲区准备就绪也可能是冗余的)
我执行了你的建议。
//降低 CS GPIO_setOutputLowOnPin (SensorInUse->CsPort、SensorInUse->CsPin); //等待建立时间 while (--Timeout); //等待 TX 缓冲区准备就绪 while (!SPI_getInterruptStatus (SensorInUse->SerialPeripheral、SPI_Transmit _interrupt_FLAG)); //发送地址字节 SPI_transmitData (SensorInUse->SerialPeripheral、(uint_fast8_t)(SpiActiveAddress|(1<<7))); //等待 TX 缓冲区准备就绪 while (!SPI_getInterruptStatus (SensorInUse->SerialPeripheral、SPI_Transmit _interrupt_FLAG)); //发送虚拟字节 SPI_transmitData (SensorInUse->SerialPeripheral、0x00); //等待 SPI 模块准备就绪 while (SensorInse->SpiModuleAddress->STATW 和 EUSCI_B_STATW_SPI_BUSY); //设置 CS GPIO_setOutputHighOnPin (SensorInUse->CsPort、SensorInUse->CsPin);
似乎工作正常,太差了!