|
Проблема с 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МГц. Кейл.
|
|
|
|
|
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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|