|
Проблема с UART в LPC2103 |
|
|
|
Aug 22 2006, 23:50
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Имеется команда, например "u08 Play_CMD[]={0xFF,0x55,0x03,0x02,0x00,0x01,0xFA};" которую надо отправить через UART1 на МП3-плеер. Пытаюсь это сделать несколькими способами: 1. const char *puts(const char *string) { unsigned char ch; while ((ch = *string)) { putchar(ch); string++; } return string; }
int putchar(int ch) /* Write character to Serial Port */ { while (!(U1LSR & ULSR_THRE)) ; // wait for TX buffer to empty U1THR = ch; // put char to Transmit Holding Register return ch; }
2. const char *puts1(const char *string) { u08 i,l; l=3+string[2]; //string[2]-длина команды for (i=0;i<l;i++) { putchar(string[i]); }; return string; }
но происходит следующее - по первому способу - останавливается передача на 0х00, причем при отправке следующей команды, застрявшие байтики не пропихиваются на выход (ну оно и понятно - 0х00 - вроде как завершение строки). При втором способе - 0х00 проходит, но передается на 2 байта меньше, причем при последующей команде они пропихиваются., но застревают байтики от следующей команды... Причем пропихиваться может и при записи чего-либо в другой сериальный порт...
В чем могут быть грабли? с 0-вым юартом - также.
инится ЮАРТ:
void uart1Init(unsigned int baud) {
// setup Pin Function Select Register (Pin Connect Block) // make sure old values of Bits 0-4 are masked out and // set them according to UART0-Pin-Selection PINSEL0 |= 0x00050000; U1IER = 0x00; // disable all interrupts U1IIR = 0x00; // clear interrupt ID register U1LSR = 0x00; // clear line status register // set the baudrate - DLAB must be set to access DLL/DLM U1LCR = ULCR_DLAB_ENABLE; // set divisor latches (DLAB) U1DLL = (unsigned char)baud; // set for baud low byte U1DLM = (unsigned char)(baud >> 8); // set for baud high byte // set the number of characters and other // user specified operating parameters // Databits, Parity, Stopbits - Settings in Line Control Register U1LCR = (UART_8N1);// | ULCR_DLAB_ENABLE); // clear DLAB "on-the-fly" // setup FIFO Control Register (fifo-enabled + xx trig) U1FCR = UFCR_FIFO_ENABLE | UFCR_TX_FIFO_RESET | UFCR_FIFO_TRIG8; }
частота работы ядра - 60МГц. Кейл.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 22)
|
Aug 23 2006, 03:17
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(EXeGLuMATOR @ Aug 23 2006, 05:50)  Имеется команда, например "u08 Play_CMD[]={0xFF,0x55,0x03,0x02,0x00,0x01,0xFA};"
l=3+string[2]; //string[2]-длина команды
При втором способе - 0х00 проходит, но передается на 2 байта меньше, Если пример приведен полностью верный, то string[2] тут равно 0x03, соотвественно l = 6, а 'i' будет перебирать индексы от 0 до 5. В вашей же строке 7 символов.
--------------------
Пасу котов...
|
|
|
|
|
Aug 23 2006, 16:01
|

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

|
Цитата(EXeGLuMATOR @ Aug 23 2006, 18:12)  реально выглядит так: Смею утверждать, что реально у Вас выглядит не так, как Вы пытаетесь здесь описать. Попробуйте для начала внимательно ПЕРЕЧИТАТЬ свои исходные тексты. Очень похоже :-( что написали Вы одно, думаете, что написали другое, а сюда постите третье :-(
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 23 2006, 17:08
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(zltigo @ Aug 23 2006, 20:01)  Цитата(EXeGLuMATOR @ Aug 23 2006, 18:12)  реально выглядит так:
Смею утверждать, что реально у Вас выглядит не так, как Вы пытаетесь здесь описать. Попробуйте для начала внимательно ПЕРЕЧИТАТЬ свои исходные тексты. Очень похоже :-( что написали Вы одно, думаете, что написали другое, а сюда постите третье :-( Ну вот... сразу подозрения... Просто это мой второй проект на АРМе - управление плеером iPOD. Разобрался... Если кто встрянет на такую засаду - вот код, который корректно все передает... const char *puts1(const char *string) { unsigned char ch; u08 i,l,c; c=string[2]; l=4+c; for (i=0;i<l;i++) { ch = *string; while (!(U1LSR & ULSR_THRE)); U1THR = ch; while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE)); string++; }; return string; } int uart1TxEmpty(void) { return (U1LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT); }
|
|
|
|
|
Aug 23 2006, 17:53
|

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

|
Цитата(EXeGLuMATOR @ Aug 23 2006, 20:08)  Если кто встрянет на такую засаду - вот код, который корректно все передает... Долго методом тыка чего-то писалось :-( Вообще-то "это" нормально выглядит так: Код const char *puts1( const char *string ) { int len = string[2] + 4; for( int i=0; i<len; i++, string++ ) { while( !(U1LSR & ULSR_THRE) ); U1THR = *string; }; return( string ); }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2006, 18:32
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
[/quote] Долго методом тыка чего-то писалось :-( Вообще-то "это" нормально выглядит так: [/quote] Какие все крутые... Надо же поумничать до полного осознания собственной крутости... Если знал о чем речь, что сразу не сказал? А то: [/quote] Смею утверждать, что реально у Вас выглядит не так, как Вы пытаетесь здесь описать. Попробуйте для начала внимательно ПЕРЕЧИТАТЬ свои исходные тексты. Очень похоже :-( что написали Вы одно, думаете, что написали другое, а сюда постите третье :-( [/quote] Умиляет просто такой подход... Чтобы самому подняться надо кого-то опустить. Для того форумы и существуют, чтобы те кто имеет мало опыта/знаний могли пробелы восполнить. Кстати этот код не даст нужного результата. Гы...
|
|
|
|
|
Aug 24 2006, 19:11
|

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

|
Цитата(EXeGLuMATOR @ Aug 24 2006, 21:32)  Умиляет просто такой подход... Чтобы самому подняться надо кого-то опустить. Если знал о чем речь, что сразу не сказал? Любезный! Вы полагаете, что по Вашим первоначальным постам можно было что-то понять? Из последнего "исходника" мною просто был поскипан весь бред. Цитата Надо же поумничать до полного осознания собственной крутости... Расслабтесь - умение связно написать несколько строчек на "C", равно, как и на русском языке, признаком крутости в моих глазах не является. Цитата Кстати этот код не даст нужного результата. Гы...  О чем это? "Великий и могучий русский языка" - с трудом понимаю :-(. Если поскипаный бред в результате вносимых задержек приводил к работоспособности чего-то, то это просто свидетельстует о Вашем незнании того девайса с которым работаете а не о несуществующих "проблемах" контроллера.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2006, 19:46
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
[quote name='zltigo' date='Aug 24 2006, 23:11' post='147677'] [/quote] О чем это? "Великий и могучий русский языка" - с трудом понимаю :-(. Если поскипаный бред в результате вносимых задержек приводил к работоспособности чего-то, то это просто свидетельстует о Вашем незнании того девайса с которым работаете а не о несуществующих "проблемах" контроллера. [/quote] В том-то и дело, что даже желания понять нету - только поумничать бы..  А о проблемах контроллера никто и не говорит. Есть особенности его программирования и все. Недокументированные практически.  А приведенный Вами  фрагмент даст тот-же результат, что и мой код в самом первом варианте. Все равно данные будут "застревать". Проверено. Почему? - Вы грамотная знатока русской языка. Думаю не составит труда разобраться. Я разобрался. А код, да... Изящно. Респект.  Есть чему поучиться...
|
|
|
|
|
Aug 24 2006, 19:58
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(zltigo @ Aug 24 2006, 23:50)  Цитата(EXeGLuMATOR @ Aug 24 2006, 22:46)  Все равно данные будут "застревать". Проверено.
Не морочьте людям голову. Вот-вот... Не надо морочить... Тема себя исчерпала. Вопрос закрыт.
|
|
|
|
|
Aug 24 2006, 20:42
|

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

|
Цитата(GetSmart @ Aug 24 2006, 23:30)  zltigo, опять издеваетесь над людьми?  А читать написанное Автором с претензией на "сокровенные знания" не пробовали :-). Попробуйте прочитать! - хотелось-бы получить урок "мягкоти" и "доброты" в оценке таких творений: Код const char *puts1(const char *string) {
unsigned char ch; u08 i,l,c; c=string[2]; l=4+c; for (i=0;i<l;i++) { ch = *string; while (!(U1LSR & ULSR_THRE)); U1THR = ch; while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE)); string++; }; return string; }
int uart1TxEmpty(void) { return (U1LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT); } Знаю, что грешен :-(, но пройти мимо такого не смог :-(
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 24 2006, 21:29
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Добро, зло... Гесер, Завулон... Эх... Вы, господин так ничего и не поняли... Специально потратил время на попробовать... код void puts11(const char *Mes, int Len) { int i; for(i=0; i<Len; i++, Mes++) { while (!(U1LSR & ULSR_THRE)); U1THR = *Mes; while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE)); }; } работает корректно. Полностью корректно. код void puts11(const char *Mes, int Len) { int i; for(i=0; i<Len; i++, Mes++) { while (!(U1LSR & ULSR_THRE)); U1THR = *Mes; }; } Который собсно и есть то, что Вы предложили - работает некорректно, поскольку не отслеживает правильно опустошение буфера передачи, почему - отдельная тема, но так есть. Проверь то, что Вы написал  в работе, хотя-бы на симуляторе, убедишься. Застревает последний байт сообщения. Понимаю конечно, что ваш вариант передачи полностью передран из примеров и верен по определению, но надо иметь и воображение. Добро... Зло... Хвост!!!
|
|
|
|
|
Aug 24 2006, 21:49
|

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

|
Цитата(EXeGLuMATOR @ Aug 25 2006, 00:29)  Специально потратил время на попробовать... Рекомендую еще потратить время на разборки с тем где в "попробовать" ошибка вышла. Одно радует, что исходный код уже причесали :-). Осталось муть голубую выкинуть: Цитата while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE)); Если вдруг "проблемы" - то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 25 2006, 17:27
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
Цитата(zltigo @ Aug 25 2006, 01:49)  Цитата(EXeGLuMATOR @ Aug 25 2006, 00:29)  Специально потратил время на попробовать...
Рекомендую еще потратить время на разборки с тем где в "попробовать" ошибка вышла. Одно радует, что исходный код уже причесали :-). Осталось муть голубую выкинуть: Цитата while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE)); Если вдруг "проблемы" - то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile". Мда.. бывают же люди... Понты, понты... И круче только яйца... А из аргументов - "такого не может быть, потому что не может быть никогда!". Неконструктивно. Считаете что так неправильно - ну так объясните убогим и тупым в чем проблема! Спуститесь с небес на нашу грешную! Где конструктивная критика? Конструктивные замечания? А так - ну считайте... флаг, барабан, все аксессуары. Одна вода и абстракция...  А код причесывать - это после того как он заработает. Код на этапе разработки и релиз - две большие разницы. Думаю в данной теме все всё для себя выяснили. Хватит Вам уже за строгого клоуна работать - народ развлекать.
Сообщение отредактировал EXeGLuMATOR - Aug 25 2006, 17:29
|
|
|
|
|
Aug 25 2006, 17:46
|

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

|
Цитата(EXeGLuMATOR @ Aug 25 2006, 20:27)  - ну так объясните убогим и тупым в чем проблема! Уже отвечал. Повторяю для "особо".... Это главная "проблема": Цитата что написали Вы одно, думаете, что написали другое, а сюда постите третье :-( Это что делать: Цитата то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile" Если для Вас это пустой звук - продалжайте стучать в бубен, только не надо своими "открытиями" сделанными в "результате" "делится".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 4 2006, 12:28
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 15-05-06
Пользователь №: 17 104

|
zltigo, не сочтите за труд разъяснить, чем грозит отсутствие volatile? "Оптимизацией" со стороны компилятора, который будет принимать U1LSR за обычную ячейку памяти? Я в правильную сторону думаю?
|
|
|
|
|
Sep 11 2006, 18:19
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305

|
О! Пошел конструктив! Это радует. Значит таки можно с Вами общаться. Цитата то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile" Наше определение - это то что в LPC2103.h Все там определено. Компилер - Кейл. CARM. Соотв все из его поставки. #define U1LSR (*((volatile unsigned char *) 0xE0010014)) Что не так?
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|