고수님들, STM32 HAL 라이브러리로 PMBus 통신 해보신 분 계신가요? 32 하나는 마스터, 다른 하나는 슬레이브로요.

CubeMX로 SMBus를 설정하고 X_CUBE_SMBUS 패키지를 추가했는데, Middlewares 폴더에 stm32_PMBUS_stack과 stm32_SMBUS_stack이 있는 건 봤지만 다음에 무엇을 해야 할지 모르겠습니다. 사용 방법을 모르겠어요.

Middleware 안의 저수준 소스 코드는 억지로 파고들지 마세요. 헷갈리기만 하기 쉽습니다. ST의 방식은 다 똑같아요. X_CUBE_SMBUS 패키지를 이미 다운로드하셨으니, 이 패키지의 설치 디렉터리(보통 STM32Cube\Repository 아래)로 바로 가서 Projects 폴더를 찾으세요. 그 안에는 분명 특정 개발 보드(예: NUCLEO나 EVAL)용으로 바로 쓸 수 있는 Example이 있을 겁니다. PMBus 관련 프로젝트를 찾아서 곧바로 main.cstm32_xx_it.c를 열어보세요. 다음 두 가지를 중점적으로 보세요: 첫째, 메인 루프에서 호출하는 Stack Process 처리 함수, 둘째, 슬레이브가 Command를 수신한 후의 Callback이 어떻게 작성되었는지입니다. 그 애플리케이션 레이어 코드를 가져다가 조금만 수정하면 바로 돌려볼 수 있습니다.

형 급해하지 마, 이 패키지는 문서가 좀 흩어져 있어서 나도 처음 쓸 때 한참 헤맸거든.

지금 상황은: 하드웨어 레이어(CubeMX)는 설정했지만, 프로토콜 레이어(stack)를 비즈니스 코드에 어떻게 연결해야 할지 모르는 거야.

내가 이해한 대로 메인 흐름을 정리해 줄게, 이대로 따라 와:

1단계: 올바른 프로젝트 구조를 생성했는지 확인 CubeMX의 Software Packs에서 X-CUBE-SMBUS를 추가할 때, Mode 창에 SMBus stackPMBus extension이라는 체크박스 두 개가 있는데, 둘 다 체크해야 해. 코드를 생성하면 프로젝트에 다음이 있어야 해:

  • Middlewares/ST/STM32_SMBus_Stack/ —— 핵심 프로토콜 스택
  • Drivers/BSP/ —— 보드 레벨 지원(선택했을 경우)

2단계: stack의 작동 방식 이해 이 stack은 HAL_I2C_xxx를 호출하려고 있는 게 아니라, 상태 머신을 한 번 감싼 거야. 네 코드는 주로 세 가지 함수를 다뤄:

  • STACK_SMBUS_Init() —— 초기화, I2C 핸들 바인딩
  • STACK_SMBUS_HostCommand() —— 호스트(마스터)용, 통신 시작
  • STACK_SMBUS_ExecuteCommand() —— 슬레이브용, 명령 수신 후 콜백

3단계: 슬레이브 작성법 슬레이브에서 가장 중요한 건 CMD_Table이야. 이건 배열인데, stack에게 「명령 코드 0x01을 받으면 어떤 레지스터를 읽을지, 0x02를 받으면 어떤 레지스터를 쓸지」 알려주는 거야.

const tSMBUS_CMD_Table MyCmdTable[] = {
    {0x01, MyReadHandler, MyWriteHandler, 1},  // 명령 코드, 읽기 콜백, 쓰기 콜백, 데이터 길이
    {0x02, MyReadHandler2, NULL, 2},
};

그런 다음 STACK_SMBUS_ExecuteCommand() 안에서 stackhandle.CurrentCommand에 따라 분기해.

4단계: 호스트 작성법 호스트는 훨씬 간단해. 명령 구조체를 잘 구성해서 STACK_SMBUS_HostCommand(&stackhandle, &cmd)를 호출하면 돼. 주의할 점은 이 함수가 논블로킹이라는 거야. 결과는 인터럽트 콜백에서 stackhandle.State를 확인해 봐.

특별히 주의할 점:

  • 공식 예제는 Projects 디렉토리 아래에 있어. 네 보드와 가장 비슷한 걸 찾아봐, 예를 들면 NUCLEO-G431RB나 F072 Discovery 같은 거.
  • AN4502는 꼭 봐. 공식 애플리케이션 노트인데, 두껍긴 하지만 8장 「Configuration」과 9장 「Project example」은 생명줄이야.
  • STM32 두 개를 연결할 때 SDA랑 SCL 모두 풀업해야 해. 보드 내부에 풀업이 있더라도 외부에 4.7k 저항을 하나 더 달아주는 게 훨씬 안정적이야. PMBus가 I2C보다 신호 무결성에 더 민감하거든.

문제 생기면 구체적인 에러 로그 다시 올려줘. 다들 도와줄 거야.

폴더를 잘못된 관점에서 보고 계신 것 같네요. stm32_SMBUS_stack은 하위 통신 계층이고, stm32_PMBUS_stack은 그 상위에서 PMBus 명령을 처리합니다.
다음으로 보통 필요한 작업은 다음과 같습니다: HAL SMBus 주변장치를 활성화하고, 프로젝트에 미들웨어 소스 파일을 포함시키고, main()에서 스택을 초기화한 다음, 라이브러리에서 요구하는 콜백 함수를 구현하는 것입니다. 콜백이 없다면 스택은 수신한 프레임을 전달할 곳이 없게 됩니다.

고수님들의 답변 감사합니다. 일단 한번 시도해 보겠습니다.

시도 결과는 어땠나요?

이 부분은 팀원한테 넘겼어, 에너지가 딸려서 :sweat_smile: