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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Прием передача по USARTу
Timofey
сообщение Jul 12 2006, 14:25
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(SpiritDance @ Jul 12 2006, 20:00) *
Во превых не видно что это за USART_INTERRUPT_LEVEL, это должен быть приоритет прерывания, чем больше тем выше


У меня он для US0 равен 6 а для US1 7, это я вычитал в инструкции, правильно? Или тут можно самому раставлять?


Цитата(SpiritDance @ Jul 12 2006, 20:00) *
Во вторых внутренняя преферия может конфигурироватся только как EDGE_TRIGGERED и LEVEL_SENSITIVE, остальные конфигурации бессмысленны.

А я ставлю обычный AT91C_AIC_PRIOR_LOWEST. На что это влияет?


Цитата(SpiritDance @ Jul 12 2006, 20:00) *
beer_warrior
а ваш обработчик и вправду работает? Судя по всему под IAR.
Никак не пойму чем он отличается от обычной функции и как из него выход организуется?
И как вы обходитесь без записи чего-либо в EIOCR? Я тут забыл как-то про него, очень долго голова болела почему прерывание один раз только вызывается. smile.gif


Без EIOCR у меня программа из прерывания вобще не выходила ... Так что пока не стал обнулять - никак .... Может это изза того что использую AT91C_AIC_PRIOR_LOWEST?
И еще, у меня такой вопрос, я использую PDA для отправки по US0. А сегодня решил это же использовать для работы с SPI, у меня начались какие то глюки ... Может так нельзя? И в SPI нужно сейчас только побайтно?
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jul 12 2006, 14:42
Сообщение #17


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Timofey
Вдумчиво прочитайте даташит. Раздел AIC, вопросы должны ответится. smile.gif

Начет SPI пока ничего немогу сказать, сам до конца еще не разобрался. Оно вроде работает, причем как надо, но вот микруха к нему приделанная у меня, что-то очень оригинально программируется.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jul 12 2006, 15:03
Сообщение #18


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Сам посмотрел еше раз. Для внутренней переферии в принципе одинаково High level или Level Sensetive.
Прошу прощения.

Да что-то трудный этот SAM. С разбегу разбиратся не получается. Хотя все равно больше чем philips нравиться smile.gif.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 12 2006, 15:15
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
а ваш обработчик и вправду работает? Судя по всему под IAR.
Никак не пойму чем он отличается от обычной функции и как из него выход организуется?
И как вы обходитесь без записи чего-либо в EIOCR? Я тут забыл как-то про него, очень долго голова болела почему прерывание один раз только вызывается.

Нет я сторонник gcc, проcто есть такая неявная фича в Cstartup.S smile.gif
Код
//*------------------------------------------------------------------------------
//*- Function             : IRQ_Handler_Entry
//*- Treatments           : IRQ Controller Interrupt Handler.
//*- Called Functions     : AIC_IVR[interrupt]
//*------------------------------------------------------------------------------*/
        .global IRQ_Handler_Entry
        .func   IRQ_Handler_Entry

IRQ_Handler_Entry:

/*- Manage Exception Entry  */
/*- Adjust and save LR_irq in IRQ stack  */
            sub         lr, lr, #4
            stmfd       sp!, {lr}

/*- Save SPSR need to be saved for nested interrupt */
            mrs         r14, SPSR
            stmfd       sp!, {r14}

/*- Save and r0 in IRQ stack  */
            stmfd       sp!, {r0}

