这是标准库编写的与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**********************/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>