W5200 sn_tx_wr 레지스터 문의 드립니다


#1

sn_tx_wr 레지스터 문의 드립니다.


#2

W5200의 Sn_TX_WR 과 같은 Pointer Regsiter들은 16bit 값을 사용합니다. 할당된 메모리 크기가 무관합니다.
할당된 Memory의 접근은 Driver code를 참조하시면 아시겠지만,

실제 메모리 주소 = (Sn_TX_WR & (메모리크기에 따른 마스크))+ (BASE ADDRESS)
에 의해 계산되어집니다. Sn_RX_RD 역시 동일한 방법으로 계산됩니다.
w5200.c driver code를 참조하세요.

[code]void write_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len)
{
uint16 size;
uint16 dst_mask;
uint8 * dst_ptr;

dst_mask = (uint32)dst & getIINCHIP_TxMASK(s);
dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s) + dst_mask);

if (dst_mask + len > getIINCHIP_TxMAX(s)) 
{
	size = getIINCHIP_TxMAX(s) - dst_mask;
	wiz_write_buf((uint32)dst_ptr, (uint8*)src, size);
	src += size;
	size = len - size;
	dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s));
	wiz_write_buf((uint32)dst_ptr, (uint8*)src, size);
} 
else
{
	wiz_write_buf((uint32)dst_ptr, (uint8*)src, len);
}

}[/code]

[code]void read_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len)
{
uint16 size;
uint16 src_mask;
uint8 * src_ptr;

src_mask = (uint32)src & getIINCHIP_RxMASK(s);
src_ptr = (uint8 *)(getIINCHIP_RxBASE(s) + src_mask);

if( (src_mask + len) > getIINCHIP_RxMAX(s) ) 
{
	size = getIINCHIP_RxMAX(s) - src_mask;
	wiz_read_buf((uint32)src_ptr, (uint8*)dst,size);
	dst += size;
	size = len - size;
	src_ptr = (uint8 *)(getIINCHIP_RxBASE(s));
	wiz_read_buf((uint32)src_ptr, (uint8*) dst,size);
} 
else
{
	wiz_read_buf((uint32)src_ptr, (uint8*) dst,len);
}

}
[/code]