[W5300] 데이터 깨짐 현상

안녕하세요 현재 Cortex-M 계열로 W5300을 사용하여 Ethernet 통신을 하고 있습니다
다름이 아니라 MCU에서 데이터를 전송 시 수신 받는 쪽에서 데이터가 깨지는 현상이 발생하고 있습니다
아래의 코드에서 delay를 10us 미만으로 설정을 할 경우 데이터 전송 시 무조건 깨지는 현상이 발생하고
10us 일 때는 간간히 깨지는 현상이 있습니다. 10MB 속도로 통신을 해야 되는데…데이터가 깨져서 사용 할 수 없게 되고 있습니다
주석 처리 한 방법을 사용해도 똑같고, 주석을 처리하지 않은 방법을 사용해도 똑같이 깨집니다…

void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
{
uint32_t i = 0;
if(len == 0) return;
for(i = 0; i < len; i+= 2)
{
WIZCHIP_WRITE(Sn_TX_FIFOR(sn), ((((uint16_t)wizdata[i]) << 8) + wizdata[i+1]));
//WIZCHIP_WRITE(sn, (((uint16_t)wizdata[i]) << 8) | (((uint16_t)wizdata[i+1]) & 0x00FF))
//delay_us(10);
}
}

그리고 데이터 수신 시에는 처음 몇자리가 깨지는 현상이 있습니다
2byte 정도?? 깨지는데…

void wiz_recv_data(uint8_t op, uint8_t sn, uint8_t *wizdata, uint32_t len)
{
uint32_t rd = 0;
uint32_t i = 0;
uint8_t tmp = 0;
if(len == 0 )
return;
for(i = 0; i < len; i += 2)
{

	*((uint16_t *)(wizdata + i)) = getSn_RX_FIFOR(op, sn);
	tmp = wizdata[i];
	wizdata[i] = wizdata[i + 1];
	wizdata[i + 1] = tmp;
	//delay_us(1);
}

}

어떻게 해결을 해야 할지…
자문 부탁드리겠습니다

안녕하세요

우선 이부분이
WIZCHIP_WRITE(Sn_TX_FIFOR(sn), (((uint16_t)wizdata[i]) << 8) | (((uint16_t)wizdata[i+1]) & 0x00FF))
인데 실수하신거 같은데 수정하시기 바랍니다.

recv data부분도 ioLibrary에 따라 수정하시기 바랍니다.

void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
{
   uint16_t rd = 0;
   uint32_t i = 0;
   
   if(len == 0) return;
      
   for(i = 0; i < len; i++)
   {
      if((i & 0x01)==0)
      {
         rd = getSn_RX_FIFOR(sn);
         wizdata[i]   = (uint8_t)(rd >> 8);
      }
      else  wizdata[i] = (uint8_t)rd;  // For checking the memory access violation
   }
   //sock_remained_byte[sn] = (uint8_t)rd; // back up the remaind fifo byte.
}

추가로 데이터 깨짐은 하드웨어 문제일 수도 있습니다. 하드웨어는 어떻게 사용중이신가요?

STM32F7 시리즈로 FMC(SRAM Controller) 통신 10bit address, 16bit data bus로 bank1 select 2와 bank1 select 3 두 개를 사용하고 , W5300은 wiz830mj 제품 2개로 하나는 server, 하나는 client로 사용하고 있습니다

TCP 수신은 Align Mode(즉 짝수바이트 송수신만 허용)를 사용하지 않을 경우,
Header 2byte가 수신데이타에 앞에 붙습니다.
해당부분 처리가 되지 않아 잘못된 데이타를 수신하는 것 같습니다.

Datasheet와 ioLibrary 코드를 참고하세요.

홀수 데이터가 수신이 되어서 Align Mode를 하지 않은 상태입니다. 그리고 전송 데이터를 보내더라도 완전 깨져서 전송이 됩니다
Align Mode를 하지 않으면 전송에 문제가 되는지 궁금합니다

Align Mode를 사용하지 않는 경우,
TCP Packet 마다 2byte의 Header (Data 크기)가 앞에 붙어 올라 옵니다.

ioLibrary를 사용하고 계신지 자작한 Driver를 사용하시는지 먼저 알려주시고,
ioLibrary를 사용함에도 불구하고 데이타가 깨진다면, Host I/F Time과 Critical Section등을 제대로 구현했는지 확인 해야 합니다.
특히 칩 두개를 사용하신다고 하셨고, FIFOR access 중간에 다른 칩 Register이든 같은 칩의 Register등을 Access해서는 안됩니다.
즉 FIFO을 읽어들이는 경우 간섭이 발생하지 않도록 주의 하셔야 합니다.

Cortex-M7 급이면 Host I/F Access Time이 문제가 될 수 있습니다.
tCSn Time이 28ns 이상이야 합니다. 즉 CSn와 CSn 사이에 28ns이상 딜레이가 있어야 합니다.
스코프로 간격을 확인바랍니다.