|
Проблема с 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] Умиляет просто такой подход... Чтобы самому подняться надо кого-то опустить. Для того форумы и существуют, чтобы те кто имеет мало опыта/знаний могли пробелы восполнить. Кстати этот код не даст нужного результата. Гы...
|
|
|
|
Сообщений в этой теме
EXeGLuMATOR Проблема с UART в LPC2103 Aug 22 2006, 23:50      zltigo Цитата(EXeGLuMATOR @ Aug 24 2006, 21:32) ... Aug 24 2006, 19:11       EXeGLuMATOR [quote name='zltigo' date='Aug 24 2006... Aug 24 2006, 19:46        zltigo Цитата(EXeGLuMATOR @ Aug 24 2006, 22:46) ... Aug 24 2006, 19:50         EXeGLuMATOR Цитата(zltigo @ Aug 24 2006, 23:50) Цитат... Aug 24 2006, 19:58 GetSmart zltigo, опять издеваетесь над людьми? Aug 24 2006, 20:30 EXeGLuMATOR Цитата(GetSmart @ Aug 25 2006, 00:30) zlt... Aug 24 2006, 20:33 zltigo Цитата(GetSmart @ Aug 24 2006, 23:30) zlt... Aug 24 2006, 20:42  EXeGLuMATOR Добро, зло... Гесер, Завулон... Эх... Вы, господин... Aug 24 2006, 21:29   zltigo Цитата(EXeGLuMATOR @ Aug 25 2006, 00:29) ... Aug 24 2006, 21:49    EXeGLuMATOR Цитата(zltigo @ Aug 25 2006, 01:49) Цитат... Aug 25 2006, 17:27     zltigo Цитата(EXeGLuMATOR @ Aug 25 2006, 20:27) ... Aug 25 2006, 17:46      serj_obninsk zltigo, не сочтите за труд разъяснить, чем грозит ... Sep 4 2006, 12:28       zltigo Цитата(serj_obninsk @ Sep 4 2006, 15:28) ... Sep 4 2006, 18:58      EXeGLuMATOR О! Пошел конструктив! Это радует. Значит т... Sep 11 2006, 18:19 aaarrr Цитата(GetSmart @ Aug 25 2006, 00:30) zlt... Aug 24 2006, 20:37 EXeGLuMATOR Кстати, опять аналогичные проблемы - теперь при пр... Sep 11 2006, 20:23
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|