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 |