CH582 spi 读 lora寄存器错位

比如读0x42读lora芯片的版本好 返回的是下一个寄存器的值。读0x41才能返回0x42的值

类似的代码在stm32上正常不会错位


***********  main **************

#if 1
  /* SPI 0 */
  GPIOA_SetBits( GPIO_Pin_12 );
  GPIOA_ModeCfg( GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA );

  // lora_reset perform reset
      GPIOA_ResetBits(LORA_RESET);

      DelayMs( 10 );
      GPIOA_SetBits(LORA_RESET);

      DelayMs( 10 );
      SPI0_DataMode(Mode0_HighBitINFront);
  SPI0_MasterDefInit();

  while( 1 )
  {
    uint8_t version = LORA_singleTransfer(0x42,0x00);
    char info[20];
    sprintf(info,"0x%02x \n",version);
      PRINT(info);
      DelayMs(1000);
  }


**************************************


uint8_t LORA_singleTransfer(uint8_t address, uint8_t value)
{
  uint8_t response;

  GPIOA_ResetBits( GPIO_Pin_12 );
  SPI0_MasterSendByte( address );
  SPI0_MasterSendByte( value );
  response = SPI0_MasterRecvByte();
  GPIOA_SetBits( GPIO_Pin_12 );

  return response;
}

582的SPI只支持模式0和模式3.
有条件可以用示波器或者逻辑分析仪看下SPI的波形,看看数据发送是否异常。
另外如果不具备观测波形的条件,可以把SPI的时钟先调慢,试试效果,硬件电路上如果串了电阻啥 的,时钟调慢可能也可以解决问题。


spi相当于8位环形移位寄存器,发送8位数据,同时收到8位数据,收发是两个数据寄存器,比如R8_DATA_REG =被发送的数据,同时读回收到的数据,return R8_DATA_REG


字节传输(全双工)

uint8_t ch57x_hal_spi_transfer(uint8_t data) {

    R8_SPI0_BUFFER = data;

    while( !(R8_SPI0_INT_FLAG & RB_SPI_FREE) );

    return ( R8_SPI0_BUFFER );

}

参考这个



只有登录才能回复,可以选择微信账号登录