关于使用32f767HAL库SPI通信的疑惑

2019-07-20 01:38发布

这是标准库编写的与ADIS16407的SPI通信程序,想往HAL库里面移植,需要注意的是什么,发送数据函数和接收数据怎么用,到那就编译错误  ,HAL库接收发送函数后面的四个参量是什么,需要在里面编写状态标志吗?如果需要怎么改?谢谢各路大神  帮忙看看,下面第二个附上我自己往hal移植编写的函数,应该怎么编写????(1)/**
  * @brief  读取ADIS16445 Port ID
  * @param         无
  * @retval ADIS16445 Port ID
  */
u32 SPI_ReadPortID(void)
{
        u32 Temp = 0;
        uint8_t msbData,lsbData;


        SPI_CS_LOW();
        SPI_SendByte(0x56);                //Send 0x5600 to ADIS16445
        SPI_SendByte(0x00);
        SPI_CS_HIGH();
               
        SysTick_Delay_Us(10);
               
        SPI_CS_LOW();
        msbData = SPI_SendByte(0x00);                //receive the data
    lsbData = SPI_SendByte(0x00);
        SPI_CS_HIGH();
       
        SysTick_Delay_Us(10);
    Temp = (msbData << 8) | (lsbData & 0xFF);


  return Temp;
}


/**
  * @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 );
}


/**
  * @brief  使用SPI发送两个字节的数据
  * @param  word:要发送的数据(字)
  * @retval 返回接收到的数据(字)
  */
u16 SPI_GetData(u16 word)
{
        u32 Temp = 0;
        uint8_t msbSendData,lsbSendData;       
        uint8_t msbReceiveData,lsbReceiveData;


        msbSendData=word>>8;                //取出高位字节
        lsbSendData=word&0x00FF;        //取出低位字节
       
        SPI_CS_LOW();
        SPI_SendByte(msbSendData);                                        //发送高位字节
        SPI_SendByte(lsbSendData);                                        //发送低位字节
        SPI_CS_HIGH();
               
        SysTick_Delay_Us(10);
               
        SPI_CS_LOW();
        msbReceiveData = SPI_SendByte(0x00);                //获取高位字节数据
    lsbReceiveData = SPI_SendByte(0x00);                //获取低位字节数据
        SPI_CS_HIGH();
       
        SysTick_Delay_Us(1);
    Temp = (msbReceiveData << 8) | (lsbReceiveData & 0xFF);


  return Temp;
}


/**
  * @brief  等待超时回调函数
  * @param  None.
  * @retval None.
  */
static  uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
        /* 等待超时后的处理,输出错误信息 */
        ADIS16445_ERROR("SPI 等待超时!errorCode = %d",errorCode);
        return 0;
}
/*********************************************END OF FILE**********************/

(2)
/**
  * @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 );
}

/**
  * @brief  使用SPI发送两个字节的数据
  * @param  word:要发送的数据(字)
  * @retval 返回接收到的数据(字)
  */
u16 SPI_GetData(u16 word)
{
        u32 Temp = 0;
        uint8_t msbSendData,lsbSendData;       
        uint8_t msbReceiveData,lsbReceiveData;

        msbSendData=word>>8;                //取出高位字节
        lsbSendData=word&0x00FF;        //取出低位字节
       
        SPI_CS_LOW();
        SPI_SendByte(msbSendData);                                        //发送高位字节
        SPI_SendByte(lsbSendData);                                        //发送低位字节
        SPI_CS_HIGH();
               
        SysTick_Delay_Us(10);
               
        SPI_CS_LOW();
        msbReceiveData = SPI_SendByte(0x00);                //获取高位字节数据
    lsbReceiveData = SPI_SendByte(0x00);                //获取低位字节数据
        SPI_CS_HIGH();
       
        SysTick_Delay_Us(1);
    Temp = (msbReceiveData << 8) | (lsbReceiveData & 0xFF);

  return Temp;
}

/**
  * @brief  等待超时回调函数
  * @param  None.
  * @retval None.
  */
static  uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
        /* 等待超时后的处理,输出错误信息 */
        ADIS16445_ERROR("SPI 等待超时!errorCode = %d",errorCode);
        return 0;
}
/*********************************************END OF FILE**********************/





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。