打印
[技术问答]

HC32F030库函数spi发送数据问题请教

[复制链接]
2129|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 | 只看该作者

使用特权

评论回复
5
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;
}


使用特权

评论回复
6
smartpower| | 2020-4-2 11:22 | 只看该作者
tottionly 发表于 2020-4-2 10:14
感谢解答。

另外再请教下:

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

使用特权

评论回复
7
yzjyh1| | 2020-4-4 15:07 | 只看该作者
SPI 通信时, 发送一个字节数据的同时你会收到一个无用字节数据,   当你读一个字节数据的同时会发送一个无用字节数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

36

帖子

1

粉丝