본문 바로가기

[ST_MICRO]/STM32F103-SM

[STM32F103-48 SSM EVM] STM32CubeIDE I2C 테스트 - PCF8574 Read/Write

[STM32F103-48 SSM EVM] 보드에서 STM32CubeIDE 환경으로 I2C 테스트를 진행 해 보았다.

 

우선 STM32CubeIDE로 새로운 프로젝트를 생성 한다.

 

 

프로젝트 생성은 C++로 했다. C로 해도 되지만 추후 C++ 호환 라이브러리(Arduino용) 를 사용하기 위해서 C++로 하면 좋다.

 

 

기본적인 핀 할당 및 I2C 핀을 보드에 맞게 설정 하자

 

 

I2C 설정을 위해 파라미터를 수정 한다. 여기서는 I2C Speed 만 400Khz로 수정 해 주었다.

 

 

클럭 설정은 외부 8Mhz로 설정 했다.

 

 

이렇게 설정이 완료하고 저장 하면 기본 I2C 코드가 생성된다. 


I2C Write

테스트를 위한 I2C 모듈은 I2C 8bit GPIO 확장 모듈 PFC8574 보드를 사용 할 예정이다.

PCF8574 제어를 위한 가장 기본적인 코드로 STM32 HAL라이브러리에서 제공하는 HAL_I2C_Master_Transmit 함수를 하용하요 8bit Write 함수를 작성 하였다.

#define _I2C_DELAY_TIME                 1000
#define I2C_HANLDLE                     hi2c1

#define PCF_8574_ADDR 			(0x20<<1)

void write8(uint8_t Address, uint8_t Value)
{
    HAL_I2C_Master_Transmit(&I2C_HANLDLE, Address, &Value, 1, _I2C_DELAY_TIME);
}

 

 

main 함수에서 PCF8574 제어를 위한 코드를 테스트 하면 잘 동작 하는것을 확인 할 수 있다.

  while (1)
  {
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
	write8(PCF_8574_ADDR, 0xFF);
	HAL_Delay(100);

	write8(PCF_8574_ADDR, 0x00);
	HAL_Delay(100);
  }

 

 


I2C Read

SSM-RPI EXP 확장 테스트 보드의 스위치를 읽을 수 있는 코드

 

I2C로 데이터를 읽어 오기 위해서는 HAL_I2C_Master_Receive 함수를 사용 하면 되고 PCF8574로 부터 1바이트를 읽어 오기 위해 read8 함수를 하나 만들었다.

unsigned char read8(uint8_t Address)
{
	unsigned char rx[1];

    HAL_I2C_Master_Receive(&I2C_HANLDLE, (Address|0x01), rx, 1, _I2C_DELAY_TIME);

    return rx[0];
}

 

 

PCF8574의 BIT1에 연결되어 있는 스위치 상태 값을 읽어서 PCF8574 BIT8에 연결된 LED에 출력 하는 코드를 테스트 해 보면 스위치 누를때 마다 LED가 정상적으로 On되는 것을 확인 할 수 있다.

여기서 주의 사항은 PCF8574를 입력으로 사용 하기 위해서는 항상 그 비트를 High로 설정 해 주어야 한다.

  while (1)
  {
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
	  read_value = read8(PCF_8574_ADDR);


	  if(read_value & BIT1)
	  {
		  Sbi(data, BIT1);

		  Sbi(data, BIT7);
		  write8(PCF_8574_ADDR,  data);
	  }
	  else
	  {
		  Sbi(data, BIT1);

		  Cbi(data, BIT7);
		  write8(PCF_8574_ADDR,  data);
	  }
  }
반응형