;/*****************************************************
;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
