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