1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25

Ethernet MAC контроллера Atmel

04.04.2016, 09:27. Показов 1621. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Использую ATSAM3x8e совместно с трансивером DP83848i. Автосогласование проходит на ура. Потом начинается прием пакета в настроенные буфферы.Прерывание срабатывает по биту Buffer Not Available.Якобы буфер уже использовался,и туда ничего нельзя запихнуть.Хотя при посмотре буфферов в онлайн режиме они заполняются. Пробывал и очищать буфферы и расширять!Все равно прилетает этот бит.Что за чудо?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2016, 09:27
Ответы с готовыми решениями:

Atmel Studio 6. Как добавить поддержку нового контроллера Atmega8515?
Доброго времени суток. Подскажите. Atmel Studio 6. Как добавить поддержку нового контроллера Atmega8515? В списке его нет, при...

Старт изучения контроллера ethernet (W5100)
Требуется ответ от специалистов, имевших дело с контроллером Wyznet W5100. Для реализации задуманного проекта требуется наличие...

плата контроллера PIC32 с TFT, USB, ethernet и проч.
Продолжая тему форума <a ctoss="postlink-local"...

12
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.04.2016, 10:17
какая SDK, какой код инициализаци, прерывание чего (Atmel или DP83...?). Примеры работают?
0
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
04.04.2016, 10:52  [ТС]
Visua Studio 2005,не мой выбор пред товарищ ваял на нем)Код инит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
bool ModbusTCP::InitEMAC()
{   
    using namespace HW;
 
    u32 regv,tout,id1,id2;
    u32 id3;
    u32 value;
    u32 phy_anar;
    u32 phy_analpar;
    u32 retry_count;
    u32 value1;
    u32 stat1;
    u32 stat2;
        u32 i;
    using namespace HW;
 
    HW::EMAC->NCR     = 0;
    HW::EMAC->IDR     = ~0;
 
 
    RxBufIndex = 0;
 
    for (i = 0; i < NUM_RX_BUF; i++)//NUM_RX_BUF расширял до 128,сейчас 16
    {       
        //Rx_Desc[i].addr =(((u32)&rx_buf[i]) ) & 0xFFFFFFFC ;
        Rx_Desc[i].addr = ((u32)(&(rx1[i *128]))) & 0xFFFFFFFC;
        Rx_Desc[i].stat = 0;
    }
    //rx_buf[0][0] = 17;
    /* Set the WRAP bit at the end of the list descriptor. */
    Rx_Desc[NUM_RX_BUF-1].addr |= 0x02;
    /* Set Rx Queue pointer to descriptor list. */
 
    HW::EMAC->RBQP = ((u32)&Rx_Desc[0]); 
 
    
    tx_descr_init ();   
 
    HW::EMAC->SA[0].B =( ((unsigned int)MacAddress[3] << 24)
                         | ((unsigned int)MacAddress[2] << 16)
                         | ((unsigned int)MacAddress[1] << 8 )
                         |                MacAddress[0]      );
    HW::EMAC->SA[0].T =( ((unsigned int)MacAddress[5] << 8 )
                         |                MacAddress[4]      );
 
 
 
    HW::EMAC->NCR    |= EMAC_CLRSTAT;
    HW::EMAC->RSR    |= EMAC_OVR | EMAC_REC | EMAC_BNA;
    HW::EMAC->TSR    |= EMAC_UBR | EMAC_COL  | EMAC_RLES
                       |EMAC_BEX | EMAC_COMP | EMAC_UND;
    HW::EMAC->ISR;
    HW::EMAC->NCFGR  |= EMAC_DRFCS | EMAC_PAE | EMAC_CAF;
    HW::EMAC->NCR |= EMAC_TE;
    HW::EMAC->NCR |= EMAC_RE;
    HW::EMAC->NCR |= EMAC_WESTAT;
 
    HW::EMAC->IER     = EMAC_RXUBR | /* Enable receive used bit read interrupt. */
                        EMAC_TUND  | /* Enable transmit underrun interrupt. */
                        EMAC_RLE   | /* Enable retry limit  exceeded interrupt. */
                        EMAC_TXERR | /* Enable transmit buffers exhausted in mid-frame interrupt. */
                        EMAC_TCOMP | /* Enable transmit complete interrupt. */
                        EMAC_RCOMP;// |
                        EMAC_ROVR  | /* Enable receive overrun interrupt. */
                        EMAC_HRESP | /* Enable Hresp not OK interrupt. */
                        EMAC_PFR   | /* Enable pause frame received interrupt. */
                        EMAC_PTZ;   /* Enable pause time zero interrupt. */
 
 
 
    int_enable_eth();//enable interrupt
    //HW::EMAC->NCR  |= EMAC_LB | EMAC_LLB;
        
    HW::EMAC->ISR;
    
 
    /* Enable receiving of all Multicast packets. */
    //HW::EMAC->HRB  = 0xFFFFFFFF;
    //HW::EMAC->HRT  = 0xFFFFFFFF;
 
    //start new settings for dp838.....
    
    //emac_set_clock(pemac,mck);
    //HW::EMAC->NCFGR |=EMAC_CLK_HCLK_16;
    
    /*инициализацию и автосогласование выполняется*/
    EnableMDI();
 
    id1 = ReadPHY(PHY_REG_IDR1);
    id2 = ReadPHY(PHY_REG_IDR2);
    
    if (((id1 << 16) | (id2 & 0xfff0)) == DP83848C_ID)
    {
    };
    
    WritePHY(PHY_REG_BMCR, BMCR_RESET);
    
        /* Wait for hardware reset to end. */
    for (tout = 0; tout < 0x800000; tout++)
    {
        if(tout < 20000)
        {
            ;
        }
        else
        {
        
            if (!(ReadPHY(PHY_REG_BMCR) & BMCR_RESET))
            {
                break; /* Reset complete */
            }
        }
    };
 
    DisableMDI();
 
    EnableMDI();
 
    value = ReadPHY(PHY_REG_BMCR);
    
    value &= ~BMCR_ANENABLE;
    value &= ~(BMCR_LOOPBACK | BMCR_PDOWN);
    value |= BMCR_ISOLATE;
    WritePHY(PHY_REG_BMCR,value);
    value = ReadPHY(PHY_REG_BMCR);
 
    phy_anar = ANAR_CSMA | ANAR_10HALF | ANAR_10FULL | ANAR_100HALF | ANAR_100FULL;
    WritePHY(PHY_REG_ANAR,phy_anar);
 
    value |=BMCR_SPEED100 | BMCR_FULLDPLX | BMCR_ANENABLE;
    WritePHY(PHY_REG_BMCR,value);
 
    value |=BMCR_ANRESTART;
    value &=~BMCR_ISOLATE;
    WritePHY(PHY_REG_BMCR, value);
 
    while(1)
    {
    value1 = ReadPHY(PHY_REG_BMSR);
    if(value1 & BMSR_ANEGCOMPLETE)
    {
        //value &=~BMCR_ANENABLE;
        //WritePHY(PHY_REG_BMCR,value);
        break;
    }
    }
    phy_analpar = ReadPHY(PHY_REG_ANLPAR);
 
    if((phy_anar & phy_analpar) & ANLPAR_100FULL)
    {
        HW::EMAC->NCFGR |= EMAC_SPD;
        HW::EMAC->NCFGR |= EMAC_FD;
    }
    if((phy_anar & phy_analpar) & ANLPAR_10FULL)
        HW::EMAC->NCFGR |= EMAC_FD; 
    if((phy_anar & phy_analpar) & ANLPAR_100HALF)
        HW::EMAC->NCFGR |= EMAC_SPD;
    if((phy_anar & phy_analpar) & ANLPAR_10HALF)
        ;
    HW::EMAC->USRIO |= EMAC_CLKEN | EMAC_RMII;
 
    id3 = ReadPHY(PHY_REG_BMSR);
    DisableMDI();
 
    
}
Аналогично скатал с примера в атмеле.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.04.2016, 12:19
а как объявлены Rx_Desc и rx1 в программе? есть подозрение - они тоже должны быть объявлены статически выравнены по 32бита.
0
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
04.04.2016, 15:37  [ТС]
C++
1
2
volatile u8 rx1[16*128]
static Buf_Desc Rx_Desc[NUM_RX_BUF]
При этом:
C++
1
2
3
4
5
6
#defiene NUM_RX_BUF  16
 
