stm32f429,spi dr寄存器不写数据

Posted

技术标签:

【中文标题】stm32f429,spi dr寄存器不写数据【英文标题】:stm32f429, spi dr register not write data 【发布时间】:2021-06-17 23:05:59 【问题描述】:

code_1

code_2

register on debug

logic analyzer

void SPI_SendData(SPI_RegDef_t *pSPIx,uint8_t *pTxBuffer , uint32_t Len)

while(Len > 0)


    // 1 . wait until TXE is set ,
    while(SPI_GetFlagStatus(pSPIx, SPI_TXE_FLAG) == FLAG_RESET);

    // 2. check the DFF bit in CR1
    if( (pSPIx->CR1 & (1 << SPI_CR1_DFF) ) )
    
        // 16 BIT DFF
        pSPIx->DR = *((uint16_t*)pTxBuffer); // dereferencing(typecasting );
        Len--;
        Len--;
        (uint16_t*)pTxBuffer++; // typecasting this pointer to uint16 type and incrementing by 2.
        /* The buffer is a uint8_t pointer type. When using the 16-bit data frame,
         * we pick up 16-bits of data, increment pointer by 2 bytes,*/
    else
    

        // 8 BIT DFF
         pSPIx->DR = *pTxBuffer;
        Len--;
        pTxBuffer++;
        /*
         *(( uint8_t*)&hspi->Instance->DR) = (*pData);
            pData += sizeof(uint8_t);
            hspi->TxXferCount--;

         */
    


我明白了,MOSI 总是在逻辑分析仪上发送 255 但数据错误。

【问题讨论】:

【参考方案1】:

(uint16_t*)pTxBuffer++; 将指针增加 1 个字节,而不是您在评论中说希望它增加的两个字节。

如果您想通过转换为半字指针并递增来实现,那么您需要执行以下操作:

pTxBuffer = (uint8_t*)(((uint16_t*)pTxBuffer) + 1);

但这只是pTxBuffer += 2;的愚蠢说法

确实在循环中包含 if 是没有意义的,因为 DFF 位的值不会改变,除非你写入它,而你不会。我建议你在单词上写一个循环,在字节上写一个循环,并将 if 放在顶层。

【讨论】:

以上是关于stm32f429,spi dr寄存器不写数据的主要内容,如果未能解决你的问题,请参考以下文章

STM32 SPI数据打包

STM32F429第二十五篇之MCU屏实验详解

STM32F429第二十五篇之MCU屏实验详解

STM32发现F3 SPI环回RXFIFO收不到数据

STM32F103(二十六)SPI通信(+两块STM32之间的SPI通信)

STM32F103(二十六)SPI通信(+两块STM32之间的SPI通信)