STM32 SPI驱动程序始终接收数据0

麦肯齐·古德温

我正在尝试使用stm32 LL库(用于STML4系统)编写SPI驱动程序。我正在通过将2个字节写入MOSI行并在MISO行上侦听1个字节来测试SPI驱动程序。使用示波器,我能够验证2个字节是否正确传输,并且SPI从设备以一个字节进行响应。请参阅所附的屏幕截图:

在此处输入图片说明

在图中,我正在探查SCLK和MISO线。显然,MISO线上的最后8位是0b01110011,这是预期的数据。我编写的驱动程序无法反映这一点,并且始终从SPI DR寄存器读取0。由于SPI外设,我在尝试以调试模式运行代码时遇到了问题(也许我遗漏了一些东西),并且无法使用printf输出值(无法访问UART接口)。我希望就可能出现的问题提出一些想法。

void spi_transmit_receive( SPI_TypeDef* spi, uint8_t* tx, uint8_t* rx, uint16_t size )
{

    if( !LL_SPI_IsEnabled( spi ) )
    {
        LL_SPI_Enable( spi );
    }

    if( size > 1 )
    {
        LL_SPI_SetRxFIFOThreshold( spi, LL_SPI_RX_FIFO_HALF_FULL );
    }
    else
    {
        LL_SPI_SetRxFIFOThreshold( spi, LL_SPI_RX_FIFO_QUARTER_FULL );
    }


    uint8_t* rx_ptr = rx;
    uint8_t* tx_ptr = tx;

    uint16_t tx_count = size;
    uint16_t rx_count = size;

    while( tx_count > 0 || rx_count > 0 )
    {
        if( tx_count > 0 && LL_SPI_IsActiveFlag_TXE( spi ) )
        {
            if( tx_count > 1 )
            {
                LL_SPI_TransmitData16( spi, *((uint16_t*)tx_ptr) );

                tx_ptr += sizeof( uint16_t );

                tx_count -= 2;
            }
            else
            {
                LL_SPI_TransmitData8( spi, *tx_ptr );

                tx_count -= 1;
            }
        }

        if( rx_count > 0 && LL_SPI_IsActiveFlag_RXNE( spi ) )
        {
            if( rx_count > 1 )
            {
                *((uint16_t*)rx_ptr) = LL_SPI_ReceiveData16( spi );
                rx_ptr += sizeof( uint16_t );
                rx_count -= 2;

                if( rx_count <= 1 )
                {
                    // Switch to 8 bit mode for last 8 bits
                    LL_SPI_SetRxFIFOThreshold( spi, LL_SPI_RX_FIFO_QUARTER_FULL );
                }
            }
            else
            {
                *rx_ptr = LL_SPI_ReceiveData8( spi );
                //rx_ptr += sizeof(uint8_t);
                rx_count -= 1;
            }
        }
    }

    while( LL_SPI_IsActiveFlag_BSY( spi ) ) {}

    LL_SPI_Disable( spi );
}
克利福德

您未指定特定的STM32部件,因此无法提供特定的用户手册参考,整个STM32部件范围内至少有两个SPI外设变体,因此无法确定您的部件,但STM32F1xx和STM32F2xx SPI_DR状态的文档(我的重点是):

根据数据帧格式选择位(SPI_CR1寄存器中的DFF),发送或接收的数据为8位或16位。必须在使能SPI以确保正确操作之前进行选择

在事务中间将帧从16位更改为8位是无效的。看来您应该只在8位模式下操作此设备,并仅发送两个字节。我认为,当所有传输都是16位倍数时才使用16位帧是合适的

我想象发生了什么事,该设备​​保持在16位模式,并且要发送的数据MSB首先在SPI_DR的MSB中结束。但是由于文档表明这是不确定的行为,因此所有赌注都没有了。

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章