1-Wire 통신은 하나의 데이터 라인과 하나의 접지(그라운드) 라인만을 사용해 데이터를 송수신하는 직렬 통신 방식입니다. 이 방식은 Dallas Semiconductor(현재 Maxim Integrated, Analog Devices에 인수)에서 개발했습니다. 1-Wire는 마스터-슬레이브 구조를 기반으로 하며, 주로 센서, 메모리, 식별 장치 등에서 사용됩니다.
1-wire bus는 선 한개로 데이터의 송/수신을 하므로, 1-wire bus 방식의 ic와 연결하는 mcu는 gpio 핀의 입력/출력모드를 번갈아 사용
단일 데이터 라인 사용
데이터 송수신과 전원 공급을 모두 하나의 데이터 라인에서 수행 가능
최소한의 배선으로 구현 가능 → 비용 절감 및 간소화
마스터-슬레이브 구조
하나의 마스터가 여러 개의 슬레이브 장치와 통신 가능
각 슬레이브 장치는 고유의 64비트 시리얼 번호를 가짐 → 개별 장치 식별 용이
전원 공급 방식
슬레이브 장치는 별도의 전원선 없이 데이터 라인에서 전력을 공급받는 파라사이트 전원(Parasite Power) 방식 지원 가능
저속 통신
일반적으로 통신 속도는 16.3kbps 정도로 낮음 → 주로 센서 및 식별 장치에 적합
충돌 방지 및 다중 장치 식별
장치 선택을 위한 ROM 코드 검색(ROM Search) 프로토콜 제공 → 다중 장치 연결 시 충돌 방지
리셋 및 프레즌스(Reset & Presence)
마스터가 라인을 리셋하면 슬레이브가 응답 신호(Presence)를 보냄
장치 식별 (ROM Code)
슬레이브는 64비트의 고유 시리얼 번호를 통해 개별적으로 식별됨
마스터는 ROM 명령을 통해 특정 슬레이브 장치를 선택 가능
명령 전송
마스터는 선택된 슬레이브에 특정 명령(데이터 읽기, 쓰기 등)을 전송
데이터 전송
슬레이브는 명령에 따라 데이터를 응답
데이터는 LSB(Least Significant Bit)부터 전송
✅ 비트 전송 방식
1-wire 통신을 사용하기 위해서 라이브러리를 사용할 건데 TM 라이브러리 이기 때문에 HAL 라이브러리로 바꾼 소스를 포팅할 것이다.
처음 포팅 실행 시 에러가 많이 나기 때문에 하나 씩 해결해줄 것이다.




#include "main.h" 로 변경해줌

freeRTOS 0으로 설정, temp 핀 설정해주기, 타이머 생성
라이브러리를 사용하기위해서는 72MHZ에서 1us tick을 생성해야 한다.
클럭 입력
MCU에는 크리스탈 오실레이터(crystal oscillator)나 세라믹 레조네이터(ceramic resonator)를 통해 정해진 주파수의 클럭 신호가 입력됩니다.
현재 사용하고 있는 MCU의 기준 클럭은 8MHz이다. 따라서 1초에 8,000,000번의 클럭이 발생한다.
프리스케일러 설정
클럭 주파수가 너무 빠르기 때문에 타이머가 너무 자주 오버플로우(overflow)되는 것을 방지하기 위해 프리스케일러를 설정합니다.
기준 클럭 = 8MHz = 80000000 Hz
prescaler = (10000 - 1) : 카운터 1을 올리는데 걸리는 단계
카운터 = (800 - 1) : 카운터가 0 ~ 799까지 갔다가 0으로 돌아오는 시간 1초

클럭 생성기를 통해 기존클럭 8MHz에서 72MHz로 클럭을 바꾼다.


위처럼 클럭을 72MHz로 설정을 해준다.(HSE에서 9배수로 바꿔줌)

프리스케일러: (72-1)로 입력클럭을 분주 시켜 1,000,000Hz로 감소, 즉 1us마다 타이머값이 1 증가됨
카운터 : 0xFFFF (최대값 , 65535)에 오버플로우가 나도록 설정



Temperature 온도값이 나오는 것을 확인 할 수 있다
이를 fnd에 표현하기를 시도했지만 fnd가 깜빡거리면서 보이기 때문에 오류를 수정할 예정이다
/* USER CODE BEGIN 2 */
fnd_init(&hspi2);
//HAL_TIM_Base_Start_IT(&htim2);
Ds18b20_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Ds18b20_ManualConvert();
digit4_temper((int)ds18b20[0].Temperature*10,10000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}