본문 바로가기

[TI]/MSP0M

[MSPM0G3507 SSM] SPI테스트 - W5500 을 이용한 TCP 전송률 테스트

기존의 MSPM0L1306(https://nexp.tistory.com/4071)의 SPI최대 클럭은 16Mhz 였는데 MSPM0G3507은 80Mhz 클럭으로 동작하고 최대 40Mhz SPI클럭을 출력 할 수있다.

 

MSPM0G3507의 SPI 기능으로 W5500 이더넷 모듈을 이용하여 TCP 전송률 테스트를 해보자.

 

CCS의 SysConfig 로 SPI 를 추가 하고 80Mhz에서 SPI클럭을 선택하면 최대 40Mhz SPI클럭을 출력 할 수 있다.



하지만 SPI 최대 전송률은 32Mhz로 제한이 되어 있다. 클럭 자체는 40Mhz로 출력 되지만 데이터 를 보장하려면 클럭을 줄여야 한다. 이부분은 아쉽다. 일단 20Mhz 클럭으로 설정하고 테스트 해보자.

 

 

MSPM0G3507의 SPI핀은 PA4~PA6에 할당 한다.

 

프로젝트 저장하고 빌드하면 SPI관련 자동 코드가 생성된다.


이제 W5500 이더넷 모듈을 이용해서 이더넷 전송률을 측정해 보자

우선 프로젝트를 생성하고 ioLibrary Driver를 다운 받아 복사 한다.


먼저 wiznet_test.c 파일에 wizchip_select, deselect, SPI_WriteReadByte, SPI_WriteBuf, SPI_ReadBuf 함수를 MSM0G3507에 맞게 재정의 해 주어야 한다.

 

#define IINCHIP_CSoff() 	DL_GPIO_clearPins(GPIO_GRP_0_PORT, GPIO_GRP_2_W5500_CS_PIN)
#define IINCHIP_CSon()		DL_GPIO_setPins(GPIO_GRP_0_PORT, GPIO_GRP_2_W5500_CS_PIN)

static void  wizchip_select(void)
{
	IINCHIP_CSoff() ;
}

static void  wizchip_deselect(void)
{
    IINCHIP_CSon();
}


uint8_t SPI_WriteReadByte(uint8_t Data)
{
    while (DL_SPI_isBusy(SPI_0_INST));
    DL_SPI_transmitData8(SPI_0_INST, Data);

    return DL_SPI_receiveDataBlocking8(SPI_0_INST);
}

void SPI_WriteBuf(uint8_t *pDataBuf, uint16_t Size)
{
  uint8_t receivedbyte = 0;

  /* Send a Byte through the SPI peripheral */
  /* Read byte from the SPI bus */
#if _USE_SPI_DMA

#else
  for(int i=0;i<Size;i++)
  {
    while (DL_SPI_isBusy(SPI_0_INST));
    DL_SPI_transmitData8(SPI_0_INST, pDataBuf[i]);

    receivedbyte = DL_SPI_receiveDataBlocking8(SPI_0_INST);
  }
#endif
}

void SPI_ReadBuf(uint8_t *pDataBuf, uint16_t Size)
{
  uint8_t receivedbyte = 0;

  /* Send a Byte through the SPI peripheral */
  /* Read byte from the SPI bus */
#if _USE_SPI_DMA

#else
  for(int i=0;i<Size;i++)
  {
    while (DL_SPI_isBusy(SPI_0_INST));
    DL_SPI_transmitData8(SPI_0_INST, 0);

    pDataBuf[i] = DL_SPI_receiveDataBlocking8(SPI_0_INST);
  }
#endif
}

 

 

이후 W5500 루프백 테스트 코드로 MSPM0G3507을 이용하여 W5500 TCP전송률을 테스트 해 볼수 있다.

#include "ti_msp_dl_config.h"

#define DELAY (8000000)
#define SPI_MASTER_DUMMY    0xFF

#include <stdio.h>
#include <string.h>
#include "wiznet_test.h"

#define SOCK_TCPS0       0

uint8_t gDATABUF[DATA_BUF_SIZE];

int main(void)
{
    unsigned int data[2];
    unsigned int gADCResult;
    SYSCFG_DL_init();

    printf("W5500 TCP loopback Test\r\n");    
    W5500_Init();
    Display_Net_Info();
	
    while (1) 
	{
      iperf_tcps(SOCK_TCPS0, gDATABUF, 5001);
    }
}

 

 

루프백 테스트 코드를 수정해서 iperf  서버 테스트를 할수 있도록 했다.

int32_t iperf_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t ret;
   uint16_t size = 0, sentsize=0;
   switch(getSn_SR(sn))
   {
      case SOCK_ESTABLISHED :
         if(getSn_IR(sn) & Sn_IR_CON)
         {
            setSn_IR(sn,Sn_IR_CON);
         }
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

            ret = recv(sn,buf,size);
            if(ret <= 0) return ret;

            #if _USE_LOOP_BACK
            sentsize = 0;
            while(size != sentsize)
            {
               ret = send(sn,buf+sentsize,size-sentsize);
               if(ret < 0)
               {
                  close(sn);
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
			#endif
         }
         break;
      case SOCK_CLOSE_WAIT :
         if((ret=disconnect(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_INIT :
         if( (ret = listen(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_CLOSED:
         if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
        	 cnt = 0;


            return ret;
         break;
      default:
         break;
   }
   return 1;
}

 

 

MSPM0G3507에서 W5500 을 이용하여 iperf 테스트 결과 8Mbps가 측정된다. 최대 클럭인 32Mhz로 설정할 수 없어 그런지 약간 아쉬운 성능이다. 앞으로 SPI DMA를 이용해서 테스트 해봐야 할것 같다.

 

반응형