[ST_MICRO]/STM32H72018. 12. 16. 07:21

STM32H7 SPI - W5500 TCP/IP 전송속도 테스트 에러 문제 해결

STM32F7 evm 보드에서 테스트 했던 W5500 소스코드를 이용하여 STM32H7 보드에서 테스트 중인데 컴파일 에러가 발생한다.

 

STM32F7 에서 W5500제어 테스트 에서  사용 했던 코드와 동일한데 왜 에러가 발생할까?

 

 

 

#문제발생

 

에러코드

설명 자원 경로 위치 유형

expected identifier or '(' before numeric constant w5500.h /ex24_spi_w5500/Src 행 70 C/C++ Problem

 

 

 

F7 코드에서는 문제가 없었는데... 에러를 찾아 가 보니 헤더파일의 선언 순서가 문제가 된다.

같은 컴파일러 인데 왜 문지가 되지?

 

 

#문제해결

w5500.c

#include "w5500.h"

#include "config.h"

 

 

#include "config.h"

#include "w5500

 

 

수정해서 컴파일 정상적으로 되었고 STM32H7에서 W5500으로 TCP/IP 전송 속도 테스트 결과 4.4Mbps 정도 출력이 된다.

 

 

 

그런데... 이상하다. 

STM32F7 보다 STM32H7이 속도가 더 빠른데 왜 TCP전송 속도가 느린 것일까?

아무래도 SPI클럭 설정이 STM32F7과 달라서 그런것 같은데... 클럭을 올리면 W5500이 초기화가 되지 않는 현상이 있다.

아무래도 SPI를 DMA를 사용해서 테스트 해야 할것 같다.

 

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F72018. 5. 15. 04:40

[STM32F7 EVM] STM32F767 SPI 테스트 - W5500 TCP/IP 전송 속도 테스트

 

[NET_EV_SM EVM]보드와 W5500 EVM 보드를 이용하여 Ethernet (TCP/IP) 테스트를 진행 했다

[STM32F7 EVM]보드에는 SSM 모듈 표준 핀맵이 적용되어 있기 때문에 W5500 EVM과 같은 모듈을 연결하여 쉽게 테스트 가능하다.

 

 

 

W5500은 SPI통신을 사용하므로 STM32CubeMx를 이용하여 SPI 항목을 설정해 준다. 

 

 

W5500 드라이버 API를 사용하기 위해 SPI Read/Write 함수를 포팅해 주면 기존 코드를 그대로 사용할 수 있다.

#define SPIx_TIMEOUT_MAX		((uint32_t)0x1000)

unsigned char SPI1_WriteReadByte(unsigned char Data)
{
	uint8_t receivedbyte = 0;

	/* Send a Byte through the SPI peripheral */
	HAL_SPI_TransmitReceive(&hspi1, (uint8_t*) &Data, (uint8_t*) &receivedbyte, 1, SPIx_TIMEOUT_MAX);
	
	return receivedbyte;
}

unsigned char SPI1_WriteBuf(unsigned char *pDataBuf, unsigned int Size)
{
	uint8_t receivedbyte = 0;

	HAL_SPI_Transmit(&hspi1, pDataBuf, Size, SPIx_TIMEOUT_MAX);

	return receivedbyte;
}

unsigned char SPI1_ReadBuf(unsigned char *pDataBuf, unsigned int Size)
{
	uint8_t receivedbyte = 0;

	HAL_SPI_Receive(&hspi1, pDataBuf, Size, SPIx_TIMEOUT_MAX);

	return receivedbyte;
}

 

 

STM32CubeMx 에 SPI Read/Write함수 포팅후 TCP loopback 예제 함수를 호출하여 전송율을 테스트 해 볼수 있다.

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
 // SCB_EnableICache();
  //SCB_EnableDCache();

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();


  /* USER CODE BEGIN 2 */
  //W5500 초기화 함수
  W5500_Init();
  Display_Net_Info();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	    ProcessTCPS();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

STM32F7에서 W5500 을 이용하여 TCP/IP 전송율 테스트를 해 보면 5.24Mbps 정도가 측정된다.

 

Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2015. 2. 16. 03:38

TM4C123 EVM - W5500 TCP/IP 전송 속도 테스트

TM4C123 EVM - W5500 TCP/IP 전송 속도 테스트



[NET_EV_SM EVM]보드와 W5500 EVM 보드를 이용하여 Ethernet (TCP/IP) 테스트를 진행 했다.

고성능 Cortex-M4 코어의 TM4C123 에서 Ethernet 기능을 추가해 두면 여러 프로젝트에서 유용할 것 같다.

위 사진과 같이 W5500 EVM 보드를 연결하면 Ethernet을 쉽게 테스트 가능하다. 



W5100, W5200, W5500 Ethernet 모듈은 [NET_EV_SM EVM] 보드의 SPI-EXP 모듈을 연결하여 쉽게 테스트 가능하다.


W5500의 CS핀은 P_B15 -> CN18_15pin ->PD6

/RST 핀은 P_A3->CN17_3pin -> PE1

에 연결되어 있다.



TM4C123 코드에서 W5500 Driver Code에서 아래와 같이 핀을 할당 할 수 있다.

//-----------------------------------------------------------------------------

// W5500 HAL


#define W5500_CS_PORT PORTD

#define W5500_CS_BIT BIT6


#define W5500_RST_PORT PORTE

#define W5500_RST_BIT BIT1


#define IINCHIP_RSToff() PE1 = 0

#define IINCHIP_RSTon() PE1 = BIT1


#define IINCHIP_CSoff() PD6 = 0

#define IINCHIP_CSon() PD6 = BIT6


                                        

#define W5500_IO_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, W5500_CS_BIT);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, W5500_RST_BIT);


#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SpiSpeed()

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SpiSpeed()              SPI0_SetSpeed(SPI_SPEED_MAX)

//-----------------------------------------------------------------------------




TM4C123의 이더넷 테스트를 위해 TCP/IP 루프백 테스트 코드를 이용하였다. 

int32_t loopback_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;

            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.

            }

         }

         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)

            return ret;

         break;

      default:

         break;

   }

   return 1;

}




TM4C123은 기본 드라이버 코드가 ROM에 저장되어 있기 때문에 코드 사이즈를 상당히 줄일 수 있다.

실제 컴파일 해 보면 코드 사이즈가 7kbyte로 상당히 적은것을 확인 할 수 있다.


[1] = D:\WORK\ARM\TM4C\tm4c123_evm\ex10_w5500\ewarm66\Debug\Obj

[2] = command line

[3] = dl7M_tln.a

[4] = driverlib.a

[5] = m7M_tlv.a

[6] = rt7M_tl.a

[7] = shb_l.a


  7 072 bytes of readonly  code memory

    720 bytes of readonly  data memory

  2 645 bytes of readwrite data memory




Wiznet사의 AX1프로그램을 이용하여 W5500의 TCP/IP 루프백 전송 속도 테스트를 해 보면 TM4C123 의 SPI 최대 속도는 12Mhz에서 2Mbps 정도로 측정된다. 

TCP/IP 전송 속도 테스트 결과 참고 에서와 같이 TCP/IP 전송 속도를 비교해 보면 SPI속도가 느려서 그런지 약간의 한계가 있어 페리 기능이 좀 아쉽다.


[1] iInChip Send: 2.1093 Mbps(348160 bytes, 1.2593 sec)

iInChip Recv: 1.9174 Mbps(348160 bytes, 1.3853 sec)

------------------------------------------------------------

[2] iInChip Send: 2.0543 Mbps(348160 bytes, 1.2930 sec)

iInChip Recv: 1.7646 Mbps(348160 bytes, 1.5053 sec)

------------------------------------------------------------

[3] iInChip Send: 2.1132 Mbps(348160 bytes, 1.2570 sec)

iInChip Recv: 1.8640 Mbps(348160 bytes, 1.4250 sec)

------------------------------------------------------------

[4] iInChip Send: 2.1347 Mbps(348160 bytes, 1.2443 sec)

