AVR2010. 2. 16. 16:05
 







datasheet 최신판에 보면 각 SPI명령이 나와있다.

먼저 spi설정은

SCLK =>  PB1
SS   =>  PB0
MOSI => PB2
MISO => PB3
4개를 설정 해줘야 한다. MISO는 인풋으로 SCLK, SS, MOSI는 아웃풋으로 설정.


void init_spi(void)
{
   DDRB = 0x07; // SS, SCLK, MOSI는 아웃풋으로 MISO는 인풋으로
   PORTB = 0x03; // SS, SCLK는 초기값을 1로
   TCCR0 = 0x05;
   TCNT0 = 0;
   SPCR = 0x7E;
   SREG |= (1<<7);
}

byte SPI_IO(byte data) //data를 slave쪽으로 보내고 slave에서 data를 받아서 리턴해준다.
{
 SPDR = data;
 while((SPSR & 0x80) == 0);
 data = SPDR;

 return data;
}

밑으로는 ISD1730 각각의 명령들.
SPI 시작은 SS를 High에서 Low로 떨어트리면서 시작하고 종료는 Low에서 High로 올리면서 끝낸다.

void ISD_PU(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(PU);
 SPI_IO(ZERO); 
    PORTB = 0x07;
}

void ISD_STOP(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(STOP);
 SPI_IO(ZERO); 
    PORTB = 0x07;
}

void ISD_RESET(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(RESET);
 SPI_IO(ZERO); 
    PORTB = 0x07;
}

void ISD_CLR_INT(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(CLR_INT);
 SPI_IO(ZERO); 
    PORTB = 0x07;
}

void ISD_RD_STATUS(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(RD_STATUS);
 SPI_IO(ZERO);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

UINT ISD_RD_PLAY_PTR(void)
{
 unsigned int nPlayPointer;
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(RD_PLAY_PTR);
 SPI_IO(ZERO);
 nPlayPointer = SPI_IO(ZERO);
 nPlayPointer |= (SPI_IO(ZERO) << 8);
    PORTB = 0x07;

 return nPlayPointer;
}

void ISD_PD(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(PD);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

UINT ISD_RD_REC_PTR(void)
{
 unsigned int nRecPointer;
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(RD_REC_PTR);
 SPI_IO(ZERO);
 nRecPointer = SPI_IO(ZERO);
 nRecPointer |= (SPI_IO(ZERO) << 8);
    PORTB = 0x07;

 return nRecPointer;
}

UCHAR ISD_DEVID(void)
{
 unsigned char nDeviceID;
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(DEVID);
 SPI_IO(ZERO);
 nDeviceID = SPI_IO(ZERO);
    PORTB = 0x07;

 return nDeviceID;
}

void ISD_PLAY(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(PLAY);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_REC(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(REC);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_ERASE(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(ERASE);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_G_ERASE(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(G_ERASE);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

UINT ISD_RD_APC(void)
{
 unsigned int nAPC;
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(RD_APC);
 SPI_IO(ZERO);
 nAPC = SPI_IO(ZERO);
 nAPC |= (SPI_IO(ZERO) << 8);
    PORTB = 0x07;

 return nAPC;
}

void ISD_WR_APC2(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(WR_APC2);
 SPI_IO(0xA0);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_WR_NVCFG(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(WR_NVCFG);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_LD_NVCFG(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(LD_NVCFG);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_FWD(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(FWD);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_CHK_MEM(void)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(CHK_MEM);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_SET_PLAY(unsigned int start_addr,unsigned int end_addr)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(SET_PLAY);
 SPI_IO(ZERO);
 SPI_IO(start_addr&0xFF);
 SPI_IO(start_addr>>8);
 SPI_IO(end_addr&0xFF);
 SPI_IO(end_addr>>8);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_SET_REC(unsigned int start_addr,unsigned int end_addr)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(SET_REC);
 SPI_IO(ZERO);
 SPI_IO(start_addr&0xFF);
 SPI_IO(start_addr>>8);
 SPI_IO(end_addr&0xFF);
 SPI_IO(end_addr>>8);
 SPI_IO(ZERO);
    PORTB = 0x07;
}

void ISD_SET_ERASE(unsigned int start_addr,unsigned int end_addr)
{
 PORTB = 0x06;
 kb_delay_ms(1);
 SPI_IO(SET_ERASE);
 SPI_IO(ZERO);
 SPI_IO(start_addr&0xFF);
 SPI_IO(start_addr>>8);
 SPI_IO(end_addr&0xFF);
 SPI_IO(end_addr>>8);
 SPI_IO(ZERO);
    PORTB = 0x07;
}
 
void ISD_INIT(void)
{
 ISD_RESET();
 ISD_PU();
 ISD_WR_APC2();
 ISD_CLR_INT();
}

'AVR' 카테고리의 다른 글

AT Command  (0) 2009.04.02
tlc(5개저장, NO CARRIER 감지) 무조건 끊어져  (0) 2009.03.31
Posted by 불량껌