реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по алгоритму отправки пакета UDP в W5100
DSIoffe
сообщение Feb 15 2010, 12:05
Сообщение #1


Дима
*****

Группа: Свой
Сообщений: 1 683
Регистрация: 15-12-04
Из: Санкт-Петербург
Пользователь №: 1 486



Здравствуйте все!
При отправке пакета UDP через W5100 в datasheet предлагают сделать следующее (упоминаю только то, о чём хочу спросить):
1.Прочитать указатель передающего буфера Sn_TX_WR.
2.Сделать из него физический адрес для буферной памяти W5100.
3.Отправить send_size байтов данных в буферную память.
4.Записать в Sn_TX_WR новое число, равное сумме его исходного (прочитанного) значения и размера блока передаваемых данных send_size.
5.Передать в W5100 команду Send.
Если при передаче блока данных в W5100 не переполнится адресный счётчик, то вопросов нет.
Если же он переполнится, то в datasheet велят его обнулить и продолжать запись данных в W5100 с базового адреса буфера передатчика. Это тоже понятно. А вот что записывать после этого в Sn_TX_WR? В псевдокоде из datasheet написано Sn_TX_WR += send_size, то есть если делать это в лоб, то в Sn_TX_WR окажется число, превышающее максимально допустимый адрес. Я подозреваю, что надо просто записать туда последнее значение адресного счётчика. Или как?
Осознать тексты драйвера для AVR я не могу, не настолько знаю C.
Заранее признателен.


--------------------
© CОПЫРИГХТ: Дмитрий Иоффе, Советский Союз.
Приглашаю посмотреть: http://muradowa.spb.ru/ и http://www.drtata.narod.ru/index.html
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 15 2010, 18:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Исходники от визнета, мы их использовали.
Код
void send_data_processing(SOCKET s, uint8 *data, uint16 len)
{
    uint16 ptr;
    ptr = IINCHIP_READ(Sn_TX_WR0(s));
    ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_TX_WR0(s) + 1);
    write_data(s, data, (uint8 *)(ptr), len);
    ptr += len;
    IINCHIP_WRITE(Sn_TX_WR0(s),(uint8)((ptr & 0xff00) >> 8));
    IINCHIP_WRITE((Sn_TX_WR0(s) + 1),(uint8)(ptr & 0x00ff));
}


ptr+=len; просто складывается.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 15 2010, 19:57
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(DSIoffe @ Feb 15 2010, 14:05) *
1.Прочитать указатель передающего буфера Sn_TX_WR.
2.Сделать из него физический адрес для буферной памяти W5100.
...
то есть если делать это в лоб, то в Sn_TX_WR окажется число, превышающее максимально допустимый адрес. Я подозреваю, что надо просто записать туда последнее значение адресного счётчика. Или как?
Или как. W5100 тоже сделает из этого указателя адрес.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
DSIoffe
сообщение Feb 17 2010, 08:25
Сообщение #4


Дима
*****

Группа: Свой
Сообщений: 1 683
Регистрация: 15-12-04
Из: Санкт-Петербург
Пользователь №: 1 486



Ага. Спасибо большое.


--------------------
© CОПЫРИГХТ: Дмитрий Иоффе, Советский Союз.
Приглашаю посмотреть: http://muradowa.spb.ru/ и http://www.drtata.narod.ru/index.html
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016