1.SPI发送函数
SPI发送时,等待发送缓冲区为空时才能发送。
当发送缓冲区为空时,将要发送的字节写入到SPI的发送缓冲区,WRITE_REG(REG, VAL),库中自带的寄存器写函数,REG为寄存器地址,VAL为要写入的数值。
数据写入到发送缓冲区,数据自动移位发送出去,从机接收到数据后,会返回一串数据,等待接收缓冲区为非空,即成功完成一次发送,此时将接收缓冲区的数据返回,便于后续使用。
/*
*byte:要发送的数据/地址
*/
uint8_t Fn_SpiSendByte(uint8_t byte)
{
SPI_HandleTypeDef hspi;
SPITimeout = 1000;
/* 等待发送缓冲区为空,TXE事件 */
while (__HAL_SPI_GET_FLAG( &hspi, SPI_FLAG_TXE ) == RESET)
{
if((SPITimeout--) == 0) return 0;
}
/* 写入数据寄存器,把要写入的数据写入发送缓冲区*/
WRITE_REG(hspi.Instance->DR, byte);
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待接收缓冲区非空,RXNE事件 */
while (__HAL_SPI_GET_FLAG( &hspi, SPI_FLAG_RXNE ) == RESET)
{
if((SPITimeout--) == 0) return 1;
}
/* 读取数据寄存器,获取接收缓冲区数据 */
return READ_REG(hspi.Instance->DR);
}
2.接收函数
接收数据时,主机只需要发送1字节的任意数据即可接收到数据。
uint8_t Fn_SpiReadByte(void)
{
return (Fn_SpiSendByte(0xff));
}
3.实际使用
使用SPI读取某SPI接口芯片的某一寄存器状态。
需要注意,拉低片选引脚后可适当的延时,某些芯片拉低后立刻读取可能会发生错误。
某些芯片会规定一些特殊SPI指令,用于芯片的配置,如寄存器读命令,寄存器写命令,寄存器复位命令等,具体可参考对应芯片的参考手册。
/*
*uc_addr:要读取的寄存器地址
*/
uint8_t ReadByte(uint8_t uc_addr)
{
uint8_t uc_readByte;
/*拉低片选引脚*/
Fn_CsLow();
/*适当延时*/
Fn_DrvSysTickDelay10us(1);
/*发送SPI读寄存器指令*/
Fn_SpiSendByte(READ);
/*发送要读取的寄存器地址*/
Fn_SpiSendByte(uc_addr);
/*接收数据*/
uc_readByte = Fn_SpiReadByte();
/*拉高片选引脚*/
Fn_CsHigh();
return uc_readByte;
}
/*
*uc_addr:芯片寄存器地址
*uc_dat:要写入的数据
*/
void WriteByte(uint8_t uc_addr,uint8_t uc_dat)
{
Fn_CsLow();
Fn_DrvSysTickDelay10us(1);
/*发送SPI写命令*/
Fn_SpiSendByte(WRITE);
/*要写入的寄存器地址*/
Fn_SpiSendByte(uc_addr);
/*要写入的数据*/
Fn_SpiSendByte(uc_dat);
Fn_CsHigh();
}