11 시리얼 통신 마이크로컨트롤러 AVR ATmega128 저자: 이상설 (slee@wku.ac.kr) 소속: 원광대학교 전기·정보통신공학부
학습목표 USART 통신과 SPI 통신 방식을 이해할 수 있다. 폴링을 사용한 USART 통신 방법, 인터럽트와 큐를 사용한 개선된 USART 통신 방법을 이해하고, 실험을 통해 확인할 수 있다. 마스터/슬레이브가 고정된 SPI 통신과 가변되는 SPI 통신을 이해하고, 실험을 통해 확인할 수 있다.
목 차 동기 및 비동기 모드 USART 통신 USART 통신 폴링을 이용한 문자 송수신 인터럽트와 큐를 이용한 문자 송수신 문자 송수신 함수와 printf( ), scanf( ) 함수의 연결 PC와 ATmega128 보드의 비동기 USART 통신 (동영상) SPI 통신 SPI 관련 레지스터 고정 마스터 모드 SPI 온도센서와 인터페이스 (동영상) 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 3
Section 01 동기 및 비동기 모드 USART 통신 동기 모드와 비동기 모드 시리얼 통신 동기 모드 : 동기 신호 XCK 있음 Tx 신호를 주관하는 송신쪽에서 클록 XCK 신호를 출력 비동기 모드 : 동기 신호 없음
Section 01 동기 및 비동기 모드 USART 통신 ATmega128과 외부 시리얼 통신 장치의 비동기 통신 ATmega128과 외부 UART RS-232 장치의 신호 ATmega128 : Vcc/GND를 1/0으로 사용 외부 UART RS-232 장치 출력 : 출력 Tx 신호는 0/1을 +12[V]/-12[V]로 사용 입력 : 입력 Rx 신호는 +3[V]/-3[V]일 때 0/1로 인식 IC MAX232 Tx 신호는 ATmega128 신호를 입력받아 +7[V]~-7[V]로 변환
Section 02 USART 통신 USART 통신 개요 ATmega128에는 2개의 USART 송신과 수신을 동시에 수행하는 전이중 방식(Hull-Duplex)의 통신 동기 통신 모드와 비동기 통신 모드를 선택 동기 통신 모드에서 마스터 또는 슬레이브 클록을 선택 보오레이트를 프로그래머가 결정 5~9 데이터 비트 중 하나를 선택할 수 있음 초깃값은 8비트 짝수, 홀수 패리티, 패리티 없음을 선택 프레임 에러와 오버런(over run) 에러를 검출 잡음 필터링 기능으로 잘못된 시작 비트 감지를 방지 송신 완료, 수신 완료, 전송 데이터 레지스터 비었음 인터럽트를 지원 멀티프로세서 통신 모드 지원 2배속 비동기 통신 모드 지원
Section 02 USART 통신 USART 데이터 프레임 한 프레임은 영어 한 문자에 해당 크기는 5~9 비트 중 하나로 선정(초깃값 : 8비트) 시작 비트(St) : 새로운 프레임이 시작되면 반드시 0으로 1비트 시간 데이터 비트 : 5~9 비트 시간 동안 LSB부터 MSB까지 차례로 전송 패리티 비트(P) : 1의 개수가 홀수 또는 짝수가 되도록 패리트 비트 설정 패리티 비트 없음(None)을 설정하면, 송수신에 패리티 비트는 사용하지 않음 정지 비트 : 프레임과 프레임 사이를 구분하기 위해 정지 비트 구간을 둠 정지 비트는 1 또는 2일 수 있음
Section 02 USART 통신 USART 내부 구조 클록 생성부 송신부 수신부
Section 02 USART 통신 클록 생성부 동기 통신 모드 비동기 통신 모드 XCK 핀을 입력 방향으로 설정하면, 슬레이브 외부에서 입력되는 XCK 신호로 송수신을 동기 출력 방향으로 설정하면, UBRR에 설정된 보오레이트에 의해 생성되는 클록 신호를 XCK 핀을 통해 슬레이브로 출력 비동기 통신 모드 동기 신호 없이 UBRR에 설정된 보오레이트에 의해 자체적으로 송신과 수신 비트를 판정
Section 02 USART 통신 송신부 UDR(송신)에 기록된 데이터는 송신 천이 레지스터로 옮겨진 후 비트 이후에 LSB부터 1비트씩 오른쪽으로 천이하면서 TxD 핀으로 출력 패리티가 홀수 혹은 짝수일 때, 패리티 비트를 이어 출력 수신부 RxD 핀에서 입력되는 시작 비트 신호에 클록을 맞추어 들어오는 신호를 데이터로 복구시켜 MSB부터 오른쪽으로 천이하면서 수신 천이 레지스터에 입력 패리티 비트로 패리티 설정에 따라 패리티를 검사 패리티 비트에 이어 정지 비트가 등장하는지의 여부를 검사
Section 02 USART 통신 USART 초기화 설정 수신 및 송신 기능 활성화
Section 02 USART 통신 USCRnB 레지스터는 USART 기능 활성화 설정을 주로 담당
Section 02 USART 통신 USART 송신과 수신을 위한 상세 설정
Section 02 USART 통신 USCRnC 레지스터 통신 모드, 데이터 비트 수, 패리티 모드, 정지 비트, 클록의 샘플링 위치 (동기 통신 모드인 경우) 설정 통신 모드
Section 02 USART 통신 데이터 비트 수 패리티 모드 송신부 : 데이터 천이 출력 후 패리티 모드 설정에 따라 패리티 비트 출력 수신부 : 수신 비트와 패리티 비트가 천이되면서 XOR 검사를 통해 패리티 모드 관련 에러 검출
Section 02 USART 통신 정지 비트 수 프레임과 프레임 사이를 구분하기 위한 전송이 없어야 하는 시간 구간
Section 02 USART 통신 [예제 11-1] 8 데이터 비트, 홀수 패리티, 2 정지 비트, 보오레이트 115,200[bps] 전송 속도를 갖는 USART가 1초에 최대로 전송할 수 있는 문자 수는? <풀이> 한 프레임당 비트 수 : 12[비트/프레임] ∵ 12 비트 = 1 시작 비트 + 8 데이터 비트 + 1 패리티 비트 + 2 정지 비트 전송 속도 = 초당 비트 수 = 115,200bps = 115,200[비트/초] 따라서 1초에 최대 9,600개의 문자를 전송 가능
Section 02 USART 통신 클록 샘플링 위치(동기 통신 모드인 경우) 동기 통신 모드(UMSELn = 1)일 때, XCK는 입력(슬레이브) 또는 출력(마스터)로 사용
Section 02 USART 통신 클록 마스터/슬레이브(동기 통신 모드인 경우) XCK를 마스터로서 공급할 것인지, 슬레이브로 공급받을 것인지 결정 XCK 핀 방향 출력 설정 : 마스터로서 클록 공급 입력 설정 : 슬레이브로 클록을 공급받아 동작
Section 02 USART 통신 USART 통신 에러 데이터 수신할 때 프레임 에러, 오버런 에러, 패리티 에러가 발생 가능 UCSRnA 레지스터의 FEn, DORn, UPEn 비트가 1일 때 에러 발생 상태
Section 02 USART 통신 패리티 에러 비트, UPEn 송신부 패리티 계산 수신부 패리티 검출 계산 만일 짝수 개의 비트값이 변경되면 패리티 에러는 검출되지 않음 UDRn 레지스터를 읽기 전까지 UPEn 비트로 패리티 에러 발생 확인 가능 UCSRnA 레지스터에 값을 쓰면 이 비트는 0으로 초기화
Section 02 USART 통신 프레임 에러 비트, FEn 프레임은 시작 비트, 데이터 비트, 패리티 비트, 정지 비트 순서로 수신 비트 순간에 반드시 1을 수신해야 함 정비 비트 위치에 1이 수신되지 않았다면, 전송 중 프레임 신호에 에러가 발생 프레임 에러 비트 FEn를 1로 만듦 UDRn 레지스터를 읽기 전까지 FEn 비트는 프레임 에러 발생 여부 표시 UCSRnA 레지스터에 값을 쓰면 이 비트는 0으로 초기화
Section 02 USART 통신 오버런 에러 비트, DORn 프레임이 정상적으로 수신되면 UDR(수신) 레지스터에 수신된 문자 프로그램에서 UDRn 레지스터를 읽어 문자를 가져감 ATmega128 내부에는 UDR(수신) 레지스터가 2개 프로그램이 다소 늦게 문자를 읽어도 됨 2개의 UDR(수신) 레지스터와 수신 천이 레지스터가 채워진 상황에서 새로운 프레임이 수신되면 마지막 수신 문자는 UDR(수신)에 보관될 수 없음 오버런 에러가 발생하고 DORn 비트를 1로 만듦 UDRn 레지스터를 읽기 전까지 FEn 비트는 프레임 에러 발생 여부 표시 UCSRnA 레지스터에 값을 쓰면 이 비트는 0으로 초기화
Section 02 USART 통신 전송 속도 설정 데이터 비트, 패리티 모드, 전송속도 설정이 일치해야 정확한 송수신 가능 UBRRnH, UBRRnL 레지스터와 UCSRnA 레지스터의 U2Xn 비트로 결정
Section 02 USART 통신 목표 보오레이트와 설정된 UBRR에 의한 보오레이트와의 에러
Section 02 USART 통신 주로 많이 사용하는 보오레이트 설정을 위한 UBRR
Section 02 USART 통신 UDRn 레지스터와 데이터 송수신 송신할 때의 UDRn 레지스터 UCSRnA 레지스터 UDREn을 검사하여 1일 때 UDRn 레지스터에 값 기록 데이터 비트 수를 9로 설정한 경우 UCSRnB 레지스터의 TXB8n 비트에 9번째 비트를 먼저 기록하고 UDRn 레지스터에 8비트를 나중에 기록 데이터는 송신 천이 레지스터로 이동하고 UDRn 레지스터는 비게 됨 송신 천이 레지스터의 데이터는 TxDn 핀을 통해 LSB부터 한 비트씩 출력 UDRn 레지스터에 데이터 기록 시점 폴링 방법 : UDREn 비트가 1이 될 때까지 검사 인터럽트 방법 : UDRn 빔 인터럽트를 사용 UDRn 레지스터가 비면 인터럽트가 발생하고, 인터럽트 서비스 루틴에서 기록 송신 큐를 이용하여 효과적인 시리얼 통신 프로그램 작성 가능
Section 02 USART 통신 수신할 때의 UDRn 레지스터 RXCn 비트를 검사하여 값이 1이면 수신된 데이터가 있음 프로그래머가 UDRn 레지스터를 읽어 먼저 온 문자를 가져가면 수신 천이 레지스터에 있는 데이터가 UDRn로 옮겨짐 만일 수신 데이터가 꽉 찬 상태에서 또 프레임이 수신되면 오버런 에러 데이터 비트 수를 9로 설정한 경우 RXB8n 비트의 9번째 비트를 먼저 읽고, 8비트는 UDRn 레지스터에서 읽음
Section 02 USART 통신 폴링 방법을 이용한 수신 RXCn 비트가 1이 될 때까지 검사 인터럽트 방법을 이용한 수신 수신 완료 인터럽트를 사용 인터럽트 서비스 루틴에서 수신된 문자인 UDRn 레지스터를 읽음 수신큐를 이용하여 효과적인 시리얼 통신 프로그램을 작성 가능
Section 03 폴링을 이용한 문자 송수신 프레임 포맷 설정 폴링을 이용한 송수신을 위한 설정 항목 초기화된 설정이 이미 있으므로 변경이 필요한 부분만 설정 진행 중에 통신 포맷을 변경할 때는 모든 항목 설정 필요
Section 03 폴링을 이용한 문자 송수신 폴링을 이용하여 USART 통신하기 위한 프레임 포맷을 설정하는 함수 함수의 인수 ch는 USART0과 USART1 중 하나를 선택 ubrr_baud 인수는 [표 11-10]의 식 혹은 [표 11-11]을 참고한 UBRRn 값 통신 모드, 데이터 비트 수, 정지 비트 수 설정이 없으므로 초깃값 사용 비동기 통신 모드, 8비트, 패리티 없음, 1 정지 비트
Section 03 폴링을 이용한 문자 송수신 폴링을 이용한 문자 송신 UCSRnA 레지스터의 UDREn 비트를 반복 검사하여 1일 때 UDRn 레지스터에 문자 데이터 data를 기록하면 송신 진행 FILE *stream 인수는 printf( ) 함수와 연동하기 위한 인수 USART0을 사용하면 ISP 다운로더 연결 핀 PDI, PDO가 RxD0, TxD0와 중복 ISP 다운로드할 때 USART0 연결 케이블은 뽑아 충돌 방지 USART1을 사용한 폴링을 이용한 문자 송신 프로그램
Section 03 폴링을 이용한 문자 송수신 폴링을 이용한 문자 수신 UCSRnA 레지스터의 RXCn 비트를 검사하여 1일 때 UDRn 반환 FILE *stream 인수는 scanf( ) 함수와 연동하기 위한 인수 폴링을 이용하여 문자를 USART1 채널로 수신하는 함수
Section 04 인터럽트와 큐를 이용한 문자 송수신 큐(Queue) 먼저 들어온 데이터를 먼저 서비스하기 위한 저장 공간 먼저 들어온 것이 먼저 나간다라는 뜻, FIFO(First In First Out) 인터럽트와 큐를 이용한 USART 송수신 함수 완성 큐를 이용한 송수신 데이터 처리 UDR 레지스터 빔 인터럽트 수신 완료 인터럽트
Section 04 인터럽트와 큐를 이용한 문자 송수신 프레임 포맷과 인터럽트 설정 인터럽트를 이용한 송수신을 위한 설정 항목 활용 인터럽트 수신 완료 인터럽트 UDRn 빔 인터럽트
Section 04 인터럽트와 큐를 이용한 문자 송수신 인터럽트를 이용하여 USART 프레임 포맷과 인터럽트 활성화를 위한 설정 함수 통신 모드, 데이터 비트 수, 정지 비트 수는 초깃값 이용 비동기 통신 모드, 8비트, 패리티 없음, 1 정지 비트 함수의 인수 ch는 USART0과 USART1 중 하나를 선택 ubrr_baud 인수는 [표 11-10]의 식 혹은 [표 11-11]을 참고한 UBRRn 값
Section 04 인터럽트와 큐를 이용한 문자 송수신 인터럽트를 이용한 문자 송신 동작 주 프로그램은 전송 문자를 큐에만 복사 UDREn 인터럽트 서비스 루틴은 UDREn 레지스터가 비면 큐에서 문자를 꺼내 채워 자동 송신 폴링으로 UDREn 비트가 1인지 반복 검사 필요 없음 CPU 부하를 줄이고 프로그램 수행 속도를 빠르게 할 수 있음
Section 04 인터럽트와 큐를 이용한 문자 송수신 USART1_send( ) 함수와 UDRE1 빔 인터럽트의 협동 개념도 USART1_send( ) 함수는 LENGTH_TX_BUFFER 길이를 갖는 tx1_buffer[ ] 큐의 tx1_head 위치에 송신할 문자를 넣음 UDR1 빔 인터럽트 서비스 루틴은 UDR1 레지스터가 비었을 때 가장 먼저 큐에 들어간 문자를 tx1_tail에서 꺼내 UDR1 레지스터에 넣음
Section 04 인터럽트와 큐를 이용한 문자 송수신 USART1_send( ) 함수 송신 문자큐 tx1_buff[ ] 배열에서 빈자리 인덱스 tx1_head를 취함 큐가 모두 차서 빈자리가 없으면 UDR1 빔 인터럽트 서비스 루틴이 문자 하나를 보내 빈자리가 생길 때까지 기다림 송신 문자큐 tx1_buff[ ] 배열 tx1_head 위치에 송신 데이터 data 기록 UDR1 빔 인터럽트 발생을 위해 UDRIE1 비트를 활성화
Section 04 인터럽트와 큐를 이용한 문자 송수신 UDR1 빔 인터럽트 서비스 루틴 송신 요청 문자를 큐 tx1_buffer[ ]의 tx1_tail 위치에서 꺼내 UDR1로 UDR1 레지스터의 문자는 하드웨어적으로 자동 송신 다음 송신될 큐의 위치로 tx1_tail1을 갱신 USART1_send( )에서 송신 요청 문자가 없어 tx1_head== tx1_tail이면 UDR1 빔 인터럽트에 반응할 필요가 없으므로 인터럽트 비활성화 USART1_send( ) 함수가 실행될 때 다시 활성화
Section 04 인터럽트와 큐를 이용한 문자 송수신 인터럽트를 이용한 문자 수신 동작 주 프로그램은 수신 문자를 큐에서 가져오기만 함 UDR1 수신 완료 인터럽트 서비스 루틴은 수신된 문자를 UDR1 레지스터서 꺼내 큐에 넣음 폴링으로 반복하여 RXCn 비트가 1인지 검사할 필요가 없음 추가된 큐가 있어 주 프로그램의 오버런(Over run) 에러 가능성을 줄임
Section 04 인터럽트와 큐를 이용한 문자 송수신 USART1_receive( ) 함수와 UDR1 수신 완료 인터럽트의 협동 개념도 UDR1 수신 완료 인터럽트 서비스 루틴은 UDR1 레지스터에 문자가 수신되면 큐 rx1_buffer[ ]의 rx1_head 위치에 수신된 문자를 넣음 USART1_receive( ) 함수는 가장 먼저 큐에 들어간 수신 문자를 rx1_tail 위치에서 꺼내 주 프로그램에 반환하여 넘겨줌
Section 04 인터럽트와 큐를 이용한 문자 송수신 * 수신 큐가 찬 상태에서 문자가 수신되면 마지막 수신된 문자는 버린다.
Section 05 문자 송수신 함수와 printf( ), scanf( ) 함수의 연결 : 표준 입출력 화면과 인터페이스할 수 있는 매우 유용한 함수 FDEV_SETUP_STREAM 지시어를 이용하여 문자 송신 함수, 수신 함수와 printf( ), scanf( ) 함수를 연결 첫 번째 인수에 전송 함수 명칭 두 번째 인수에 수신 함수 명칭 세 번째 인수에 연결 함수 속성 플래그 _FDEV_SETUP_READ, _FDEV_SETUP_WRITE, _FDEV_SETUP_RW 중 선택
Section 05 문자 송수신 함수와 printf( ), scanf( ) 함수의 연결 USAR1 문자 송신, 수신 함수와 printf( ), scanf( ) 함수 연결 USART1_send 함수, USART1_receive 함수는 _FDEV_SETUP_RW 플래그 입출력 함수 사용 fprintf(&usart1_stdio, …) fscanf(&usart1_stdio, …) printf( ), scanf( ) 만으로 사용하려면 stdin, stdout, stderr에 &usart1_stdio 대입 후 사용 가능
Section 05 문자 송수신 함수와 printf( ), scanf( ) 함수의 연결
Section 05 문자 송수신 함수와 printf( ), scanf( ) 함수의 연결 printf( ) 함수 %f 포맷 출력 사용을 위해 링커 옵션 추가 project → Configuration options → [Project Options 창] Custom Options scanf( ) 함수 %f 포맷 입력 사용을 위해 링커 옵션 추가
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 실험 목적 (1) 폴링을 이용하여 PC와 비동기 통신을 위한 문자 송신, 수신 함수를 작성 (2) printf( ), scanf( ) 함수와 문자 송수신 함수를 연결 (3) scanf( ) 함수로 입력 받은 정수를 연산하여 LCD 창과 PC측에 출력 (4) 부동소수점 숫자를 입력 받고 연산하여 LCD 창과 PC측에 출력
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 실험 회로
Section 06 PC와 ATmega128 보드의 비동기 USART 통신
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 ISP 다운로드할 때 USART0와 신호 충돌을 방지하기 위해 USART1 사용 Window XP 운영체제의 PC측에서 하이퍼터미널을 실행함 연결된 시리얼 포트와 프레임을 설정함 프로그램 완성 lcd.h, lcd.c, usart.h, usart_polling.c는 부록 참조
Section 06 PC와 ATmega128 보드의 비동기 USART 통신
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 // printf(), scanf() 사용 // PC에 출력 // PC에서 타이핑 정수 입력
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 실험 결과 PC측에서 입력한 값에 대한 1부터의 누적 합산 결과 출력 PC측에 시리얼통신으로 전달하여 하이퍼터미널에 출력 LCD에 결과 디스플레이
Section 06 PC와 ATmega128 보드의 비동기 USART 통신 PC와 ATmega128 보드의 비동기 USART 통신 (video.zip 참고 / 11-6)
Section 07 SPI 통신 SPI 마스터/슬레이브 모드 고정 동작 SPI(Serial Peripheral Interface) 보통 주변 장치가 마스터, 마이크로컨트롤러는 슬레이브로 동작 주변 장치로부터 데이터를 주기적으로 수신 SPI 통신을 위한 마스터와 슬레이브 사이의 신호 연결 MISO, MOSI, SCK, /SS 신호를 사용
Section 07 SPI 통신 SPI 신호의 역할 마스터는 /SS 신호를 LOW로 만들어 슬레이브와 송수신할 준비 마스터가 제공하는 SCK에 동기되어 마스터는 MOSI 신호로 슬레이브에 데이터 전송 슬레이브는 MISO 신호로 마스터에 데이터 전송
Section 07 SPI 통신 MOSI 신호로 마스터가 슬레이브로 데이터를 전송하는 파형 마스터가 /SS 신호를 0으로 떨어뜨린 후, 1로 올라갈 때까지 SCK와 동기된 데이터 전송 사례 아래 그림 (b)는 SCK가 평상시 HIGH였다가 상승에지에 8비트 데이터를 샘플링 수신하는 3개의 데이터(LSB가 먼저 전달) : 0xA1, 0x00, 0xF2
Section 07 SPI 통신 SPI의 내부 구조 블록도
Section 07 SPI 통신 SPI 마스터 /SS 신호를 LOW로 만들어 출력하고 LOW를 받은 SPI는 슬레이브 SPI 데이터 레지스터(SPDR)에 전송할 값을 기록하면 SCK 클록 발생 클록에 동기되어 MOSI와 MISO 신호를 통해 교환 SPDR 데이터 송수신 마스터는 MOSI 신호 선으로 슬레이브에 천이 출력 동시에 슬레이브에서 출력하는 신호는 MISO 신호 선으로, 수신되어 수신 데이터 버퍼 레지스터에 저장 송수신이 동시에 일어나고 8비트 천이가 완료되면, SPSR 레지스터의 SPIF 비트가 1로 셋 송신 데이터 버퍼는 1바이트의 단일 버퍼 수신 데이터 버퍼는 2바이트의 2중 버퍼
Section 07 SPI 통신 수신 데이터를 읽기 전에 SPDR 레지스터에 송신할 값을 기록할 수 있음 /SS 신호를 HIGH로 만들면 데이터 패킷 전송을 끝냄 폴링을 이용한 SPI 마스터 초기화
Section 07 SPI 통신 폴링을 이용하여 SPI 마스터의 데이터를 전송 슬레이브에 /SS 신호를 LOW로 만듦 SPCR 레지스터의 MSTR 비트를 1로 만든 마스터 상태 /SS 신호를 LOW로 만들고 SPDR에 데이터를 기록하기까지 약간의 시간 지연을 두어 슬레이브가 데이터를 받을 준비를 하게 하는 것이 바람직함 SPDR에 값을 기록하면, MOSI 핀으로 데이터가 슬레이브로 출력 전송이 완료되면 SPSR 레지스터의 SPIF 비트가 1이 셋 됨 전송 완료를 폴링으로 기다린 후 /SS 신호를 HIGH로 만들 송신을 끝냄
Section 07 SPI 통신 SPI 슬레이브 /SS 신호가 HIGH인 동안 SPI는 동작하지 않음 MISO 신호는 고저항 상태 SPDR 레지스터에 값을 기록하더라도 /SS 신호가 LOW가 되기 전까지 SPDR 데이터는 천이 출력되지 않음 /SS 신호에 LOW를 받으면 슬레이브가 되고, SPDR 데이터는 MISO 신호 선을 통해 마스터로 출력 송신 데이터 버퍼는 1바이트의 단일 버퍼이고, 수신 데이터 버퍼는 2바이트의 2중 버퍼 수신 데이터를 읽기 전에 SPDR 레지스터에 다음 송신할 값을 기록 수신된 데이터는 SPDR을 읽어 가져감
Section 07 SPI 통신 SPI 슬레이브 초기화 SPI 슬레이브 8비트 데이터 수신 SPSR 레지스터의 SPIF가 1인지를 검사 8비트 데이터 수신을 확인한 후 SPDR을 읽음 클록으로 한 문자가 MOSI/MISO 핀으로 교환되면 SPIF 비트가 1로 셋
Section 07 SPI 통신 SPI 마스터/슬레이브 모드 변경 동작 SPI 핀 방향 마스터 모드 MISO 핀 : 자동으로 입력 핀 MOSI, SCK, /SS 핀 : DDRB 레지스터의 DDB2, DDB1, DDB0 비트 설정에 따라 입력 또는 출력으로 방향이 결정 슬레이브 모드 MOSI, SCK, /SS 핀 : DDRB 레지스터에 상관없이 입력 핀 MISO 핀 : DDRB 레지스터의 DDB3 비트 설정에 따라 입력 또는 출력
Section 07 SPI 통신 마스터로서 /SS 신호를 이용한 SPI 클록 획득 SPI의 SCK 핀은 데이터를 송수신할 때만 클록 신호가 등장 마스터가 SPDR에 데이터를 기록하면 송수신과 함께 SCK 클록 발생 마스터는 슬레이브가 송신하는 데이터를 동시에 수신 슬레이브는 마스터가 제공하는 클록에 동기되어 데이터 송수신
Section 07 SPI 통신 마스터/슬레이브를 바꾸면서 인터페이스할 수 있는 기능 (a)는 두 개의 ATmega128이 마스터 모드로 SPI 통신 시작 대기 상태 /SS와 SCK 내부에 풀업저항을 연결하여 HIGH가 입력 마스터 변환 (b)는 SPI 클록을 획득하려는 마스터가 /SS 신호를 출력 방향으로 바꿔 LOW 신호를 인가하면 상대는 슬레이브 모드로 변환 /SS 신호를 LOW로 만든 마스터는 SCK 핀의 방향을 출력으로 바꿔 클록 공급 SPI 통신을 종료하려면 마스터는 핀 방향을 바꾸고 대기 상태로 만듦
Section 07 SPI 통신 슬레이브 변환 입력 핀 /SS에서 LOW를 받은 마스터는 슬레이브로 변경 SPCR 레지스터 MSTR 비트값이 0으로 바뀌고, SCK 핀과 MOSI 핀이 입력으로 바뀜 SPSR 레지스터의 SPIF 비트도 1로 바뀜 SPI 인터럽트가 설정되어 있으면 SPI 인터럽트 서비스 루틴이 실행 마스터가 제공하는 클록에 의해 SPDR 레지스터로 송수신을 동시 수행 데이터 송수신이 모두 완료되면, 마스터에 의해 /SS 신호가 HIGH로 바뀜 마스터로 바뀌려면 SPCR 레지스터의 MSTR 레지스터를 1로 만들어 통신 대기 상태로 만듦
Section 08 SPI 관련 레지스터 SPCR 레지스터 SPI 제어 레지스터(SPI Control Register)
Section 08 SPI 관련 레지스터
Section 08 SPI 관련 레지스터 전송 데이터 셋업과 샘플링 전송부의 셋업과 수신부의 샘플링 동기 순간이 약속되어야 함 CPOL, CPHA에 의해 결정되는 셋업과 샘플링 위치 CPOL : 클록 극성 설정 0 : 평상시 LOW이고, 데이터 송수신할 때 HIGH 펄스로 클록 생성 1 : 평상시 HIGH이고, 데이터 송수신할 때 LOW 펄스로 클록 생성 CPHA : 샘플링 시점 0 : 처음(leading) 클록 에지에 샘플링 1 : 늦은(trailing) 클록 에지에 샘플링
Section 08 SPI 관련 레지스터 (예시) CPOL=1, CPHA=1, DODR=1일 때 데이터 송수신 CPOL=1 : 평상시 HIGH이고, 데이터 송수신할 때 LOW 펄스로 클록 생성 CPHA=1 : 늦은(trailing) 클록 에지에 샘플링 DODR=1 : LSB 먼저 송수신 마스터 송신 슬레이브 송신 10000000 01000000 11011001 L S B M 0x01 0x02 0x9B 마스터 송신(16진수) 슬레이브 송신(16진수) 샘플링 위치
Section 08 SPI 관련 레지스터 SPI 클록 분주 SPSR 레지스터의 SPI2X와 SPR1, SPR0 비트로 분주된 SCK 결정 SPI2X 비트는 주파수를 2배속으로 빠르게 하는 효과
Section 08 SPI 관련 레지스터 SPSR 레지스터 SPI 상태 레지스터(SPI Status Register)
Section 08 SPI 관련 레지스터 SPDR 레지스터 데이터를 기록하면 마스터가 생성하는 클록에 동기되어 천이 출력 읽으면 수신 천이되어 버퍼에 보관된 데이터를 얻음 SPDR을 쓰고 읽을 때, 마스터와 슬레이브의 MOSI, MISO 관계
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 실험 목적 (1) SPI 마스터 모드로 통신하는 비접촉 온도센서와 인터페이스 수행 (2) SPI 인터럽트를 사용하여 측정된 온도를 가져옴 (3) 상용 제품(DTM-M300 모듈) 데이터시트를 확인하여 응용프로그램 완성 DTM-M300 모듈 SPI 비접촉 온도센서 2.4~3.3[V], 4.5[mA]에서 동작 타깃온도와 주변온도를 SPI 통신 마스터로 전달
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 실험 회로
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 동작 INT는 /SS 신호로 사용하고, SO는 MOSI 신호로 대치 비접촉 온도센서는 마스터 이므로 ATmega128 보드는 슬레이브로 구성 SPCR 레지스터의 MSTR=0으로 설정 비접촉 온도센서에서 5개 문자 LSB부터 출력 LSB부터 먼저 출력되므로 SPCR 레지스터의 DORD=1로 설정 OxA1 : 첫 전송 데이터 고정값 OH : 타깃 온도 상위 바이트 OL : 타깃 온도 하위 바이트 AH : 주변 온도 상위 바이트 AL : 주변 온도 하위 바이트 SCK가 대기 상태에서 HIGH이므로, CPOL=1을 사용 셋업 위치는 CLK 앞부분, 샘플링 위치는 뒷부분이므로, CPHA=1로 설정
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 req_spi 변수로 ISR(SPI_STC_vect) 인터럽트 서비스 함수와 SPI 송수신 문자 수에 대한 요청/응답 인터페이스 sprintf( ) 함수의 %f 포맷을 사용하므로, 아래의 링커 옵션 추가
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 spi_thermometer.c 파일 SPI 초기화 함수 SPI 인터럽트 서비스 함수와 변수 선언 변수 선언
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 8비트 SPDR 값을 16비트 정수 temp_obj의 상위 바이트로 이동 상위 바이트는 유지시키고 하위 바이트에 복사
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 16비트 정수 temp_obj 주변 공기 온도 취함
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 결과 관찰 (a) 앞에 물체가 없을 때는 물체 온도 20.9도, 주변 온도 20.7도 측정 (b) 손을 앞에다 대면 물체 온도 31.6도, 주변 온도 20.7도 측정
Section 09 고정 마스터 모드 SPI 온도센서와 인터페이스 고정 마스터 모드 SPI 온도센서와 인터페이스 (video.zip 참고 / 11-9)
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 실험 목적 (1) 마스터/슬레이브 모드를 변경하면서 ATmega128 사이에 SPI 통신 수행 (2) 대기 중인 마스터에 /SS 신호가 LOW로 감지하면 슬레이브 변경 확인 (3) 인터럽트 서비스 루틴에서 상태도에 따라 마스터 모드와 슬레이브 모드 실행 (4) Cds-셀이 밝을 때 작은 저항, 어두울 때 큰 저항. 빛의 밝기로 A/D 변환 관찰
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 실험 회로
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 슬레이브 모드 인터럽트 서비스 루틴에서 마스터와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 프로그램 main.c, spi_adc.c, spi_adc.c 파일로 구성 main( ) 함수
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 A/D 변환 초기화 함수와 SPI 결과를 출력하는 LCD 디스플레이 함수
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스
Section 10 가변 마스터/슬레이브 모드 SPI 장치와 인터페이스 마스터와 슬레이브 모드를 번갈아가며 자신과 원격지의 Cds-셀 A/D 변환값을 SPI 통신으로 공유 Cds-셀 Cds-셀
IT CookBook, 마이크로컨트롤러 AVR ATmega128 Thank You IT CookBook, 마이크로컨트롤러 AVR ATmega128