Проблема надежности SPI при передаче большого количества данных - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю ведомое устройство SPI на основе микроконтроллера STM32F750V8T6, и у меня возникают проблемы с потерей синхронизации между ведущим и ведомым устройствами.Когда я запускаю тест, который отправляет байты синхронизации, ведомое устройство получает данные от главного устройства, снова выполняет синхронизацию, и ведомое устройство возвращает данные через некоторое время, когда ведущее устройство получает байты синхронизации, а не сообщение, которое было отправлено.

Я попытался понизить скорость, добавив задержки между синхронизациями.

Конфигурация главного SPI:

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

ИБП ведомого SPI init

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_SLAVE;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

главная синхронизация

  uint8_t txackbytes = SPI_MASTER_SYNBYTE;
  rxackbytes = 0x00;
  do
  {
    SPI_TASK(HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&txackbytes, (uint8_t *)&rxackbytes, 1, HAL_MAX_DELAY))
  }while(rxackbytes != SPI_SLAVE_SYNBYTE);

ведомая синхронизация

  uint8_t txackbyte = SPI_SLAVE_SYNBYTE;
  uint8_t rxackbyte = 0x00;
  do
  {
    SPI_TASK(HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&txackbyte, (uint8_t *)&rxackbyte, 1, HAL_MAX_DELAY))
  } while (rxackbyte != SPI_MASTER_SYNBYTE);

ведущий в то время как (1)

HAL_GPIO_WritePin(SPI_SS_GPIO_Port,SPI_SS_Pin,GPIO_PIN_RESET);

    Master_Synchro();
    SPI_TASK(HAL_SPI_Transmit(&hspi1, (uint8_t*)&porukaSize, 2, 50));

    Master_Synchro();
    SPI_TASK(HAL_SPI_Transmit(&hspi1, poruka, porukaSize, 50));

    Master_Synchro();
    SPI_TASK(HAL_SPI_Receive(&hspi1, aRxBuffer, porukaSize, 50));

    HAL_GPIO_WritePin(SPI_SS_GPIO_Port,SPI_SS_Pin,GPIO_PIN_SET);

    if(strcmp(poruka, aRxBuffer) != 0)
      flag = 0;

    if (flag){
      broj_uspeha++;
    }
    memset(aRxBuffer, 0, sizeof(aRxBuffer));

ведомый в то время как (1)

if(!HAL_GPIO_ReadPin(SPI_SS_GPIO_Port,SPI_SS_Pin)){

      Slave_Synchro();
      SPI_TASK(HAL_SPI_Receive(&hspi1, (uint8_t*)&aRxBufferSize, 2, 50));

      Slave_Synchro();
      SPI_TASK(HAL_SPI_Receive(&hspi1, aRxBuffer, aRxBufferSize, 50));

      memcpy(aTxBuffer, aRxBuffer, sizeof(aRxBuffer));

      Slave_Synchro();
      SPI_TASK(HAL_SPI_Transmit(&hspi1, aTxBuffer, aRxBufferSize, 50));

      memset(aRxBuffer, 0, sizeof(aRxBuffer));
      memset(aTxBuffer, 0, sizeof(aTxBuffer));
    }
...