/*- Write in the IVR to support Protect Mode  */
/*- No effect in Normal Mode  */
/*- De-assert the NIRQ and clear the source in Protect Mode */
        ldr         r14, =AT91C_BASE_AIC
        ldr         r0 , [r14, #AIC_IVR]
        str         r14, [r14, #AIC_IVR]

/*- Enable Interrupt and Switch in Supervisor Mode */
            msr         CPSR_c, #ARM_MODE_SVC

/*- Save scratch/used registers and LR in User Stack */
            stmfd       sp!, { r1-r3, r12, r14}

/*- Branch to the routine pointed by the AIC_IVR  */
            mov         r14, pc
            bx          r0
/*- Restore scratch/used registers and LR from User Stack*/
            ldmia       sp!, { r1-r3, r12, r14}

/*- Disable Interrupt and switch back in IRQ mode */
            msr         CPSR_c, #I_BIT | ARM_MODE_IRQ
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*- Mark the End of Interrupt on the AIC */
           ldr         r14, =AT91C_BASE_AIC
            str         r14, [r14, #AIC_EOICR]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

/*- Restore SPSR_irq and r0 from IRQ stack */
            ldmia       sp!, {r0}

/*- Restore SPSR_irq and r0 from IRQ stack */
            ldmia       sp!, {r14}
            msr         SPSR_cxsf, r14

/*- Restore adjusted  LR_irq from IRQ stack directly in the PC */
            ldmia       sp!, {pc}^
    
        .size   IRQ_Handler_Entry, . - IRQ_Handler_Entry
        .endfunc

Чтобы окончательно закрыть вопрос привожу init
Код
void InitUSART(AT91S_USART *pUSART, DWORD imode, DWORD baudrate)
{
//--------------------------------------------------------------------------
//clear all
//--------------------------------------------------------------------------
pUSART->US_CR =    AT91C_US_RSTRX    |            // Reset Receiver
                AT91C_US_RSTTX    |            // Reset Transmitterp
                AT91C_US_RXDIS    |            // Receiver Disable
                AT91C_US_TXDIS;            // Transmitter Disable
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTDIS |AT91C_PDC_TXTDIS; //PDC off
AT91C_BASE_US1->US_TCR = 0;
AT91C_BASE_US1->US_RCR = 0;
//--------------------------------------------------------------------------
//configure interrupt
//--------------------------------------------------------------------------
AT91F_AIC_ConfigureIt    (AT91C_BASE_AIC,             //base adr
                        AT91C_ID_US1,                //int number
                        AT91C_AIC_PRIOR_HIGHEST - 1,//priority
                        //AT91C_AIC_PRIOR_HIGHEST,    //priority
                        3,                            //int source type
                        USARTInterrupt                //handler
                        );            
//--------------------------------------------------------------------------                        
//USART on
//--------------------------------------------------------------------------
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1 << AT91C_ID_US1));
//--------------------------------------------------------------------------
//configure interrupt
//--------------------------------------------------------------------------
pUSART->US_IDR = 0xFFFFFFFF;
pUSART->US_IER = imode;
//--------------------------------------------------------------------------
//set baudrate
//--------------------------------------------------------------------------
AT91F_US_SetBaudrate(pUSART,48054857,baudrate);
//--------------------------------------------------------------------------
//set  timeouts
//--------------------------------------------------------------------------
pUSART->US_TTGR = 20;
pUSART->US_RTOR = 200;
//--------------------------------------------------------------------------
//set mode
//--------------------------------------------------------------------------
pUSART->US_MR = AT91C_US_USMODE_NORMAL    |    // Normal Mode
                AT91C_US_CLKS_CLOCK       |    // Clock = MCK
                AT91C_US_CHRL_8_BITS       |    // 8-bit Data
                AT91C_US_PAR_NONE        |    // No Parity
                AT91C_US_NBSTOP_2_BIT;        // 1 Stop Bit
//--------------------------------------------------------------------------
//Init DMA
//--------------------------------------------------------------------------
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTDIS;
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_TXTDIS;
//active buffer (start from buf 0)
act_buf = 0;                            
//first RX buffer
pUSART->US_RPR = (DWORD)&rx_buf[0];    //set pointer as register value
pUSART->US_RCR = sizeof(BUF);        //base buffer size
// enable the RX and TX PDC transfer requests
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTEN;
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_TXTEN;
//--------------------------------------------------------------------------
//enable device
//--------------------------------------------------------------------------
pUSART->US_CR =    AT91C_US_RXEN | AT91C_US_TXEN;            
//--------------------------------------------------------------------------
//enable interrupt
//--------------------------------------------------------------------------
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
}

BUF объявлен typedefом как массив заданной размерности.
rx_buf как массив из двух BUF


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 13 2006, 03:04
Сообщение #20





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



а можете поделиться ссылочками на доки по USARTу? чтоб подробненько и четко было все написано. А то, если честно, не все понимаю о чем ведется речь wacko.gif
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 13 2006, 05:34
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
а можете поделиться ссылочками на доки по USARTу? чтоб подробненько и четко было все написано. А то, если честно, не все понимаю о чем ведется речь

Пользовался только даташитом, разделы AIC, PDC, USART. А также описанием ядра ARM и руководством по gcc. Насколько я знаю подробной доки, типа аппликэйшенов для AVR в природе не существует.Разберите подробно исходник - все станет ясно.
PS Свежим взглядом, обнаружил в Init несколько мелких ошибок - нессоответсвие комментов константам, явно заданные указатели вместо параметров.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 13 2006, 19:20
Сообщение #22





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



Для начала всем огромное спасибо, по крайней мере передачу байтов организовал smile.gif

Но вот такая штука, на самом деле думаю не совсем в тему, но все же... рассказываю обстановку.
Есть комп, есть ноут, на обоих стоит IAR. Компилю и прогаю ARM с компа, прога кидает в ком порт последовательность чисел, ловлю их через ComTest - всё отлично. Компилю, запускаю все тоже самое на ноуте - принимаю абракадабру. В последствии, выясняю, что com порт на ноуте глючит, т.е соединяю com ноута с com компа, запускаю на обоих ComTest, с компа посылаю байты, на ноут приходит ерунда, посылаю с ноута, на комп приходит всё норм (недлю назад, все работало) smile.gif тогда соединил com порт платы c com компа, компилю с ноута, запускаю - .... на комп приходит опять абракадара!!! объясните пожайдуста в чем заключается мистика??? я уже ничего не понимаю smile.gif менял j-link, usb кабель, перустанавливал IAR, менял дрова на j-link smile.gif)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 13 2006, 20:02
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Zarya, проверьте, привильно ли установлена четность: на SAM'ах AT91C_US_PAR = 0 - это even parity.
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 18 2006, 10:58
Сообщение #24





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



