Docs

Micro-controllers, wireless transmission and database

Head

I2C PCF8574 I/O expander with Blue Pill using STM32CubeIDE

Prerequisites

This project assumes you have already installed STM32CubeIDE. You need to have previously done a basic blink sketch with blue-pill using STM32CubeIDE. I have made a complete video from installing STM32CubeIDE to LED blink program. You can watch it by clicking this link. https://www.youtube.com/watch?v=kXg467nVd_A

Wiring Diagram

Diagram

STM32CubeIDE Settings

Click connectivity --> Click I2C1

For I2C select I2C

Additional code on top of STM32CubeIDE generated code

/* USER CODE BEGIN 0 */
uint8_t  PCF7584read8()
{
    uint8_t value;
    HAL_I2C_Master_Receive(&hi2c1, 0x40, (uint8_t*)&value, 1, 100);
    return value;
}

uint8_t  PCF7584read(uint8_t pin)
{
    uint8_t value;
    value = PCF7584read8();
    return (value & (1 << pin)) > 0;
}

void PCF7584write8(uint8_t value)
{
    HAL_I2C_Master_Transmit(&hi2c1, 0x40, (uint8_t*)&value, 1, 100);
}

void PCF7584write(uint8_t pin, uint8_t value)
{
    uint8_t readValue;
    readValue = PCF7584read8();
      if (value == 0)
      {
          readValue &= ~(1 << pin);
      }
      else
      {
          readValue |= (1 << pin);
      }
      PCF7584write8(readValue);
}

void PCF7584toggle(uint8_t pin)
{
    uint8_t mask = (1 << pin);
    uint8_t readValue = PCF7584read8();
    readValue ^= mask;
    PCF7584write8(readValue);
}
/* USER CODE END 0 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
            PCF7584write(0, 1); 
            HAL_Delay(350);
            PCF7584write(0, 0);

            PCF7584write(1, 1);
            HAL_Delay(350);
            PCF7584write(1, 0);

            PCF7584write(2, 1);
            HAL_Delay(350);
            PCF7584write(2, 0);

            PCF7584write(3, 1);
            HAL_Delay(350);
            PCF7584write(3, 0);

            PCF7584write(4, 1);
            HAL_Delay(350);
            PCF7584write(4, 0);

            PCF7584write(5, 1);
            HAL_Delay(350);
            PCF7584write(5, 0);

            PCF7584write(6, 1);
            HAL_Delay(350);
            PCF7584write(6, 0);

            PCF7584write(7, 1);
            HAL_Delay(350);
            PCF7584write(7, 0);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */