Работа с UART
Re: Работа с UART
я проверял в фунции приема. Если FERR или OERR принимают значение 1, то зажигаю светодиод
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
Значит скорости у модулей разные. Ну и переполнение имеет место быть.
Re: Работа с UART
Сделал прием и отправку без использования прерываний, стало намного лучше, но все равно иногда теряются байты. Подскажите как можно реализовать два стоповых бита?
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
Зачем Вам нужны два стоповых бита?
Если происходит потеря байтов, то есть два пути.
1 Выяснить причину и устранить ее.
2. Изменить верхний уровень протокола для компенсации этой проблемы.
Второй путь не исключает первого и наоборот.
Проверка целостности информации - стандартная фича любого вменяемого протокола.
Если происходит потеря байтов, то есть два пути.
1 Выяснить причину и устранить ее.
2. Изменить верхний уровень протокола для компенсации этой проблемы.
Второй путь не исключает первого и наоборот.
Проверка целостности информации - стандартная фича любого вменяемого протокола.
-
driver_gv
- Потрогал лапой паяльник
- Сообщения: 399
- Зарегистрирован: Сб авг 08, 2009 23:02:57
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Работа с UART
Два стоповых бита применяют для не кварцованных приемо-передатчиков. Позволяет увеличить разброс скорости приемника- передатчика без потерь байтов.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
[uquote="driver_gv",url="/forum/viewtopic.php?p=3664301#p3664301"]Позволяет увеличить разброс скорости[/uquote]
С одним стопом разброс может быть до 10%. Даже и не представляю себе реального случая, когда этого может не хватить.
С одним стопом разброс может быть до 10%. Даже и не представляю себе реального случая, когда этого может не хватить.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18547
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с UART
Всегда думал, что стоп-биты дают время для обработки принятого байта и впридачу позволяют обнаружить повреждение линии, когда в ней "зависает" ноль...
А вот что они помогают победить рассинхронизацию, слышу впервые...
А вот что они помогают победить рассинхронизацию, слышу впервые...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
Стоп бит служит не целям синхронизации, а для детектирования ошибок по скорости приёма. Для синхронизации имеется стартовый бит, который запускает сдвиговый регистр и входной фильтр.
Re: Работа с UART
Подозреваю что у меня различные скорости, хоть и настраиваю по формуле из datashit. Первый контроллер от второго принимает все правильно. но вот второй принимает не те байты. Например передаю 0xAA а принимает 0xD5 и иногда 0x00.
Вот настройки:
Расчитываю исходя из кварца 24MHz и второй контроллер 19,44MHz.
Правильную ли частоту я беру? У меня так же включен PPL, и в настройках проекта Частота Clock указана 48 MHz
Вот настройки:
Код: Выделить всё
procedure EUSART1_Initialize();
begin
BAUDCON1 := 0x08;
// 115200
SPBRG1 := 0x0C;
SPBRGH1 := 0x00;
// SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
RCSTA1 := 0x90;
// TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave_mode;
TXSTA1 := 0x24;
end;
Правильную ли частоту я беру? У меня так же включен PPL, и в настройках проекта Частота Clock указана 48 MHz
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3664436#p3664436"]Правильную ли частоту я беру?[/uquote]
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV)
И вообще, нужно привести конфиг полностью.
ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с
В каком месте тут 115200 ? (каламбур!
)
При 24 МГц и рейте 115200 получается SPBRG=51 (0x33)
При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV)
И вообще, нужно привести конфиг полностью.
ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с
В каком месте тут 115200 ? (каламбур!
При 24 МГц и рейте 115200 получается SPBRG=51 (0x33)
При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)
Re: Работа с UART
[uquote="КРАМ",url="/forum/viewtopic.php?p=3664474#p3664474"][uquote="DarkWolf",url="/forum/viewtopic.php?p=3664436#p3664436"]Правильную ли частоту я беру?[/uquote]
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV)
И вообще, нужно привести конфиг полностью.
ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с
В каком месте тут 115200 ? (каламбур!
)
При 24 МГц и рейте 115200 получается SPBRG=51 (0x33)
При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)[/uquote]
Судя по даташиту данная формула справедлива для синхронного приемо передатчика, у меня же асинхронный поэтому формула выглядит так: Считаем рейт: 24000000/(16*(12+1))=24000000/208=115384 бит/с
Конфиг прикрепил
Понял, что скорость 115200 не подходит. для 19,44 погрешность больше 4 %. Пересчитал для скорость 57600 теперь передает и принимает не то что нужно
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV)
И вообще, нужно привести конфиг полностью.
ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с
В каком месте тут 115200 ? (каламбур!
При 24 МГц и рейте 115200 получается SPBRG=51 (0x33)
При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)[/uquote]
Судя по даташиту данная формула справедлива для синхронного приемо передатчика, у меня же асинхронный поэтому формула выглядит так: Считаем рейт: 24000000/(16*(12+1))=24000000/208=115384 бит/с
Конфиг прикрепил
Понял, что скорость 115200 не подходит. для 19,44 погрешность больше 4 %. Пересчитал для скорость 57600 теперь передает и принимает не то что нужно
- Вложения
-
- Config.png
- Config
- (41.1 КБ) 237 скачиваний
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3664492#p3664492"]Судя по даташиту данная формула справедлива для синхронного приемо передатчика[/uquote]
Из даташита этого НЕ следует. Вы ошиблись с расчетом. Множитель для 16-разрядного хай спид - 4, а не 16.
Откройте любой другой даташит на 18-ое семейство, где у таблицы есть рамка и убедитесь.

Приведенные мной коэффициенты рейта дают почти нулевую погрешность для обозначенных частот. Это во первых, а во вторых, для УАРТА допустима погрешность до 10%. И никаких ошибок в пределах этой погрешности не будет.
Из даташита этого НЕ следует. Вы ошиблись с расчетом. Множитель для 16-разрядного хай спид - 4, а не 16.
Откройте любой другой даташит на 18-ое семейство, где у таблицы есть рамка и убедитесь.
Приведенные мной коэффициенты рейта дают почти нулевую погрешность для обозначенных частот. Это во первых, а во вторых, для УАРТА допустима погрешность до 10%. И никаких ошибок в пределах этой погрешности не будет.
Re: Работа с UART
Да, у меня в даташите без таблицы. Настроил скорости исходя из новой формулы. Но почему то всеравно приходит не то что нужно. если на 19,44 при отправке не добавить задержку 40 us то передача не завершается.
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3664525#p3664525"]Но почему то всеравно[/uquote]
Милостивый государь, сделайте одолжение, приведите схему связанную с этим каналом между двумя МК с указанием ног используемых на МК.
А так же ОБА кода инициализации.
Задержка Ваша никакого практического смысла не имеет. UART-у болт положить на задержки. Он начинает прием со старт-бита, далее квантуя сигнал с заданным рейтом. При передаче после загрузки байта немедленно начинается передача и остановить ее невозможно.
Милостивый государь, сделайте одолжение, приведите схему связанную с этим каналом между двумя МК с указанием ног используемых на МК.
А так же ОБА кода инициализации.
Задержка Ваша никакого практического смысла не имеет. UART-у болт положить на задержки. Он начинает прием со старт-бита, далее квантуя сигнал с заданным рейтом. При передаче после загрузки байта немедленно начинается передача и остановить ее невозможно.
Re: Работа с UART
схема 1
24MHz
Cхема 2
19,44 MHz
TX- ножка 44, Rx - ножка 1 (совмещенная с SPI)
Код: Выделить всё
Код инициализации:
procedure EUSART1_Initialize();
begin
BAUDCON1 := 0x08;
SPBRG1 := 51;
SPBRGH1 := 0;
// SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
RCSTA1 := 0x90;
// TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave_mode;
TXSTA1 := 0x24;
end;
Использование:
procedure Uart1(cmdUart:byte); // ïåðåä èñïîëüçîâàíèå ïîäãîòîâèòü var dataSendUart: array[1..12] of byte
begin
{
TUN0_bit := 1;
TUN1_bit := 1;
TUN2_bit := 1;
TUN3_bit := 1;
TUN4_bit := 1;
TUN5_bit := 0;
}
SSPEN_SSP1CON1_bit := 0;
SSPEN_bit := 0;
PORTE.B2 := 1;
TRISC.b7 := 1;
TRISC.b6 := 0;
RC2_bit := 1; //разрешаем работу UART
EUSART1_Initialize();
delay_ms(100);
for i := 0 to 7 do
begin
UART1_Write(0x15);
//delay_us(500);
end;
i:=0;
while (i <= 15) do
begin
if (UART1_Data_Ready = 1) then
begin
dataReadUart[i] := UART1_Read();
inc(i);
PIR1.RC1IF:=0;
end
end;
// Выключаем UART
RC2_bit := 0;
//TXEN1_bit := 0;
SPEN1_bit :=0;
//CREN1_bit := 0;
//TXEN1_bit := 0;
// Включаем SPI
SSPEN_SSP1CON1_bit := 1;
SSPEN_bit := 1;
//Сохраняем в файл
FS_SDSel();
Mmc_Fat_ChangeDir('\');
Mmc_Fat_Assign('uart.cfg',0);
Mmc_Fat_Reset(file_size);
Mmc_Fat_Append;
Mmc_Fat_Write(dataReadUart,16);
delay_ms(200);
Mmc_Fat_Close();
ChangeDir('shar');
end;
Код: Выделить всё
procedure EUSART1_Initialize();
begin
BAUDCON1 := 0x08;
SPBRG1 := 41;
SPBRGH1 := 0;
// SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
RCSTA1 := 0x90;
// TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave_mode;
TXSTA1 := 0x24;
end;
прием данных
procedure interrupt;
begin
if RC1IE_bit=1 then
count:=0;
while (count <= 7) do
begin
if (UART1_Data_Ready = 1) then
begin
pUART_Read[count] := UART1_Read();
inc(count);
PIR1.RC1IF:=0;
end
end;
WriteUart();
end;
отправляем:
procedure WriteUart();
var cmd: byte;
begin
pUART_Write := pUART_Read;
PIR1.RC1IF:=0;
PIE1.RC1IE:=0;
GIE_bit := 0;
INTCON.PEIE := 0;
pUART_Write[0] := pUART_Read[0];
pUART_Write[1] := pUART_Read[1];
pUART_Write[2] := pUART_Read[2];
pUART_Write[3] := pUART_Read[3];
pUART_Write[4] := pUART_Read[4];
pUART_Write[5] := pUART_Read[5];
pUART_Write[6] := pUART_Read[6];
pUART_Write[7] := pUART_Read[7];
pUART_Write[8] := 0x08;
pUART_Write[9] := 0x09;
pUART_Write[10] := 0x10;
pUART_Write[11] := 0x11;
pUART_Write[12] := 0x12;
pUART_Write[13] := 0x13;
pUART_Write[14] := 0x14;
pUART_Write[15] := 0x15;
for i:= 0 to 15 do
begin
UART1_Write(pUART_Write[i]);
end;
PIR1.RC1IF:=0;
PIE1.RC1IE:=1;
GIE_bit := 1;
INTCON.PEIE := 1;
end;
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
И што мне с этими портянками делать? Лень нарисовать фрагмент связанный с обсуждаемым вопросом?
И не надо ничего совмещать с SPI. Решите сначала проблему связи УАРТов, а потом будете пытаться что либо совмещать...
Если у Вас не работает пакетный обмен, то за каким хреном Вы пытаетесь передавать пакеты? Чтобы все запутать?
И не надо ничего совмещать с SPI. Решите сначала проблему связи УАРТов, а потом будете пытаться что либо совмещать...
Где тело функции? Как обеспечивается зазор между загрузкой байт?UART1_Write(0x15)
Если у Вас не работает пакетный обмен, то за каким хреном Вы пытаетесь передавать пакеты? Чтобы все запутать?
Re: Работа с UART
я не схемотехник., в рисовании схем вообще не разбираюсь. Просто сначала проект была сделана часть проекта, теперь добавилось вторая часть с использованием UART с SPI все отлажено и работает без сбоев.
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
Уважаемый, если у Вас все работает без сбоев, то к чему вся эта головоломка?
В конце концов, все можно посмотреть осциллографом.
А если его нет, но можно написать фрагмент кода с обменом ОДНИМ БАЙТОМ, выяснив все вопросы по скорости и взаимодействию.
При пакетном обмене необходимо обеспечивать время на передачу каждого байта, а так же на возможности принимающей части обработать принимаемый байт между приходом байт.
Вы пытаетесь запустить некий комплексный механизм сразу оптом. Это несерьезно при Вашей схемотехнической подготовке. Дробите задачу.
В конце концов, все можно посмотреть осциллографом.
А если его нет, но можно написать фрагмент кода с обменом ОДНИМ БАЙТОМ, выяснив все вопросы по скорости и взаимодействию.
При пакетном обмене необходимо обеспечивать время на передачу каждого байта, а так же на возможности принимающей части обработать принимаемый байт между приходом байт.
Вы пытаетесь запустить некий комплексный механизм сразу оптом. Это несерьезно при Вашей схемотехнической подготовке. Дробите задачу.
Re: Работа с UART
Спасибо всем за подсказки и советы. Проблема решена. Оказалось виноватым железо. Контроллеры между собой соединены оптикой, и вот приемник PLR135/T6 не держит постоянную составляющую. В даташите по этому поводу ничего не сказано. Решением данной проблемы было передача 0 и 1 с помощью несущих частот.
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Работа с UART
[uquote="DarkWolf",url="/forum/viewtopic.php?p=3668865#p3668865"]Решением данной проблемы было передача 0 и 1 с помощью несущих частот.[/uquote]
Для этого существует манчестерское кодирование.
Для этого существует манчестерское кодирование.


