|
|
  |
UART0 protocol problems |
|
|
|
Jun 15 2011, 13:56
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 2-01-11
Пользователь №: 61 990

|
здравстуйсте, не поможете ли разобраться в чем может быть проблема.. LPC2148, Keil создал протокол общения между МК и ПК - отсылаю с Пк кадры по 9 байт данных... в итоге приходит только 1-2 кадра, а дальше толи контроллер виснет, толи с настройками UARTa что-то, принимаю по 1 байту через прерывания Код Настройки UART
PINSEL0 = 0x05; U0FDR = 0xCD; U0LCR = 0x83; U0DLL = 0x19; U0LCR = 0x03; U0IIR = 0xC5; U0FCR = 0x01; U0IER = 0x01;
VICVectCntl2 = 0x00000026; VICVectAddr2 = (unsigned)UART_IRQ; //Configure UART interrupt VICIntEnable |= 0x00000040; Код Прием данных:
unsigned count = 0; unsigned count_ff = 0;
void UART_IRQ(void) __irq { Read_Data[count] = UARTReadChar(); if(Read_Data[count_ff] == 0xFF) { if(count_ff != 2) count_ff++; count++; } else { count_ff = 0; count = 0; } if((count_ff == 2) && (count == 8)) { count = 0; count_ff = 0; function(Read_Data); --- выполняемая функция с данных кадра Delay(100); } VICVectAddr = 0x00; }
|
|
|
|
|
Jun 16 2011, 06:18
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
У тебя пакет 9 байт, значит попробуй и принемать сразу 9 байт. Поставь в функцию прерываня цикл While() с условием - пока все байты не прийдут. И еще в начале пакета лучше сделать какой-то байт, чтобы ты знал что это именно пакет а не мусор. Будет выглядеть примерно так: Код void UART_IRQ(void) __irq { unsigned count = 0;
Read_Data[count] = UARTReadChar(); if(Read_Data[count] == 0xFF) { count ++; while (count < 9) { Read_Data[count] = UARTReadChar(); count ++; }
function(Read_Data); --- выполняемая функция с данных кадра Delay(100); }
VICVectAddr = 0x00; }
Сообщение отредактировал sadfeel - Jun 16 2011, 06:23
|
|
|
|
|
Jun 16 2011, 06:26
|
Группа: Новичок
Сообщений: 5
Регистрация: 16-06-11
Пользователь №: 65 723

|
знаю, что не в тему((..я тоже программирую stm32 и мне очень нужен zip к аn1823 (он за 2004 год, поэтому на st.com его уже нет) если у кого есть, скиньте пожалуйста, буду очень признательна!!
|
|
|
|
|
Jun 16 2011, 06:31
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(S1LENCE @ Jun 15 2011, 16:56)  создал протокол общения между МК и ПК - отсылаю с Пк кадры по 9 байт данных... О как! Протокол - это документ, фиксирующий договоренности. Например, как распознать начало кадра, как убедиться в достоверности данных. Я не вижу его и сомневаюсь, что он действительно создан. Есть какой-то неразборчивый код с явными ошибками типа вызова задержек и неизвестно каких функций в прерывании.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 16 2011, 07:02
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 2-01-11
Пользователь №: 61 990

|
Протокол действительно есть (не привел здесь, ведь дело не в нем). Разбор кадров есть, начало тоже специфическое и я могу распознать что это действительно мой кадр.
Проблема только в прерывании... Задержки уберу. А какие еще явные ошибки? Как можно без while прочитать сразу 9 байт?
|
|
|
|
|
Jun 16 2011, 07:31
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(S1LENCE @ Jun 16 2011, 10:02)  Как можно без while прочитать сразу 9 байт? Если хотите "сразу", не используйте прерывания. Если считаете нужным использовать прерывания, то есть волшебные слова "флаг" или "состояние", которые могут устанавливаться в одном месте программы, а анализироваться в другом. Или это ново для Вас и требуются пояснения?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 16 2011, 08:10
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203

|
Еще бы не плохо в прерывании смотреть то ли это символ пришел, то ли тайм-аут сработал.
|
|
|
|
|
Jun 16 2011, 10:00
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 2-01-11
Пользователь №: 61 990

|
Цитата(Dog Pawlowa @ Jun 16 2011, 10:31)  Если хотите "сразу", не используйте прерывания. Если считаете нужным использовать прерывания, то есть волшебные слова "флаг" или "состояние", которые могут устанавливаться в одном месте программы, а анализироваться в другом. Или это ново для Вас и требуются пояснения? Да, думаю попробовать без прерывания. Постоянно в цикле for считывать данные с буффера и анализоровать их.
|
|
|
|
|
Jun 18 2011, 15:20
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (S1LENCE @ Jun 16 2011, 16:02)  Как можно без while прочитать сразу 9 байт? Прерывания для того и придуманы, чтобы нарочно не ждать события. Жить, как живете. Ну, а если пришел байт, в любой момент времени - принять его в буфер (FIFO, например), и снова жить дальше. Или ожидать, хотя бы в цикле, НО в основной программе. Прерывания "нежный" механизм, не стоит их притормаживать громоздкими обработками за редкими исключениями. А буфер это удобно. Я в него даже скан-коды от клавиатуры складываю)
--------------------
Выбор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|