[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);
}
}