HC32F030库函数spi发送数据问题请教
本帖最后由 tottionly 于 2020-4-1 17:01 编辑en_result_t Spi_SendData(en_spi_channel_t enCh,uint8_t u8Data)
{
uint32_t u32TimeOut;
ASSERT(IS_VALID_CH(enCh));
u32TimeOut = 0xffff;
if(Spi0 == enCh)
{
while(--u32TimeOut)
{
if(TRUE == M0P_SPI0->STAT_f.TXE)
{
break;
}
}
if(u32TimeOut == 0)
{
return ErrorTimeout;
}
M0P_SPI0->DATA = u8Data;
u32TimeOut = 0xffff;
while(--u32TimeOut)
{
if(TRUE == M0P_SPI0->STAT_f.RXNE)
{
break;
}
}
if(u32TimeOut == 0)
{
return ErrorTimeout;
}
u8Data = M0P_SPI0->DATA;
}
else
{
while(--u32TimeOut)
{
if(TRUE == M0P_SPI1->STAT_f.TXE)
{
break;
}
}
if(u32TimeOut == 0)
{
return ErrorTimeout;
}
M0P_SPI1->DATA = u8Data;
u32TimeOut = 0xffff;
while(--u32TimeOut)
{
if(TRUE == M0P_SPI1->STAT_f.RXNE)
{
break;
}
}
if(u32TimeOut == 0)
{
return ErrorTimeout;
}
u8Data = M0P_SPI1->DATA;
}
return Ok;
}
这是华大HC32F030的库函数。
请教下:
1. 这里发送一个字节,为什么要判断RXNE?
2. 为什么最后对u8Data赋值?这不是形参吗?
没用过你这个芯片,但是我猜测 RXNE 是该芯片的 SPI 寄存器的接收标志,因为SPI在发送一个字节的同时也收到了一个字节,如果 RXNE 为TRUE则表明发送成功;
给 u8Data 赋值看起来没有具体作用。 1. SPI是同步传输发送成时也是接收完成时,没有专门增加发送完成的标志,所以通过读取RXNE标志以确认发送完成 。
2. 未设置清除RXNE的控制寄存器,通过读取DATA来实现清除RXNE标志。
smartpower 发表于 2020-4-1 21:05
1. SPI是同步传输发送成时也是接收完成时,没有专门增加发送完成的标志,所以通过读取RXNE标志以确认发送完 ...
感谢解答。
另外再请教下:
uint8_t Spi_ReceiveData(en_spi_channel_t enCh,boolean_t bMasterOrSlave)
{
uint8_t temp;
ASSERT(IS_VALID_CH(enCh));
if(Spi0 == enCh)
{
if(1 == bMasterOrSlave)
{
M0P_SPI0->DATA = 0x00;
}
while(0 == M0P_SPI0->STAT_f.RXNE){;}
temp = M0P_SPI0->DATA;
}
else
{
if(1 == bMasterOrSlave)
{
M0P_SPI1->DATA = 0x00;
}
while(0 == M0P_SPI1->STAT_f.RXNE){;}
temp = M0P_SPI1->DATA;
}
return temp;
}
接收的函数中bMasterOrSlave==1 应该是表示是主机的意思,为什么主机接收需要进行M0P_SPI0->DATA = 0x00 操作?
另外,在HC32L136的LITE版本库函数中,发送和接收都很简单。
en_result_t Spi_SendData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data)
{
SPIx->DATA = u8Data;
return Ok;
}
uint8_t Spi_ReceiveData(M0P_SPI_TypeDef* SPIx)
{
return SPIx->DATA;
}
tottionly 发表于 2020-4-2 10:14
感谢解答。
另外再请教下:
作为主机时,写一个字节到BUF,触发主机发出SCK.有SCK从机才能返回数据。 SPI 通信时, 发送一个字节数据的同时你会收到一个无用字节数据, 当你读一个字节数据的同时会发送一个无用字节数据
页:
[1]