[4] 각 하드웨어를 연결할 수 있는 모듈 만들기(2) – SPI 통신 선택 방법
(4.1) SPI 테스트
1)wiringPi 설치하기
2)spi 코드 작성
| 
 1  #include <stdio.h> 
 2  #include <string.h> 
 3  #include <errno.h> 
 4  #include <wiringPi.h> 
 5  #include <wiringPiSPI.h> 
 6  
 7  #define SPI_CHANNEL 0 
 8  #define SPI_SPEED 10 
 9  
10  int main(void) 
11  { 
12     if(wiringPiSetup() == -1) 
13      { 
14         fprintf (stdout, "Unable to start wiringPi: %s\n", strerror(errno)); 
15         return 1 ; 
16       } 
17  
18     if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) 
19     { 
20         fprintf (stdout, "wiringPiSPISetup Failed: %s\n", strerror(errno)); 
21         return 1 ; 
22     } 
23 
24    while(1) 
25     { 
26         char data = 0x65; 
27         wiringPiSPIDataRW(SPI_CHANNEL, &data, 1); 
28     } 
29  
30     return 0; 
31   } | 
<출처 - file:///home/an/Downloads/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC+%EC%84%B8%EB%AF%B8%EB%82%98+7%ED%9A%8C.pdf>
3)라즈베리파이 spi 통신 설정
4)SPI 파형 OSC로 확인
(SPI 최고 속도가 필요하다.)
BCM2835 ARM Peripherals –
The CDIV (Clock Divider) field of the CLK register sets the SPI clock speed
Cortex -A7 MPCore - 
(4.2) 라즈베리 파이와 아두이노의 SPI 통신 테스트]
라즈베리파이가 slave에 데이터를 잘 전달하는지 확인해보았다. 
라즈베리파이   아두이노
SCK(23)                       SCK(52) 
MOSI(19)  MOSI(51)
GND      GND
- 라즈베리파이 코드
| 
 1 #include <stdio.h> 
 2 #include <string.h> 
 3 #include <errno.h> 
 4 #include <wiringPi.h> 
 5 #include <wiringPiSPI.h> 
 6  
 7 #define SPI_CHANNEL 0 
 8 #define SPI_SPEED 10000 
 9 #define SIZE 12 
10  
11  
12  
13 int main(void) 
14 { 
15  
16     char buf[SIZE] = "RaspberryPi"; 
17     int i = 0; 
18  
19     if(wiringPiSetup() == -1) 
20     { 
21         fprintf(stdout,"Unable to start wiringPi: %s\n", strerror(errno)); 
22         return 1; 
23     } 
24  
25     if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) 
26     { 
27         fprintf(stdout, "wiringPiSetup Failed: %s\n", strerror(errno)); 
28         return 1; 
29     } 
30  
31     while(1) 
32     { 
33         char data = buf[i]; 
34         wiringPiSPIDataRW(SPI_CHANNEL, &data, 1); 
35  
36         delay(100); 
37  
38         i++; 
39  
40         if(i==SIZE-1) 
41             i=0; 
42     } 
43  
44     return 0; | 
- 아두이노 코드
<출처 - http://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-an-arduino slave example >
| 
#include <SPI.h> 
char buf = 'z'; 
volatile bool process_it; 
void setup (void) 
{ 
 Serial.begin (115200);   // debugging 
 // turn on SPI in slave mode 
 SPCR |= bit (SPE); 
 // have to send on master in, *slave out* 
 pinMode (MISO, OUTPUT); 
 // get ready for an interrupt 
 process_it = false; 
 // now turn on interrupts 
 SPI.attachInterrupt(); 
}  // end of setup 
// SPI interrupt routine 
ISR (SPI_STC_vect) 
{ 
 byte c = SPDR;  // grab byte from SPI Data Register 
 buf = c; 
 process_it = true; 
}  // end of interrupt routine SPI_STC_vect 
// main loop - wait for flag set in interrupt routine 
void loop (void) 
{ 
 if (process_it) 
   { 
   Serial.println (buf); 
   process_it = false; 
   }  // end of flag set 
}  // end of loop | 
(4.3] 칩을 선택할 수 있는 디코더
1)4-16 디코더
 
 
댓글 없음:
댓글 쓰기