xMEGA256을 사용해서 W5500과 SPI통신을 하고자 합니다. 아두이노 버전과 다른 칩으로는 SPI통신 확인이 되는데 요것만 않되서 문의드려 봅니다. 기본소스는 아래와 같습니다.
int main (void)
{
cli();
sys_clock();
spg_usart();
w55_init();
w55_desel();
w55_hw_reset();
reg_wizchip_cs_cbfunc(w55_sel, w55_desel);
reg_wizchip_spi_cbfunc(w55_r, w55_w);
delay_cnt(10000);
uint8_t memsize[2][8] = { { 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2 } };
wizchip_init(memsize[0],memsize[1]);
unsigned char temp;
if (ctlwizchip(CW_INIT_WIZCHIP, (void*) memsize) == -1) {
spg_tx(0x22); // usart check
}
spg_tx(0x33);
if( ctlwizchip(CW_GET_PHYLINK, (void*)&temp) == -1 ) {
spg_tx(0x44); // usart check
}
sei();
uint8_t ret = 0xcc; // dumy
ret = getVERSIONR();
spg_tx(ret);
nop();
while(1) {
}
}
void sys_clock(void)
{
OSC_XOSCCTRL = 0x4B;
OSC_PLLCTRL = 0xC4;
OSC_CTRL = 0x18;
while((OSC_STATUS&0x18)!=0x18);
CPU_CCP = 0xD8;
CLK_CTRL = 0x04;
}
void spg_usart(void)
{
(PORTE_DIR |= (1<<3)); // tx
(PORTE_DIR &= ~(1<<2)); // rx
PORTE_PIN2CTRL = PORT_OPC_PULLUP_gc ;
position = USARTE0_DATA;
USARTE0_CTRLB = 0x18;
USARTE0_CTRLC = 0x03;
USARTE0_BAUDCTRLB = 0xb0 + (3301>>8);
USARTE0_BAUDCTRLA = 3301 & 0x00ff;
USARTE0_CTRLA = 0x30;
PMIC_CTRL = 0x07;
}
void w55_init(void)
{
PORTF.DIR |= 0x03; // nRST(1), CLATCH(0)
PORTF.OUTSET = (1<<W5500_SCSN) | (1<<W5500_RSTN);
PORTE.DIR |= 0xB0; // out : INITn(4), MOSI(5), SCLK(7) / in : MISO(6)
SPIE.CTRL = 0x50;
}
void w55_sel(void)
{
(PORTF_DIR &= ~(1<<0));
}
void w55_desel(void)
{;
(PORTF_DIR |= (1<<0));
}
void w55_w(uint8_t data)
{
SPIE_DATA = data;
while(!(SPIE_STATUS&0x80));
}
uint8_t w55_r(void)
{
SPIE_DATA = 0xff; // dumy
while(!(SPIE_STATUS&0x80));
return SPIE_DATA;
}
void w55_hw_reset(void)
{
(PORTF_DIR &= ~(1<<1));
delay_cnt(5000);
(PORTF_DIR |= (1<<1));
delay_cnt(10000);
}
void delay_cnt(volatile unsigned int nCount)
{
for(; nCount!=0; nCount–);
}
xMEGA는 외부크리스탈 8MHz를 사용합니다. 일단 usart로 데이터 체크하고있는데,
usart자체의 rx/tx의 데이터들은 잘 확인이 됩니다.
근데 W5500과 spi 통신을 확인하려하니 데이터시트에서 getVERSIONR();를 사용하면 0x04가 나와야 된다고 하는데 계속 0x00만 출력되네요.
어느 부분이 잘못되었을까요?
ctlwizchip()함수는 에러 없이 잘 넘어 갑니다.