;/*****************************************************
;Project : ATmega2560 MCU간의 SPI통신 테스트
;Version : LK-AVR2560D V01
;Date    : 2011-07-28
;Author  : Kyung Nam Lee
;Company : LKEMBEDDED
;Compiler: CodevisionAVR+AVRStudio
;Comment: Master MCU(LK-AVR2560D확장형 개발보드)에서 SW1, SW2를 입력하면 Slave MCU(LK-AVR2560D확장형 개발보드)
;        에서 부저와 LED가 ON/OFF 되며 마스터, 슬레이브 보드에서 서로 교환한 데이터를 RS232포트에 출력 하는 프로그램이다.
;        이때의 LK-AVR2560D확장형 개발보드간의 내장 된  10핀 박스헤더 커넥터(PORTB)는 10P플랫케이블 이용하여 반드시 서로 연결 되어 있어야 한다.
;*****************************************************/
;
;#include <mega2560.h>
;PCODE: $00000000 VOL: 0
	#ifndef __SLEEP_DEFINED__
;PCODE: $00000001 VOL: 0
	#define __SLEEP_DEFINED__
;PCODE: $00000002 VOL: 0
	.EQU __se_bit=0x01
;PCODE: $00000003 VOL: 0
	.EQU __sm_mask=0x0E
;PCODE: $00000004 VOL: 0
	.EQU __sm_powerdown=0x04
;PCODE: $00000005 VOL: 0
	.EQU __sm_powersave=0x06
;PCODE: $00000006 VOL: 0
	.EQU __sm_standby=0x0C
;PCODE: $00000007 VOL: 0
	.EQU __sm_ext_standby=0x0E
;PCODE: $00000008 VOL: 0
	.EQU __sm_adc_noise_red=0x02
;PCODE: $00000009 VOL: 0
	.SET power_ctrl_reg=smcr
;PCODE: $0000000A VOL: 0
	#endif
