Proper way to bit bang with KEIL

Hello, what im trying to do is reverse engineering unknown device. What i need is catch a 16bytes data from it. Each clk's pulse speed is about 20 nanoseconds. I'm using stm32f4 discovery board, so i should be able to catch it as stm32 powerful uC. The fact that im really new in Keil, and i dont know if im doing it a propper way, for example to detect a GPIO goes down, im using this code

 while (HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_7) == 0){}

Is it proper way to do it?
THe whole code with comments are:

  while (1)
                uint8_t collect_bits = 0;
                char string_array[21] = {0};
        //      HAL_Delay(200);
        while (HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9) == 0){}   // wait until GPIOC 9 goes high
                                                                while (HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9) == 1){}  // wait until GPIOC 9 goes low
         for (int i = 0; i < 8; i++)      // make a loop for reading byte
                                         while (HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_7) == 0){}     // wait until clock goes high
       int32_t current_bit = HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);                       // READ bit on PINC 9
    collect_bits |=  current_bit << i;  // Shift current_bit to position i and
                                        // put it into collect_bits using bit wise OR
                                                         while (HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_7) == 1){}     // wait until clock goes low, then repeat while loop untill we collect 8 bits
                sprintf(string_array, "%X", collect_bits);      // just simple convertation for PC output
                CDC_Transmit_FS((uint8_t*)string_array, sizeof(string_array));   // print result.



  /* USER CODE END 3 */


The problem is that output is not correct.What am i doing wrong? thanks

Parents Reply
  • As @Westonsupermare Pier considered, im trying to use SPI as a slave. And im struggling with it. I have this data flow which i want to catch:
    Clock is yellow and green is data.
    I need only 16bytes from it, when data line goes low, we can see this 16bytes:
    And there is the speed of the clock, as you can see its around 1.5us each clock pulse. So what i have to do is configure spi with HAL, i toolk SPI1(PA5 - CLOCK, PA7- DATA) cuz it has more powerful MHZ, chose spi mode "RECEIVE ONLY SLAVE", HARDWARE NSS SIGNAL: DISABLED. And here is my spi1 config:

    static void MX_SPI1_Init(void)
      /* SPI1 parameter configuration*/
      hspi1.Instance = SPI1;
      hspi1.Init.Mode = SPI_MODE_SLAVE;
      hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
      hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
      hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
      hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
      hspi1.Init.NSS = SPI_NSS_SOFT;
      hspi1.Init.FirstBit = SPI_FIRSTBIT_LSB;
      hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
      hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
      hspi1.Init.CRCPolynomial = 10;
      if (HAL_SPI_Init(&hspi1) != HAL_OK)
        _Error_Handler(__FILE__, __LINE__);

    What im doing in main.c, as oscilo's pictures says we need to catch the moment when data goes low and then try to read a data, im trying to catch first pulse then wait until data goes high then low and only they read spi, at least only first byte - it should be 0.

     int main(void)
      /* USER CODE BEGIN 1 */
      /* USER CODE END 1 */
      /* MCU Configuration----------------------------------------------------------*/
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      /* USER CODE BEGIN Init */
      /* USER CODE END Init */
      /* Configure the system clock */
      /* USER CODE BEGIN SysInit */
      /* USER CODE END SysInit */
      /* Initialize all configured peripherals */
      /* USER CODE BEGIN 2 */
      /* USER CODE END 2 */
      /* Infinite loop */
                    uint8_t collect_bits = 0;
                    char string_array[21] = {0};
                    uint8_t spi_buffer[16] ={0} ;
                    spi_buffer[0] = 5;
    while (HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_7) == 0){}   // wait until GPIOC 9 goes high
       while (HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_7) == 1){}   // wait until GPIOC 9 goes high
                        while (HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_7) == 0){}   // wait until GPIOC 9 goes high
     while (HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_7) == 1){}   // wait until GPIOC 9 goes high
       HAL_SPI_Receive(&hspi1, (uint8_t*)spi_buffer, 16,0);
      /* USER CODE BEGIN 3 */
     // }
      /* USER CODE END 3 */

    And i catch nothing at all, my spi buffer all 16 bytes are 0. I tried SPI_DMA it chacnged only first byte on 0XFF. What am i doing wrong? Thanks

More questions in this forum
There are no posts to show. This could be because there are no posts in this forum or due to a filter.