野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9277|回复: 2

标准库SPI移植到HAL的SPI的疑惑

[复制链接]
发表于 2019-5-26 12:48:50 | 显示全部楼层 |阅读模式
发送时,可以通过检测SPI_SR中的TXE位,当数据寄存器里有数据时,TXE位是0,当数据全部从数据寄存器的发送缓冲区传输到移位寄存器时TXE位被置1,这时候可以再往数据寄存器里写入数据。可以通过
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) 来检测。
SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE  是库函数可以检测SPI的一些状态位。
接收时
可以通过检测SPI_SR中的RXNE位,当数据寄存器里有数据时,RXNE位是0,当数据全部从数据寄存器的接收缓冲区传输到移位寄存器时RXNE位被置1,这时候可以从数据寄存器里读出数据。可以通过
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 来检测。源程序如下,  SPI 读写一个字节,读写一体
标准库的源程序:
/**
  * @brief  使用SPI发送一个字节的数据
  * @param  byte:要发送的数据
  * @retval 返回接收到的数据
  */
u8 SPI_SendByte(u8 byte)
{
         SPITimeout = SPIT_FLAG_TIMEOUT;
         /* 等待发送缓冲区为空,TXE事件 */
         while (SPI_I2S_GetFlagStatus(SPIx , SPI_I2S_FLAG_TXE) == RESET)
        {
                if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
    }


        /* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
        SPI_I2S_SendData(SPIx , byte);


        SPITimeout = SPIT_FLAG_TIMEOUT;
        /* 等待接收缓冲区非空,RXNE事件 */
        while (SPI_I2S_GetFlagStatus(SPIx , SPI_I2S_FLAG_RXNE) == RESET)
        {
                if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
        }


        /* 读取数据寄存器,获取接收缓冲区数据 */
        return SPI_I2S_ReceiveData(SPIx );
}
移植到HAL库里这样写TXE   和RXEN报错  ,应该怎么改这个程序,给答疑解惑一下

回复

使用道具 举报

发表于 2019-5-26 16:32:58 | 显示全部楼层
hal库里面有SPI_I2S_GetFlagStatus这个函数吗?
hal库里面找到个这个
/* Wait until TXE flag is set to send data */
__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)
如果是要发数据的话 应该直接调用
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-26 16:57:11 | 显示全部楼层
谢谢  我再看看怎么改
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-19 18:49 , Processed in 0.113707 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表