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寄存器来执行的。TXE标志未被清除,但当我将数据写入SPI_DR寄存器时,将打开RXEN标志。为什么要打开RXEN旗子?为什么TXE旗帜不被清除?
发布于 2022-11-07 12:07:18
(uint16_t*) pTxBuffer++;,这是错误的
pSPIx->DR = *pTxBuffer;是错误的,因为它传输32位而不是8位。如果你的微型有SPI FIFO -你将发送4个字节。
清除TXE位是通过写入SPI_DR寄存器来执行的。
是的,但是当数据被移动到shift寄存器时,将设置此标志,指示您可以放置更多的数据。因此,它将在很短的时间内被清除。
为什么要打开RXEN标志?
你可能是说RXNE吧。当它发送时,它被设置为主接收数据(BTW,它是接收任何东西的唯一方式--您需要发送虚拟数据)。这是百分之百正确的行为
https://stackoverflow.com/questions/74345877
复制相似问题