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
  • 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: onedrive.live.com/.
    Clock is yellow and green is data.
    I need only 16bytes from it, when data line goes low, we can see this 16bytes:
    onedrive.live.com/
    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: onedrive.live.com/

    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. */
      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 = 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 END WHILE */
    
      /* 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

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: onedrive.live.com/.
    Clock is yellow and green is data.
    I need only 16bytes from it, when data line goes low, we can see this 16bytes:
    onedrive.live.com/
    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: onedrive.live.com/

    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. */
      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 = 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 END WHILE */
    
      /* 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

Children