iInChip Recv: 1.9225 Mbps(348160 bytes, 1.3817 sec)

------------------------------------------------------




TM4C123 EVM 과 W5500을 이용하여 TCP/IP 테스트 코드

#include "system.h"

#include "serial.h"

#include "wiznet.h"


#define SOCK_TCPS0       0

#define DATA_BUF_SIZE   2048

uint8_t gDATABUF[DATA_BUF_SIZE];


void ProcessTCPS(void)

{

    loopback_tcps(SOCK_TCPS0, gDATABUF, 3000);

}


int main(void)

{

    short data;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C Uart Test\r\n");


    //W5500 초기화 함수

    W5500_Init();

    

    while(1)

    {

        ProcessTCPS();      

    }

}


Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 5. 1. 22:46

EFM32G210 EVM - W5200을 이용한 TCP/IP 전송 속도 테스트

EFM32G210 EVM - W5200을 이용한 TCP/IP 전송 속도 테스트



[XMega-EX EVM] 확장 테스트 보드를 이용하면 W5200모듈을 연결하여 이더넷 테스트가 가능하다.



EFM32G210 EVM W5200 TCP/IP 모듈 드라이버 코드

//-----------------------------------------------------------------------------

// W5100 HAL

#define W5100_CS_PORT GPIOA

#define W5100_CS_BIT BIT0


#define W5100_RST_PORT GPIOA

#define W5100_RST_BIT BIT1



#define W5100_IO_INIT() GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1);\

                                        GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 1);\

                                        IINCHIP_CSon();


#define IINCHIP_CSoff() cbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_CSon() sbi(W5100_CS_PORT, W5100_CS_BIT)



#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SPI_SPEED();

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SPI_SPEED()            MMC_SPISpeed(SPI_SPEED_MAX) 


#define IINCHIP_RSToff() cbi(W5100_RST_PORT, W5100_RST_BIT)

#define IINCHIP_RSTon() sbi(W5100_RST_PORT, W5100_RST_BIT)

//-----------------------------------------------------------------------------




EFM32를 이용하여 TCP/IP 전송율 테스트 결과 1.4Mbps 이다. EFM32 의 최대 SPI 클럭속도가 1.4Mhz인 것을 생각하면 그리 빠르지는 않은듯...

저전력 웹서버 만들면 좋을것 같다.


Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2013. 4. 27. 23:30

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

 

 

 

adStar 도 CANTUS 와 같이 외부 메모리 제어 모드가 있다.  외부 메모리를 연결할 수 있고,  특히 W5100과 같이 고속 이더넷이 필요할 때 사용하면 편리하다. [adStar TFT-EX] 보드에는 메모리 방식의 W5100을 연결할 수 있는 커넥터가 있기 때문에 이를 테스트 해 보았다.

 

메모리 제어 기능은 PORT3, PORT4에서 설정할 수 있다.

 

 

 

adStar의 CS0 할당 번지는 0x5000 0000 이다.

기존 CANTUS 와 약간의 차이가 있는것은 메모리 번지와 제어 레지스터 번지이다. 나름의 이유가 있었겠지만 기존 코드와 호환성을 유지하기 위해 동일하게 했으면 하는 생각이 든다.

 

 

 

 

asStar W5100 초기화 코드

 

void W5100_IO_INIT()
{
 *(volatile U16*)0x80000800 = BIT10; //BANK 0 8Bit

 *R_PAF3 = 0; //SRAM interface address, data
 Cbi(*R_PAF4, GP_CFG(1) | GP_CFG(3)| GP_CFG(4)| GP_CFG(5));// nCS, nWE, nRE, ALE  

 

 

 

asStar W5100 메모리 제어 방식(INDIRECT)을 이용한 TCP/IP 전송 속도 테스트

회로적으로 간단하게 테스트 하기위해 INDIRECT방식을 이용했는데도 6Mbps 이상 나오고 있는데 DIRECT모드를 이용하면 더 빠를 수 있을것 같다. 

 

 

 

Posted by nexp

댓글을 달아 주세요