Еще один вопрос назрел smile.gif
Принимаю данные вот так:
Код
void AT91F_US_Get(void) {
  int d[10];
  memset(d, 0, sizeof(d));
  int j = 0;
  while(1) {
    while (!AT91F_US_RxReady(COM0));
    d[j] = AT91F_US_GetChar(COM0);
        if (d[j] == 0x4B || j > 10) break;
        else j++;
  }
  d[++j] = 0;
  AT91F_US_Put((char*)&d);
}

по поводу кода не ругайтесь, ибо он кривой, я и сам знаю, просто от безисходности начал уже извращаться smile.gif
суть следущая, хочу получить строчку из 10 байт или если меньше байт, но со "стоповым" байтом ,например, здесь символ "К" с кодом 0x4B. посылаю на USART все через туже прогу ComTest допустим байт 0x40 20 раз (по идее 10 должно прийти и отправиться назад, остальные проигнориться)... но как оказывается даже из 20 не все доходят! Во время дебага заметил, что как только кликаю в ComTest'e на отправить, US_RHR сразу принимает значение байта, который пришел на USART, заменяя старое. Так вот у меня предположение, что просто ARM как бы не успевает принимать каждый пришедший байт, хотя могу и ошибаться. Объясните пожалуйста, что я не так понял, и как сделать по-правильному smile.gif А еще, разве нет какого-нить буфера, куда будут скапливаться приходящие байты? Вобщем, еще было бы хорошо если б объяснили, как происходит прием байтов в асинхронном режиме (т.е в каком порядке какие флаги в каких регистрах ставятся и снимаются... куда байты потом деваются... ну и тд smile.gif ), раньше думал, что я это понимаю... теперь вот засомневался. glare.gif

