关于STM32/GD32的SPI发送与接收的一些心得

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();        
}

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值