OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3453|回复: 1

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

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-11
在线时间
5 小时
发表于 2019-5-29 15:14:06 | 显示全部楼层 |阅读模式
5金钱
这是标准库编写的与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**********************/





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-30 02:28:09 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 23:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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