P.S.
Код
__inline int AT91F_US_GetChar (
    const AT91PS_USART pUSART)
{
    return((pUSART->US_RHR) & 0x1FF);
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 18 2006, 11:42
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zarya @ Jul 18 2006, 14:58) *
Еще один вопрос назрел smile.gif
Принимаю данные вот так:
Код
void AT91F_US_Get(void) {
  int d[10];
  memset(d, 0, sizeof(d));
  int j = 0;
  while(1) {
    while (!AT91F_US_RxReady(COM0));
    d[j] = AT91F_US_GetChar(COM0);
        if (d[j] == 0x4B || j > 10) break;
        else j++;
  }
  d[++j] = 0;
  AT91F_US_Put((char*)&d);
}

по поводу кода не ругайтесь, ибо он кривой, я и сам знаю, просто от безисходности начал уже извращаться smile.gif


Код уж слишком кривой, чтобы не ругаться:
- индекс j трижды выходит за границы массива d[10].
- я не использую атмеловские библиотеки, но сдается мне, что AT91F_US_Put нужен на входе указатель на char, а массив d[10] объявлен как int

Цитата(Zarya @ Jul 18 2006, 14:58) *
А еще, разве нет какого-нить буфера, куда будут скапливаться приходящие байты?


Почитайте про PDC
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 18 2006, 12:04
Сообщение #26





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



aaarrr, насчет переполнения массива, вы впринципе правы, но, если честно массив, когда ему посылал 20 элементов, забивался всеголишь 7ью элементами, такое ощущение, что RXReady не срабатывал те 20 раз smile.gif
На счет
Цитата
сдается мне, что AT91F_US_Put нужен на входе указатель на char, а массив d[10] объявлен как int

да, на вход нужен указатель char, но в d хранится hex ascii код символа, и когда я передаю, его в char через (char*)&int, абсолютно ничего страшного.

А вот про PDC, с удовольствием бы почитал... только где? biggrin.gif
P.S. давно созрел вопрос, но стеснялся спросить, что имеется ввиду под "даташит" ? smile.gif
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 18 2006, 12:24
Сообщение #27





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



по поводу int и char извиняюсь... действительно, налажал smile.gif
но, все же не в этом суть smile.gif
жду-жду... ответов и помощи, рабочий день подходит к концу smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 18 2006, 12:37
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zarya @ Jul 18 2006, 16:04) *
да, на вход нужен указатель char, но в d хранится hex ascii код символа, и когда я передаю, его в char через (char*)&int, абсолютно ничего страшного.

Т.е. Вы выдаете наружу только первый элемент массива?

Цитата(Zarya @ Jul 18 2006, 16:04) *
А вот про PDC, с удовольствием бы почитал... только где? biggrin.gif

Здесь (в форуме ARM) только что обсуждали, поиском воспользуйтесь.


Цитата(Zarya @ Jul 18 2006, 16:24) *
но, все же не в этом суть smile.gif

Вот я и не могу уяснить, в чем именно суть проблемы. Данные теряются? Попробуйте сделать совсем простой loopback: просто отправляйте каждый полученный символ назад, убедитесь, что количество совпадает.
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 18 2006, 13:29
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Zarya @ Jul 18 2006, 16:04) *
P.S. давно созрел вопрос, но стеснялся спросить, что имеется ввиду под "даташит" ? smile.gif

однако smile.gif
Datasheet - главный источник информации по любому электронному компоненту от его производителя.
Без вдумчивого изучения даташита на м/к садиться за его программирование, прямо скажем, рановато.

Даташит на интересующий Вас чип (~6 Мбайт)


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Zarya
сообщение Jul 18 2006, 13:45
Сообщение #30





Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752



aaarrr, спасибо за попытки помочь smile.gif
Я очень-очень сильно ступил smile.gif

вот в чем была проблема:
Код
while(1) {
    while (!AT91F_US_RxReady(COM0));

их надо поменять местами smile.gif
Тока траблы все равно остались, завтра расскажу что и как smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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