;PCODE: $0000000B VOL: 0
;PCODE: $0000000C VOL: 0
;#include <delay.h>
;#include <stdio.h>
;
;//#define Master
;#define Slave   //LK-AVR2560D확장형 개발보드 Master or Slave동작 모드를 설정!
;
;
;#ifdef Master
;unsigned char SPI_send(unsigned char data)//
;{
;    unsigned char data3=0;
;    SPDR = data;            /* Start transmission */
;    while(!(SPSR&0x80));    /* Wait for transmission complete */
;    return SPDR;
;    /*return SPDR; 전송(write)함수와 읽기 함수를 구분 짓기 위해서 주석처리를 한다.
;    필자는 굳이 함수를 따로 만들 필요성을 못 느낀다.
;    중요한 것은 SPI통신시에 Master에서 SPDR레지스터에 기록할때만 SPI Clock이 출력된다는 점이다.
;    즉, 슬레이브에서는 SPDR레지스터에 값을 기록해서 대기하고 있으며, Master에서 SPDR레지스터에 값을
;    기록(출력하면) Feedback 되어서 Master에 입력된다는 점입니다.
;    */
;}
;char SPI_read()//dummy값으로도 읽어 올수 있지만 위 SPI_send함수처럼 바로 읽어 들어 와도 무관한다.
;{
;    unsigned char data3=0;
;    SPDR = 0x00; //Dummy Data
;    while(!(SPSR&0x80));
;    return SPDR;
;}
;void Master_init()
;{
;    PORTB=0x00;
;    DDRB=0x07; /* Set MOSI and SCK output, all others input */
;    SPCR=0x50; /* Enable SPI, Master, set clock rate fck/16 */
;    SPSR=0x00;
;}
;#endif
;
;#ifdef Slave
;/*슬레이브측에서 마스터로 데이터를 보낼 시에는 데이터를 SPDR레지스터에 저장만 하면됩니다.
;이때의 마스터가 슬레이브로 데이터를 보낼 때 슬레이브의 데이터는 자동적으로 마스터로 전송됩니다.
;결국 마스터에서 발생되는 SPI클럭 없이는 슬레이브에서 단독으로 마스터로 데이터를 보낼수는 없으며,
;AVR칩의 SPI통신은 마스터와 슬레이브가 서로 교차연결된 원형(LOOP)구조로 데이터를 교환하고 있다.*/
;char SPI_receive() //slave
; 0000 0039 {

	.CSEG
;PCODE: $0000000D VOL: 0
;PCODE: $0000000E VOL: 0
; 0000 003A 
; 0000 003B     unsigned char data2=0;
; 0000 003C     while(!(SPSR&0x80)); /* Wait for reception complete */
;PCODE: $0000000F VOL: 0
;	data2 -> R17
;PCODE: $00000010 VOL: 0
;PCODE: $00000011 VOL: 0
;PCODE: $00000012 VOL: 0
;PCODE: $00000013 VOL: 0
;PCODE: $00000014 VOL: 0
;PCODE: $00000015 VOL: 0
;PCODE: $00000016 VOL: 0
;PCODE: $00000017 VOL: 0
; 0000 003D     data2= SPDR;         /* Return Data Register */
;PCODE: $00000018 VOL: 0
;PCODE: $00000019 VOL: 0
; 0000 003E     if(data2==0xfe)
;PCODE: $0000001A VOL: 0
;PCODE: $0000001B VOL: 0
;PCODE: $0000001C VOL: 0
; 0000 003F     SPDR = 1;         /* Start transmission */
;PCODE: $0000001D VOL: 0
;PCODE: $0000001E VOL: 0
; 0000 0040     else SPDR = 2;
;PCODE: $0000001F VOL: 0
;PCODE: $00000020 VOL: 0
;PCODE: $00000021 VOL: 0
;PCODE: $00000022 VOL: 0
; 0000 0041     printf("SLAVE LK-AVR2560D:receive data from MASTER:%d \r\n",data2);
;PCODE: $00000023 VOL: 0
;PCODE: $00000024 VOL: 0
;PCODE: $00000025 VOL: 0
;PCODE: $00000026 VOL: 0
;PCODE: $00000027 VOL: 0
;PCODE: $00000028 VOL: 0
;PCODE: $00000029 VOL: 0
;PCODE: $0000002A VOL: 0
;PCODE: $0000002B VOL: 0
;PCODE: $0000002C VOL: 0
;PCODE: $0000002D VOL: 0
; 0000 0042     return data2;
;PCODE: $0000002E VOL: 0
;PCODE: $0000002F VOL: 0
;PCODE: $00000030 VOL: 0
; 0000 0043 
; 0000 0044 }
;PCODE: $00000031 VOL: 0
;void Slave_init()
; 0000 0046 {
;PCODE: $00000032 VOL: 0
;PCODE: $00000033 VOL: 0
; 0000 0047 
; 0000 0048     PORTB=0x00;
;PCODE: $00000034 VOL: 0
;PCODE: $00000035 VOL: 0
; 0000 0049     DDRB=0x08;  /* Set MISO output, all others input */
;PCODE: $00000036 VOL: 0
;PCODE: $00000037 VOL: 0
; 0000 004A     SPCR=0x40;  /* Enable SPI */
;PCODE: $00000038 VOL: 0
;PCODE: $00000039 VOL: 0
; 0000 004B     SPSR=0x00;
;PCODE: $0000003A VOL: 0
;PCODE: $0000003B VOL: 0
; 0000 004C }
;PCODE: $0000003C VOL: 0
;PCODE: $0000003D VOL: 0
;#endif
;
;void main(void)
; 0000 0050 {
;PCODE: $0000003E VOL: 0
; 0000 0051     UCSR0A=0x00;
;PCODE: $0000003F VOL: 0
;PCODE: $00000040 VOL: 0
; 0000 0052     UCSR0B=0x08;
;PCODE: $00000041 VOL: 0
;PCODE: $00000042 VOL: 0
; 0000 0053     UCSR0C=0x06;
;PCODE: $00000043 VOL: 0
;PCODE: $00000044 VOL: 0
; 0000 0054     UBRR0H=0x00;
;PCODE: $00000045 VOL: 0
;PCODE: $00000046 VOL: 0
; 0000 0055     UBRR0L=0x67;
;PCODE: $00000047 VOL: 0
;PCODE: $00000048 VOL: 0
; 0000 0056 
; 0000 0057     DDRG=0X13;  //LED, BUZZ OUTPUT SET
;PCODE: $00000049 VOL: 0
;PCODE: $0000004A VOL: 0
; 0000 0058     PORTG=0X13; //LED, BUZZ INITIALIZE
;PCODE: $0000004B VOL: 0
;PCODE: $0000004C VOL: 0
; 0000 0059 
; 0000 005A     #ifdef Master     //master?
; 0000 005B     Master_init();
; 0000 005C     #endif
; 0000 005D     #ifdef Slave      //master?
; 0000 005E     Slave_init();
;PCODE: $0000004D VOL: 0
; 0000 005F     #endif
; 0000 0060 while (1)
;PCODE: $0000004E VOL: 0
; 0000 0061     {
; 0000 0062          #ifdef Master     //master?
; 0000 0063             static unsigned char data1=0;
; 0000 0064             if((PING&0X04)==0)
; 0000 0065             {
; 0000 0066                 delay_ms(20); //8mS 지연시간이 확보가 되야만 송신값과 수신값이 겹쳐서 printf()출력 되지 않는다.
; 0000 0067                 data1=SPI_send(0XFF); //Slave '0xff' Transmitter!
; 0000 0068                 printf("MASTER  LK-AVR2560D: receive data from SLAVE:%d \r\n",data1);
; 0000 0069             }
; 0000 006A             else if((PING&0X08)==0)
; 0000 006B             {
; 0000 006C                 delay_ms(20);
; 0000 006D                 data1=SPI_send(0XFE); //Slave '0xfe' Transmitter!
; 0000 006E                 printf("MASTER LK-AVR2560D: receive data from SLAVE:%d \r\n",data1);
; 0000 006F 
; 0000 0070             }
; 0000 0071         #endif
; 0000 0072         #ifdef Slave      //master?
; 0000 0073             static unsigned char data=0;
; 0000 0074             data=SPI_receive(); //Receive Function
;PCODE: $0000004F VOL: 0
;PCODE: $00000050 VOL: 0
; 0000 0075             if(data==0xff)
;PCODE: $00000051 VOL: 0
;PCODE: $00000052 VOL: 0
;PCODE: $00000053 VOL: 0
; 0000 0076             {
; 0000 0077             PORTG=0X00;   //Buzz, LED ON
;PCODE: $00000054 VOL: 0
;PCODE: $00000055 VOL: 0
; 0000 0078             }
; 0000 0079             if(data==0xfe)
;PCODE: $00000056 VOL: 0
;PCODE: $00000057 VOL: 0
;PCODE: $00000058 VOL: 0
;PCODE: $00000059 VOL: 0
; 0000 007A             {
; 0000 007B             PORTG=0X13;  //Buzz, LED OFF
;PCODE: $0000005A VOL: 0
;PCODE: $0000005B VOL: 0
; 0000 007C             }
; 0000 007D         #endif
; 0000 007E     }
;PCODE: $0000005C VOL: 0
;PCODE: $0000005D VOL: 0
;PCODE: $0000005E VOL: 0
; 0000 007F 
; 0000 0080 }
;PCODE: $0000005F VOL: 0
;PCODE: $00000060 VOL: 0
;PCODE: $00000061 VOL: 0
