sn_tx_wr 레지스터 문의 드립니다.
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]