아두이노 2대로 마스터 슬레이브 통신을 해보겠다.
PB5 =SCK
PB4 = MISO
PB3 = MOSI
PB2 = SS 선이다.
아두이노에서는 13~10 번 핀이다.
master mode 의 경우
PB5 =SCK
PB3 = MOSI
PB2 = SS 이 출력이고
PB4 = MISO 입력 핀
나는 PORTD7 번 핀을 슬레이브의 SS 핀 제어용으로 사용하겠다.
slave mode 의 경우
PB4 = MISO 가 출력이다.
나머지 핀들은 입력
동작 프로그램 설명
master 에서 1초마다 3 과 4 를 slave 에 보낸다.
동시에 slave 측에서 7 을 master 쪽으로 보낸다.
무조건 마스터 쪽에서 SPDR레지스터에 데이터를 입력한면 즉시 데이터 전송이 발생한다.
즉 아무 슬레이브와 연결이 안되어 있다면
마스터는 SPDR 에 이는 데이터를 shift 해서 보내고 , 아무 연결이 안되어 있음으로 0 값을 받아서 SPDR 레지스터에 저장하게 되는 것이다.
슬레이브의 SS 는 기본이 HIGH 로 되어 있어서 통신 대기 상태에 있다고 생각해야한다.
통신 대기 상태에서 미리미리 SPDR 에 마스터에 보내고 싶은 데이터를 기록해 놓는다.
그리고 SS 선이 LOW 로 통신상태가 되었을때 , 마스터에서 데이터 전송을 시작하면
자신의 데이터를 전송하고 , 마스터의 데이터를 받아온다.
즉 주도권은 항상 마스터에 존재 하며 슬레이브는 마스터가 SS 선을 LOW 만들어서 전송상태로 만든후
마스터에서 데이터를 전송 해야지만 송수신이 가능하다.
또한 1바이트의 데이터를 송수신한후 마스터는 항상 슬레이브의 SS 선을 HIGH 로 만들어서 통신을 초기화 시켜줘야한다.
1대의 슬레이브라도 통신을 초기화 시켜주지 않는다면 동기화가 깨져서 잘못된 데이터를 주고 받는다.
Master
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
DDRB = DDRB|(1<<5)|(1<<3)|(1<<2);
DDRD = (1<<7); // 슬레이브 선택용 ss 핀
PORTD = PORTD|(1<<7);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //fck/16
Serial.println("start");
}
void loop()
{
PORTD = PORTD&(~(1<<7)); // slave 킴
SPDR = 3; // 데이터 입력
while(!(SPSR & (1<<SPIF))); // SPSR ( 1로 set 될때까지 기다림)
Serial.print("SPDR : ");
Serial.println(SPDR);
PORTD = PORTD|(1<<7); //슬레이브 끔
delay(1000); // 1초 대기
PORTD = PORTD&(~(1<<7));
SPDR = 4;
while(!(SPSR & (1<<SPIF))); // SPSR ( 1로 set 될때까지 기다림)
Serial.print("SPDR : ");
Serial.println(SPDR);
PORTD = PORTD|(1<<7);
delay(1000);
}
Slave
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
SPCR = (1<<SPE);
DDRB = (1<<4);
}
void loop()
{
SPDR = 7;
while(!(SPSR & (1<<SPIF)));
Serial.print("SPDR : ");
Serial.println(SPDR);
}
https://forum.arduino.cc/t/how-to-simply-enable-the-spi-in-atmega328p-using-register/547032/11
How to simply enable the SPI in ATmega328P using register.
@OP As you are interested to program SPI Interface using register level instruction, the following diagram might be helpful for you. Figure-1: Communication between two UNOs over SPI Port With the help of the following codes, the Master sends 4-byte data t
forum.arduino.cc
'공부,일 > atmega328P' 카테고리의 다른 글
atmega 328p USART (1) 개념 및 다이어그램 (0) | 2021.08.01 |
---|---|
질문 (0) | 2021.07.30 |
atmega 328p SPI(1) 기본개념 , 레지스터 (0) | 2021.07.29 |
링커스크립트 (0) | 2021.07.29 |
좋은 블로그 atmega 관련 (0) | 2021.07.29 |
댓글