|
本帖最后由 achild 于 2021-4-6 20:14 编辑
我的stm32通过spi跟fpga连,rs485跟pc机连。
我的stm32里面用的是hal库的spi函数。起初跟fpga这边的spi都已经调通了。
然后把设备给pc端做上位机的同事调。调了一会设备上传数据就挂了。
本以为可能是硬件问题,换了一块新的,刚开始确实没问题,上位机同事调了一会还是挂掉了。
debug了一下,发现的spi的发送函数HAL_SPI_Transmit,返回状态中的错误包含了HAL_SPI_ERROR_UDR,HAL_SPI_ERROR_MODF,HAL_SPI_ERROR_FRE三种错误。
这三种状态都是在HAL_SPI_Transmit调用SPI_CloseTransfer函数的时候 | 到返回状态变量中的。
确定了HAL_SPI_Transmit是持续被调用的,用示波器打了一下spi的各条线,什么信号都没有。
现在毫无头绪,有没有坛友给指个路的!!!
又测试了一下io,并没有坏。感觉不像是硬件的问题。
还有一个现象是,使用HAL_SPI_Transmit_It配置了发送。监测spi的发送计数器,正常情况下计数器会一直--直到0。现在的话,计数器配置完了之后,过了很久,一个byte都没有发出去。
什么情况下会导致spi一个byte都发不出去?
HAL_SPI_ERROR_UDR对应的寄存器bit为UDR:underrun at slave transmission mode Note: UDR flag applies to Slave mode only
这意思是只会在设备处于slave mode的时候触发,但是我的设备是全程主设备啊!!
HAL_SPI_ERROR_MODF对应的寄存器bit为MODF:mode fault
HAL_SPI_ERROR_FRE对应的寄存器bit为TIFRE: TI frame format error
为什么会有这个错误啊,我配置的是协议是motorola的标准spi协议啊
查了一天,发现在初始化SPI之后,SPI的寄存器全部自动清零了。现在只能用之前再初始化一次。
好奇怪的现象啊,设备没有复位,其他外设寄存器也没有复位,只有spi寄存器,会清零一次。
完了,问题找到了,有个数组越界了。真的是服了我自己 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|