MCU как SPI Slave, читать данные - PullRequest
0 голосов
/ 29 мая 2018

У меня есть мастер, которым я не могу управлять, он просто посылает часы с данными.Я настроил свой stm32f4 как полнодуплексный раб.И мне удалось синхронизировать их с функцией HAL:

HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)spi_buffer, (uint8_t *)spi_buffer, 16, 2000);  
      // receive 16 bytes then send them for debugg

Я посылаю от ведомого устройства байты, которые я получаю от мастера, в целях отладки, и данные такие же, так что он идеально синхронизирован и выглядит как ведомыйЧтение всех данных мастер отправляет.Вот изображения (извините, не могу загрузить его с помощью stackoverflow, потому что у меня мало точек):

  1. https://imgur.com/wa6rF5J - изображение ocsillo
  2. https://imgur.com/a/ZVCPaNT - увеличеноup

Проблема в том, что я не знаю, как читать эти данные, их 16 байтов, которые мне нужно каким-то образом читать, не замедляя работу.Все мои попытки сделать это провалились.Вот весь код:

    int main(void)
{
  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USB_DEVICE_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
        uint8_t collect_bits[16] = {0};
        char string_array[21] = {0};
        uint8_t spi_buffer[16] ={0} ;
        uint8_t flag_when_start_print = 0;
        spi_buffer[0] = 5;
        uint8_t spi_transmit[16] = {0};

        HAL_SPI_Init(&hspi1); //init spi

  while (1)
  {
  HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)spi_buffer, (uint8_t *)spi_buffer, 16, 2000);
  if (spi_buffer[0] == 0xFE) // just tring to catch 0xFE, doesnt work
{   
    sprintf(string_array, "%X", spi_buffer[0]); // just simple convertation for PC output
CDC_Transmit_FS((uint8_t*)string_array, sizeof(string_array));   // print result. }
    }
   }

Важный факт, что начало сообщения, которое я хочу перехватить, всегда начинается с 0xFE0010, поэтому после этих байтов мне нужно прочитать следующие 13 байтов

...