C语言 发送数据时SPI:SPI:TXE未清除

pb3skfrl  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(215)
void SPI_SendData(SPI_RegDef_t *pSPIx ,uint8_t *pTxBuffer,uint32_t len)
{
    while(len > 0)
    {
        // 1. chờ cờ TXE set (chờ cho thanh txbuffer trống)
        while (SPI_GetFlagStatus(pSPIx, SPI_FLAG_TXE) == FLAG_RESET);
        //2. kiểm tra DFF

        if(((pSPIx->CR1 >> SPI_CR1_DFF) & 1) == SPI_DFF_16BIT)
        {
            // 16 bit
            pSPIx->DR = *((uint16_t*) pTxBuffer);
            (uint16_t*) pTxBuffer++;
            len--;

        }else
        {
            pSPIx->DR = *pTxBuffer;
            pTxBuffer++;
        }

         len--;
    }
}

我认为,清除TXE位是通过写入SPI_DR寄存器来执行的。当我向SPI_DR寄存器写入数据时,TXE标志未被清除,但RXEN标志打开。为什么RXEN标志打开?为什么TXE标志未被清除?

w46czmvw

w46czmvw1#

这是错误的
pSPIx->DR = *pTxBuffer;错误,并且它传输32位而不是8位。如果微处理器具有SPI FIFO,则将发送4个字节。
通过写入SPI_DR寄存器来清除TXE位
是的,但是当数据被移动到移位寄存器时,这个标志被设置,表示你可以放置更多的数据。所以它将被清除很短的时间。
为什么RXEN标志打开?
您可能指的是RXNE。它在传输的同时被设置为主机接收数据(顺便说一句,这是接收任何东西的唯一方式-您需要传输虚拟数据)。这是100%正确的行为

相关问题