|
Чудеса с UART'ом |
|
|
|
Jun 29 2010, 23:28
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Работаю c UART'ом.. на lpc2378 на максимальной скорости и чего-то с временами не то... Частота UART'а = 4500000, т.е. по идее это 2.2 мкс на передачу одного байта Сделал тест. С одной стороны Код for(;;) { t0 = T1TC; while (!(U3LSR & 0x20)); U3THR = v; while (!(U3LSR & 0x01)); a = U3RBR; dt = T1TC - t0; } с другой стороны - тупое эхо. Меряю время - получается 7 микросекунд, вместо 2.2 *2 если же выдавать не по одному байту, то измеренное время в расчете на байт уменьшается, приближаясь к рачетному. FIFO вроде бы тут никак не должно играть. Разве только в случае незаполненого FIFO на передачу, это самое FIFO некоторое время ждет. В документации ни про какое торможение вроде не написано.
|
|
|
|
|
Jun 30 2010, 06:30
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 8-01-07
Из: Томск
Пользователь №: 24 208

|
Если я правильно понял, время отсчитывается по таймеру, а программа в это время ждет, пока с внешнего устройства поступит какой-то байт. Где тут чистота эксперимента?
|
|
|
|
|
Jun 30 2010, 08:21
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(bseyur @ Jun 30 2010, 10:30)  Если я правильно понял, время отсчитывается по таймеру, а программа в это время ждет, пока с внешнего устройства поступит какой-то байт. Где тут чистота эксперимента? Куда уж чище. Внешнее устройство - lpc2148, разогнанный до 72 МГц где крутится в цикле if(U1LSR & 0x01) { v = U1RBR; U1THR = v; }
|
|
|
|
|
Jun 30 2010, 08:59
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(GetSmart @ Jun 30 2010, 12:27)  Что говорит осциллограф? А что он может сказать ? Раньше смотрели, фронты слегка завалены, но что можно углядеть в ситуации, когда гоняется один байт туда-сюда в одном случае и гоняется, например, 8 байтов туда-сюда ?
|
|
|
|
|
Jun 30 2010, 09:08
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(GetSmart @ Jun 30 2010, 13:06)  ширина бита какая? паузы между байтами какие? паузы одинаковые ? Я так понимаю, таки нужен осциллограф и картинки народу, ок. сейчас соберемся..
|
|
|
|
|
Jun 30 2010, 09:29
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 8-01-07
Из: Томск
Пользователь №: 24 208

|
Цитата(evgen2 @ Jun 30 2010, 15:21)  Куда уж чище. Внешнее устройство - lpc2148, разогнанный до 72 МГц где крутится в цикле if(U1LSR & 0x01) { v = U1RBR; U1THR = v; } Попробуйте без ожидания приема. Еще в приемо-передатчике есть фича, которая задерживает генерацию прерывания THRE при определенных условиях. Но не думаю, что это каким-то боком относится к делу. Просто мысли...
|
|
|
|
|
Jun 30 2010, 17:26
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(bseyur @ Jun 30 2010, 13:29)  Попробуйте без ожидания приема. Еще в приемо-передатчике есть фича, которая задерживает генерацию прерывания THRE при определенных условиях. Но не думаю, что это каким-то боком относится к делу. Просто мысли...  Прерываний никаких нет. Но мысли в правильном направлении..
|
|
|
|
|
Jun 30 2010, 17:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (evgen2 @ Jun 30 2010, 02:28)  FIFO вроде бы тут никак не должно играть. Приемное FIFO работает по таймауту, иначе если готовность/прерывание будут дергаться после первого-же байта в FIFO смысла мало. Хотите шустрости на одиночных байтах - отключайте FIFIO. QUOTE Внешнее устройство - lpc2148, разогнанный до 72 МГц где крутится в цикле А должна быть просто перемычка.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 30 2010, 18:46
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Jun 30 2010, 21:49)  Приемное FIFO работает по таймауту, иначе если готовность/прерывание будут дергаться после первого-же байта в FIFO смысла мало. Хотите шустрости на одиночных байтах - отключайте FIFIO.
А должна быть просто перемычка. Дык в даташите написано - "низя отдключать FIFO". хочется шустрости, но не на совсем одиночных байтах, например три байта туда, три обратно. Вот стал выяснять, где тормозит. Чего-то я не понимаю, как тут вставлять картинки. http://electronix.ru/mkportal/modules/copp...&fullsize=1Это сигналы RX и TX Долго не могли сообразить, что можно дрыгать ногами, после дрыганья ногами стало более-менее понятно http://electronix.ru/mkportal/modules/copp...&fullsize=1Это слейв 2148, сверху вход, снизу дрыг ногой http://electronix.ru/mkportal/modules/copp...&fullsize=1Это слейв 2148, сверху вЫход, снизу дрыг ногой http://electronix.ru/mkportal/modules/copp...&fullsize=1Мастер 2378 сверху вход, снизу - дрыг http://electronix.ru/mkportal/modules/copp...&fullsize=1Мастер 2378 сверху вЫход, снизу - дрыг код для слейва Код #define LAMP_ON FIO0SET = 0x00002000 #define LAMP_OFF FIO0CLR = 0x00002000
while(1) { if(U1LSR & 0x01) { LAMP_ON; v = U1RBR; U1THR = v; LAMP_OFF; } } код для мастера Код for(;;) { U3THR = v; LAMP_OFF; while (!(U3LSR & 0x01)); LAMP_ON; /* нога on */ a = U3RBR; U3THR = v; LAMP_OFF; /* нога off */
while (!(U3LSR & 0x01)); LAMP_ON; a = U3RBR; U3THR = v; LAMP_OFF; /* повторение много раз, чтоб съесть затраты на цикл */ .... } Непонятно, почему время дрыга для одного и того же кода так отличается. Оптимизация по времени во обоих случаях включена.
Сообщение отредактировал evgen2 - Jun 30 2010, 18:47
|
|
|
|
|
Jun 30 2010, 19:43
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Jun 30 2010, 22:53)  Привидилось??? Окей, не в даташите, а в узермануале UARTn FIFO Control Register (U0FCR - 0xE000C008, U2FCR - Table 311: UARTn FIFO Control Register (U0FCR - address 0xE000C008, U2FCR - 0xE007 8008, U3FCR - 0xE007C008, Write Only) bit description Bit Symbol Value Description Reset Value 0 FIFO Enable 0 UARTn FIFOs are disabled. Must not be used in the 0 application. 1 Active high enable for both UARTn Rx and TX FIFOs and UnFCR[7:1] access. This bit must be set for proper UARTn operation. Any transition on this bit will automatically clear the UARTn FIFOs.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|