
기존의 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를 이용해서 테스트 해봐야 할것 같다.
