ST意法半导体
直播中

神之小风

12年用户 866经验值
私信 关注
[问答]

SPI半双工模式有没有什么特别的技巧?

我想知道SPI半双工模式有没有什么特别的技巧。据我所知,配置是正常完成的,只有 1 行的方向。谁能给我指出某种形式的示例,以半双工方式设置 SPI,然后通过所述端口 SPI 模式接收。我已经搜索了几天,但找不到任何具体的东西。







回帖(1)

刘悦竹

2023-1-30 14:28:40
您在主半双工模式下配置,然后添加第 24 到 27 行


  • HAL_StatusTypeDef MX_SPI2_Init(SPI_HandleTypeDef* hspi)
  • {
  •   HAL_StatusTypeDef ret = HAL_OK;
  •   hspi->Instance = SPI2;
  •   hspi->Init.Mode = SPI_MODE_MASTER;
  •   hspi->Init.Direction = SPI_DIRECTION_1LINE;
  •   hspi->Init.DataSize = SPI_DATASIZE_8BIT;
  •   hspi->Init.CLKPolarity = SPI_POLARITY_HIGH;
  •   hspi->Init.CLKPhase = SPI_PHASE_2EDGE;
  •   hspi->Init.NSS = SPI_NSS_SOFT;
  •   hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  •   hspi->Init.FirstBit = SPI_FIRSTBIT_MSB;
  •   hspi->Init.TIMode = SPI_TIMODE_DISABLE;
  •   hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  •   hspi->Init.CRCPolynomial = 7;
  •   hspi->Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  •   hspi->Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  •   
  •   if (HAL_SPI_Init(hspi) != HAL_OK)
  •   {
  •     ret = HAL_ERROR;
  •   }
  •   
  •   HAL_Delay(5);
  •   SPI_1LINE_TX(hspi);
  •   HAL_Delay(5);
  •   __HAL_SPI_ENABLE(hspi);
  •   
  • }

为了以半双工方式从 SPI 接收,请使用以下命令:


  • void LSM6DS3_WriteReg(uint8_t reg, uint8_t setting)
  • {
  •         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
  •         HAL_SPI_Transmit(&hspi1,®,1,15);
  •         HAL_SPI_Transmit(&hspi1,&setting,1,15);
  •         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
  • }

注意这是读取加速度计+陀螺仪芯片上寄存器的内容
要写入所述芯片,请使用以下代码:


  • uint8_t LSM6DS3_ReadReg(uint8_t reg)
  • {
  •         uint8_t readMask;
  •         uint8_t dataInReg;
  •       
  •         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
  •         readMask = reg|0x80;
  •         HAL_SPI_Transmit(&hspi1,&readMask,1,15);
  •         __HAL_SPI_DISABLE(&hspi1);
  •         SPI_1LINE_RX(&hspi1);
  •         __HAL_SPI_ENABLE(&hspi1);
  •         HAL_SPI_Receive(&hspi1,&dataInReg,1,15);
  •         __DSB();
  •         __DSB();
  •         __HAL_SPI_DISABLE(&hspi1);
  •         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
  •         SPI_1LINE_TX(&hspi1);
  •         __HAL_SPI_ENABLE(&hspi1);
  •       
  •         return dataInReg;
  • }

引脚 12B 是我当前的片选引脚。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分