Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
mus_zzz
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 19
#1

Ethernet MAC контроллера Atmel - Микроконтроллер

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

Добрый день! Использую ATSAM3x8e совместно с трансивером DP83848i. Автосогласование проходит на ура. Потом начинается прием пакета в настроенные буфферы.Прерывание срабатывает по биту Buffer Not Available.Якобы буфер уже использовался,и туда ничего нельзя запихнуть.Хотя при посмотре буфферов в онлайн режиме они заполняются. Пробывал и очищать буфферы и расширять!Все равно прилетает этот бит.Что за чудо?
http://www.cyberforum.ru/avr/thread2035078.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2016, 09:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ethernet MAC контроллера Atmel (Микроконтроллер):

Atmel Sudio 6
Написал простенькую програму(мигание светодиодом, mega16), хотел запустить...

Atmel AVR
друзья, не подскажите возможно ли с помощью программного кода спалить...

Atmel mega8u2
Подскажите я снес прошивку с atmel mega8u2 просто нет опыта с этими...

Atmel studio 6.1
Здравствуйте. столкнулся с проблемой запуска программы. вылетает...

сэмплы Atmel
хочу попытаться заказать у атмела сэмплы у кого есть такой опыт

12
Voland_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,253
04.04.2016, 10:17 #2
какая SDK, какой код инициализаци, прерывание чего (Atmel или DP83...?). Примеры работают?
0
mus_zzz
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 19
04.04.2016, 10:52  [ТС] #3
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_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,253
04.04.2016, 12:19 #4
а как объявлены Rx_Desc и rx1 в программе? есть подозрение - они тоже должны быть объявлены статически выравнены по 32бита.
0
mus_zzz
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 19
04.04.2016, 15:37  [ТС] #5
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_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,253
04.04.2016, 16:39 #6
обеспечьте
Цитата Сообщение от Voland_ Посмотреть сообщение
должны быть объявлены статически выравнены по 32бита
это делается либо директивой компилятора ( нужно читать как это возможно, везде по-разному ), либо нужно учесть выравнивание внутри архива и вычислить начало нового 32битного слова внутри этого массива. Смещение будет от 0 до 3 байт.
1
mus_zzz
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 19
04.04.2016, 16:53  [ТС] #7
спасибо за подсказку буду пробывать).Вроде
C++
1
Rx_Desc[i].addr = ((u32)(&(rx1[i *128]))) & 0xFFFFFFFC;
это и есть выравнивание.Или помимо этого.
0
Voland_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,253
04.04.2016, 19:47 #8
Цитата Сообщение от mus_zzz Посмотреть сообщение
HW::EMAC->RBQP = ((u32)&Rx_Desc[0]);
<== вот здесь не выравнивается.
во-вторых, если не выровнен rx1, то по приходу данных может затереться что-то совсем другое.

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

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

Но если предположить "локацию по умолчанию", то вот, например. [Не реклама, если что. Просто на заре еще TI Stellaris я брал у этих товарищей. У них же купил другую плату по-мощнее].
0
mus_zzz
1 / 1 / 0
Регистрация: 29.11.2015
Сообщений: 19
05.04.2016, 12:30  [ТС] #13
спасибо)буду думать))
0
05.04.2016, 12:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 12:30
Привет! Вот еще темы с решениями:

ATtiny2313 - Atmel
Здравствуйте. Подскажите пожалуйста, можно ли как-нибудь проверять работу...

Atmel Atmega16
Здравствуйте, у меня курсовая, я сделал все(блок схему, схему в пикаде,...

Atmel Studio
помогите написать программу работы светофора на языке Assembler

Atmel Studio 6.0
Здравствуйте! Подскажите пожалуйста , не пойму почему при запуске программы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru