Перейти к содержанию
    

UART: инициализация скорости

Ув. пользователи MCS-51

 

Много лет применял инициализацию скорости UART.

Потерял 2 дня для адаптации к SiLabs C8051F064 (читать Datasheet было лень)

Оказалось, инициализация по-умолчанию НЕ соответствует "классике" Intel MCS-51

 

For classic MCS-51:

Th1=(signed char)(K*Osc_Freq)/(Baud_Rate*32*12); //if(SMOD==1) K=2; else K=1;

T2 =(signed word)(K*Osc_Freq)/(Baud_Rate*32); //K=1;

 

For SiLabs C8051Fxx:

Th1=(signed char)(K*Osc_Freq)/(Baud_Rate*32*N); //N=1,4,12,48(SysCLC) or N=8(ExtCLC)

T2 =(signed word)(K*Osc_Freq)/(Baud_Rate*16*N); //N=1,2,12(SysCLC) or N=8(ExtCLC);

 

Готового FAQ по отличиям инициализации скорости UART для разных MCU-51 не нашел.

 

Предлагаю поделиться грустным опытом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю поделиться грустным опытом
Вот здесь http://www.silabs.ru/appnotes.php есть все...

Для UART можно смело AN115 – «Примеры и софт для UART»

Отличий есть и много, хотя бы CrossBar не забыть определить (см.AN101). Здесь очень полезен Code Configuration Wizard, в том числе и для UART.

Есть еще много чего в:

http://www.silabs.ru/publication.php

http://www.dito97.narod.ru/document.htm

http://www.electrosnab.ru/silabs/Silabs_1_1.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь http://www.silabs.ru/appnotes.php есть все...

Для UART можно смело AN115 – «Примеры и софт для UART»

Отличий есть и много, хотя бы CrossBar не забыть определить (см.AN101). Здесь очень полезен Code Configuration Wizard, в том числе и для UART.

Есть еще много чего в:

http://www.silabs.ru/publication.php

http://www.dito97.narod.ru/document.htm

http://www.electrosnab.ru/silabs/Silabs_1_1.htm

 

Полностью согласен=хорошие ссылки по SiLabs

 

А по другим производителям семейства MCS-51 замечены отличия???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В процессорах Silabs C8051F06x очень много разнообразной периферии и не все регистры специального назначения (SFR) поместились в стандартное адресное пространство. Для решения этой проблемы был введен регистр указатель активной страницы для доступа к соответствующим SFR.

 

Теперь по поводу инициализации UART:

1. Определяете от какого генератора работает процессор, если от внешнего то его нужно инициализировать

2. Инициализируете Crossbar со включенным UART

3. Собственно инициализация режима UART

 

Пример кода инициализации скорости работы и режима UART т.е. пункт 3.

//

// Initialize UART

// Use Timer 1

//

void UART_Init (void)

{

SFRPAGE = 0x00; // ATTENTION Set Page 0 !!!!

CKCON |= 0x10; // Timer1 clocked from SYSCLK = 24MHz

TMOD &= 0x0F;

TMOD |= 0x20; // Timer1 set to 8-bit mode with auto-reload

TH1 = 0xF3;

TL1 = 0xF3; // Set UART speed 115200

TCON |= 0x40; // Run Timer1

SCON0 = 0xD0; // Receiver enabled, simple 9-bit mode

SSTA0 = 0x10; // Timer 1 is source baudrate for UART

ES0 = 1; // UART interrupt enable

}

 

Удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Силабсы достаточно навороченные в отличие от стандартных. Мне пришлось дня два-три потратить прежде чем я перешёл от AT89S8252 на F310. Берите pdf-ник по F064 и распечатывайте целиком (полный вариант, т.к. с экрана читать даже на ЖКИ будет не сильно приятно) и затем читайте его целиком и медленно (т.к. потом это сэкономит кучу времени, ведь программируете вы не только УАРТ). Там, можно сказать, всё не так, как в стандартном 51-ом за исключением системы команд. Но всё, что написано - работает хорошо. Есть книга О.И.Николайчук "x51-совместимые микроконтроллеры контроллеры фирмы Cygnal" djvu. Она правда весит 16 метров и там много полезной информации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может кто написать маленький примерчик как заставить на МЦУ С51 работать UART без использования таймера + обработчик прерывания от трансмиттера. А то я понять не могу почему у меня программа в отладчике в этот обработчик не входит...

Изменено пользователем Halfback

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UART без использования таймера + обработчик прерывания от трансмиттера. А то я понять не могу почему у меня программа в отладчике в этот обработчик не входит...

 

UART без таймера не работает -> соответственно и в прерывание не входит :huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UART без таймера не работает -> соответственно и в прерывание не входит

ну в общем я разобрался в чём я был не прав - там помимо EA=1 (разрешение всех прерываний) надо было выставить ES = 1 (разрешить индивидуально для UART)

А вот как заставить заработать UART без таймера я так и не разобрался. Смысл в том что в кейле байты по УАРТу шлются а протеусовская симуляция не работает =) может глюк протеуса 6,9 SP5 ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может глюк протеуса 6,9 SP5 ???

 

Скореее всего глюки :blink: Keila или просто глюки :wacko:.

 

Вообще таймер определяет скорость передачи по UART. Соответственно если таймер выключен, то скорость = 0. Если не веришь проверь в режиме эмуляции кейла Peripherals->Serial->Baudrate.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не веришь проверь в режиме эмуляции кейла Peripherals->Serial->Baudrate

Дык там в кейле и проверял - байты слались без проблем и при этом таймер в конфигурации вообще не трогал ;) А протеус молчит.

Кстати а как сделать так чтобы отсылка по УАРТа велась без участия тела майн ??? Что там в обработчике прерывания написать надо??? И есть ли толковая книга (ну или сайт какой-нибудь) с примерами на СИ по МЦУ С51??? а то имеются только по AVR...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык там в кейле и проверял - байты слались без проблем и при этом таймер в конфигурации вообще не трогал ;) А протеус молчит.

 

А какой у тубя Keil. У меня 3.31, и в мем при отключенном таймере baubrate = 0 (как и должно быть).

 

А вообще чего мучаться с протеус и нельзя ли все промоделировать в железе(Сейчас практически во всех МК есть UART) + ПС.

 

Документация здесь

h**p://electronix.ru/forum/index.php?act=Attach&type=post&id=10553

 

Кстати а как сделать так чтобы отсылка по УАРТа велась без участия тела майн ???

Без main() - это что-то новенькое. А где у тебя код инициализации контроллера будет?

 

В ощем возьми какой нибудь пример работы с uart, разберись хорошенько и будет :santa2: :w00t:

 

Вот с этого файла я начинал свое знакомство с UART -> режим работы без прерываниия

Изменено пользователем Kolia

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Грусным делиться вроде и нечем. Использовал разные сигналы (06Х, 12Х, 31Х, 35Х). Глюков или несоответствия документации практически нет. Только в 35Х есть небольшое несоответствие в виде отсутствия "минусового" ключа между встроенной опорой и землей, хотя на блок-схеме он показан. Характеристики всех АЦП очень неплохие, а главное, соответствуют заявленным.

Что не нравится - так это страничные SFR в 0ХХ-1ХХ, а также деление памяти данных на idata, pdata, xdata, но это все наследие 51 архитектуры.

Теперь по существу вопроса. На сайте силабса есть утилита ConfigWizard, которая очень помогает разобраться с тем, как инициализировать ту или иную периферию. Причем она полезна как начинающим разбираться с сигналами, так и уже опытным

http://www.silabs.com/tgwWebApp/public/web...u_configwiz.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 Для работы уарта (F064) обязательно нужен таймер

2 если вы хотите максимальную скорость обмена, то работайте с прерыванием.

3 если вы хотите работать на скоростях выше стандартной (115200), то работайте с UART1 а не UART0.

стабильно работает с ПК через мост CP2101 на скорости 921600.

Примечание: стабильно работает при использовании для тактирования кварца 22118400, т.е. погрешность выставления скорости передачи = 0%. С использованием встроенного генератора не проверял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 если вы хотите работать на скоростях выше стандартной (115200), то работайте с UART1 а не UART0.

стабильно работает с ПК через мост CP2101 на скорости 921600.

Примечание: стабильно работает при использовании для тактирования кварца 22118400, т.е. погрешность выставления скорости передачи = 0%. С использованием встроенного генератора не проверял.

 

Работа СР2103 на скорости 921600 с использованием внутреннего генератора при работе контроллера идет отлично (на C8051F32x)

Все действия лучше делать по прерыванию УАРТа. Только нужно всего лиш проверять причину прерывания: прием илии передача и не забывать программно очищать этот флаг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...