typedef struct{
    u32 addr;
    u32 stat;
}Buf_Desc
Добавлено через 2 часа 4 минуты
пробывал
C++
1
volatile u8 rx1[16*128]
поменять на
C++
1
static u8 rx1[16*128]
ничего не поменялось(
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.04.2016, 16:39
обеспечьте
Цитата Сообщение от Voland_ Посмотреть сообщение
должны быть объявлены статически выравнены по 32бита
это делается либо директивой компилятора ( нужно читать как это возможно, везде по-разному ), либо нужно учесть выравнивание внутри архива и вычислить начало нового 32битного слова внутри этого массива. Смещение будет от 0 до 3 байт.
1
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
04.04.2016, 16:53  [ТС]
спасибо за подсказку буду пробывать).Вроде
C++
1
Rx_Desc[i].addr = ((u32)(&(rx1[i *128]))) & 0xFFFFFFFC;
это и есть выравнивание.Или помимо этого.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.04.2016, 19:47
Цитата Сообщение от mus_zzz Посмотреть сообщение
HW::EMAC->RBQP = ((u32)&Rx_Desc[0]);
<== вот здесь не выравнивается.
во-вторых, если не выровнен rx1, то по приходу данных может затереться что-то совсем другое.

ЗЫ: такие ошибки надо сразу исключать. Потому что в зависимости от конфигурации глобальных переменных у вас может сложиться ситуация, когда эти переменные таки выравняются сами собой (просто совпадет), и все будет прекрасно работать. Но при самом (казалось бы) незначительном изменении конфигурации все может резко поломаться снова.
0
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
05.04.2016, 09:37  [ТС]
По поводу
C++
1
HW::EMAC->RBQP = ((u32)&Rx_Desc[0]);
проверил,адреса дескрипторов выровнены,проверял Кейлом. Остался открытый вопрос с прерыванием по биту BNA. Делаю следующим образом запускаю железо и подсоединяю ethernet кабель к ноуту. Срабатывает прерывание по этому биту. Данные в буффере присутствуют. Не пойму почему не прилетает бит REC(то что запись произведена).Про условия возникновения бита BNA в даташите очень мало и не понятны пути избавления от них.Или я что-то упустил?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.04.2016, 11:33
Цитата Сообщение от mus_zzz Посмотреть сообщение
Не пойму почему не прилетает бит REC
возможно не включен, возможно вы не там его ищете. Иногда сложная периферия (такая как Ethernet, по сути это ж отдельный контроллер) имеет несколько векторов прерываний, которые управляются по отдельности.
0
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
05.04.2016, 11:45  [ТС]
Прерывания настроены..Уже не знаю что делать...Все равно спасибо за помощь)а не подскажите где можно приобрести отладочные платы на базе Atmel желательно с Ethernet. Заранее благодарен.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.04.2016, 12:06
Цитата Сообщение от mus_zzz Посмотреть сообщение
на базе Atmel желательно с Ethernet.
например у Atmel? ))

