tottionly 发表于 2020-4-1 14:55

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赋值?这不是形参吗?

tomorrowa 发表于 2020-4-1 15:43

没用过你这个芯片,但是我猜测 RXNE 是该芯片的 SPI 寄存器的接收标志,因为SPI在发送一个字节的同时也收到了一个字节,如果 RXNE 为TRUE则表明发送成功;
给 u8Data 赋值看起来没有具体作用。

smartpower 发表于 2020-4-1 21:05

1. SPI是同步传输发送成时也是接收完成时,没有专门增加发送完成的标志,所以通过读取RXNE标志以确认发送完成 。
2. 未设置清除RXNE的控制寄存器,通过读取DATA来实现清除RXNE标志。

smartpower 发表于 2020-4-1 21:30

tottionly 发表于 2020-4-2 10:14

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;
}

smartpower 发表于 2020-4-2 11:22

tottionly 发表于 2020-4-2 10:14
感谢解答。

另外再请教下:


作为主机时,写一个字节到BUF,触发主机发出SCK.有SCK从机才能返回数据。

yzjyh1 发表于 2020-4-4 15:07

SPI 通信时, 发送一个字节数据的同时你会收到一个无用字节数据,   当你读一个字节数据的同时会发送一个无用字节数据
页: [1]
查看完整版本: HC32F030库函数spi发送数据问题请教