WIZnet Developer Forum

EFM32GG11 와 W5500 SPI 통신 문제

안녕하세요
EFM32GG11 및 EFM32GG12 개발보드와 W5500 모듈 간 SPI 통신이 잘 되지 않아 문의 드립니다.

EFM32 보드와는 register 읽기 쓰기부터 비정상적으로 동작합니다.

다음과 같이 mac어드레스를 쓰고 읽기를 시도하였으나 썼던 값으로 읽히지 않고
0x01 0x01 0x01 0x01 0x01 0x01 과 같이 읽힙니다.
STM32 보드로는 정상동작이 됩니다.

  reg_wizchip_cs_cbfunc (spiCSlow, spiCShigh);
  reg_wizchip_spi_cbfunc (spiRecvByte, spiSendByte);
  reg_wizchip_spiburst_cbfunc (spiRecvByteArray, spiSendByteArray);

  uint8_t rx_tx_buff_sizes[] =
{ 2, 2, 2, 2, 2, 2, 2, 2 };
  wizchip_init (rx_tx_buff_sizes, rx_tx_buff_sizes);

  wiz_NetInfo net_info =
{ .mac =
  { 0x00, 0x04, 0x05, 0x06, 0x07, 0x08 }, .dhcp = NETINFO_DHCP };

  setSHAR(net_info.mac);
  uint8_t mac[6] = { 0, };
  getSHAR(mac);

등록되는 callback 함수 입니다.

void spiCSlow(void)
{
GPIO_PinOutClear(SPI_CS_PORT, SPI_CS_PIN);
}

void spiCShigh(void)
{
GPIO_PinOutSet(SPI_CS_PORT, SPI_CS_PIN);
}

void spiSendByte(uint8_t sendbyte)
{
// app_log_debug(“tx:0x%.2x\r\n”, sendbyte);
USART_Tx(SPI_USART,sendbyte);
/* Wait for transmition to finished */
while (!(SPI_USART->STATUS & USART_STATUS_TXC)) ;

/* Return the datat read from SPI buffer */
USART_Rx(SPI_USART);
}

uint8_t spiRecvByte(void)
{
// app_log_debug(“tx:0x00…\r\n”);
USART_Tx(SPI_USART,0x00);
/* Wait for transmition to finished */
while (!(SPI_USART->STATUS & USART_STATUS_TXC)) ;

/* Return the datat read from SPI buffer */
uint8_t ret = USART_Rx(SPI_USART);
// app_log_debug(“rx:%.2x\r\n”, ret);
return ret;
}

void spiSendByteArray(uint8_t * buf, size_t size)
{
uint8_t *tx_ptr = buf;
size_t tx_count = size;
while (tx_count > 0)
{
// app_log_debug(“tx:0x%.2x\r\n”, *tx_ptr);
USART_Tx(SPI_USART,*tx_ptr);
tx_count–;
tx_ptr += sizeof(uint8_t);
while (!(SPI_USART->STATUS & USART_STATUS_TXC)) ;
USART_Rx(SPI_USART);
}
}

void spiRecvByteArray(uint8_t * buf, size_t size)
{
uint8_t *rx_ptr = buf;
size_t rx_count = size;
while (rx_count > 0)
{
// app_log_debug(“tx:0x00…\r\n”);
USART_Tx(SPI_USART,0x00);
while (!(SPI_USART->STATUS & USART_STATUS_TXC)) ;
*rx_ptr = USART_Rx(SPI_USART);
// app_log_debug(“rx:%.2x\r\n”, *rx_ptr);
rx_count–;
rx_ptr += sizeof(uint8_t);
}
}

SPI 관련하여 다음과 같이 설정하였습니다.

CMU_ClockEnable(cmuClock_HFPER, true);
/* Enable clock for USART3 */
CMU_ClockEnable(cmuClock_GPIO, true);
CMU_ClockEnable(SPI_CLK, true);

USART_InitSync_TypeDef init = USART_INITSYNC_DEFAULT;
init.autoCsEnable = true;
init.msbf = true;
init.baudrate = 1000000;

/* Configure SPI pins /
GPIO_PinModeSet(SPI_MOSI_PORT, SPI_MOSI_PIN, gpioModePushPull, 1);
GPIO_PinModeSet(SPI_MISO_PORT, SPI_MISO_PIN, gpioModeInput, 0);
GPIO_PinModeSet(SPI_CLK_PORT, SPI_CLK_PIN, gpioModePushPull, 0);
/
Keep CS high to not activate slave */
GPIO_PinModeSet(SPI_CS_PORT, SPI_CS_PIN, gpioModePushPull, 1);

/* Reset USART just in case */
USART_Reset(SPI_USART);

/* Configure to use SPI master with manual CS /
/
For now, configure SPI for worst case 32MHz clock in order to work for all /
/
configurations. */
USART_InitSync(SPI_USART, &init);

/* Module USART3 is configured to location 0 */
SPI_USART->ROUTELOC0 = (SPI_USART->ROUTELOC0 & ~(_USART_ROUTELOC0_TXLOC_MASK
| _USART_ROUTELOC0_RXLOC_MASK
| _USART_ROUTELOC0_CLKLOC_MASK
| _USART_ROUTELOC0_CSLOC_MASK))
| (TX_LOC << _USART_ROUTELOC0_TXLOC_SHIFT)
| (RX_LOC << _USART_ROUTELOC0_RXLOC_SHIFT)
| (CLK_LOC << _USART_ROUTELOC0_CLKLOC_SHIFT)
| (CS_LOC << _USART_ROUTELOC0_CSLOC_SHIFT);

/* Enable signals TX, RX, CLK, CS */
SPI_USART->ROUTEPEN |= USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN |
USART_ROUTEPEN_CLKPEN | USART_ROUTEPEN_CSPEN;

위와 동일한 SPI 설정으로 아두이노를 slave로 하여 SPI 통신 시 정상적으로 data 송수신이 됩니다.

어느 부분에 문제가 있는지 도움 부탁 드리겠습니다.

감사합니다.

안녕하세요

SPI와 UART는 별도의 프로토콜인데 SPI(SEND/RECV)함수 내부에서 UART를 실행하는 것 같습니다.
SPI로 칩과 통신하는 코드를 첨부해드리겠습니다. 참고부탁드리겠습니다.

감사합니다.

EFM32 mcu 에서는 SPIDRV라는 별도의 spi lib 를 이용하거나
다음과 같이 USART tx, rx, clk, scs 를 사용하여 spi를 구현하여 사용하는 것 같습니다.
위 구현 내용도 이걸 참고한 것입니다.

그러나 두 방법으로도 W5500과 spi 통신이 정상적으로 이루어 지지 않습니다.
(아두이노를 slave로 하여 ioLibrary 사용하여 mac 쓰기, 읽기 관련하여 spi 통신하면 원하는 데이터를 받습니다.)

  1. IoLibrary를 사용하신다면,
    아래와 같이 선택되어있는지 확인을 해주세요.

  2. getVERSIONR() 를 이용하여, byte단위의 Version 값을 읽어보시길 바랍니다.
    정상적인 SPI 동작이라면, 0x04 가 읽혀집니다.
    만일 동작하게 설정을 해놨음에도 동작하지 않는다면, SPI Frame을 정상적으로 보내고 있는지 확인하셔야합니다.
    image

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.