ЗЫ: все ж зависит откуда вы, и что вы можете себе позволить...

Но если предположить "локацию по умолчанию", то вот, например. [Не реклама, если что. Просто на заре еще TI Stellaris я брал у этих товарищей. У них же купил другую плату по-мощнее].
0
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 25
05.04.2016, 12:30  [ТС]
спасибо)буду думать))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2016, 12:30
Помогаю со студенческими работами здесь

Драйвер для Ethernet контроллера на MacBook
Здравствуйте!.. Помогите разобраться, пожалуйста... Не могу найти драйвер для Ethernet-контроллера на MacBook под Windows 7. Диспетчер...

драйвер Ethernet-контроллера для ноутбука ASUS A52JT
Подскажите где найти драйвер Ethernet-контроллера для ноутбука ASUS A52JT

Слетает драйвер Ethernet контроллера и проблемы с установкой Windows 7
1. Чуть больше недели назад слетел драйвер сетевого контроллера, винда не может выполнить его обновление или установку самостоятельно,...

Открыть Ethernet port для дальнейшей передачи данных с контроллера на ПК
Здравствуйте! Подскажите пожалуйста как открыть Ethernet port для дальнейшей передачи данных с контроллера на ПК? Это делать как через...

Получить MAC адрес Ethernet адаптера
Мне надо получить мас адрес встроенный еthernet адаптера. Я постарался сделать это через этот код: try { String mmm =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru