This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

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.
        //
   //break;


  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

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

Parents
  • Maybe you are right, my code slows down AHB's speed. What about spi slave? As i undderstand SPI mode should be "receive only slave" with CLK and MOSI connected to the stm32 pins.

    Honestly i didnt completly get, what did you mean here:
    >>Perhaps you can stage the bit stream in your own shift register, and then read that? Now your time constraints are 1/8th or 1/16th of what they were before.

    Or say more precisely, i got what you mean, but i have no idea how to do this. How to stage bit stream to the shift register? Should i do it with CMSIS? Sorry for the newbie questions, And im appreciate a lot your help.

Reply
  • Maybe you are right, my code slows down AHB's speed. What about spi slave? As i undderstand SPI mode should be "receive only slave" with CLK and MOSI connected to the stm32 pins.

    Honestly i didnt completly get, what did you mean here:
    >>Perhaps you can stage the bit stream in your own shift register, and then read that? Now your time constraints are 1/8th or 1/16th of what they were before.

    Or say more precisely, i got what you mean, but i have no idea how to do this. How to stage bit stream to the shift register? Should i do it with CMSIS? Sorry for the newbie questions, And im appreciate a lot your help.

Children
No data