реклама на сайте
подробности

 
 
> Проблема с UART в LPC2103
EXeGLuMATOR
сообщение Aug 22 2006, 23:50
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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МГц. Кейл.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 22)
Andy Mozzhevilov
сообщение Aug 23 2006, 03:17
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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 символов.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 23 2006, 15:12
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



[/quote]

Если пример приведен полностью верный, то string[2] тут равно 0x03,
соотвественно l = 6, а 'i' будет перебирать индексы от 0 до 5. В вашей же строке 7 символов.
[/quote]

Это да... просто после экспериментов осталось... реально выглядит так:
l=4+string[2]; (l=7)
цикл: for (i=0;i<=l;i++)

Вот что получается при записи в порт нескольких команд (смотрю в симуляторе):
выполняется пошагово след.код:
puts1(Play_CMD);
puts1(Play_CMD);
puts1(Play_CMD);

После первой команды: FF 55 03 02 00 01
После второй команды: FF 55 03 02 00 01 FA FF FF 55 03 02 00 01
И после третьей: FF 55 03 02 00 01 FA FF FF 55 03 02 00 01 FA FF FF 55 03 02 00 01

исправляем:for (i=0;i<l;i++) - поскольку от 0 до 6 - нужные нам 7 элементов...

получаем:
После первой команды: FF 55 03 02 00
После второй команды: FF 55 03 02 00 01 FA FF 55 03 02 00
И после третьей: FF 55 03 02 00 01 FA FF 55 03 02 00 01 FA FF 55 03 02 00

Где застревают эти байтики? Мож с указателями что-то не так делаю?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 23 2006, 16:01
Сообщение #4


Гуру
******

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



Цитата(EXeGLuMATOR @ Aug 23 2006, 18:12) *
реально выглядит так:

Смею утверждать, что реально у Вас выглядит не так, как Вы пытаетесь здесь описать.
Попробуйте для начала внимательно ПЕРЕЧИТАТЬ свои исходные тексты. Очень похоже :-(
что написали Вы одно, думаете, что написали другое, а сюда постите третье :-(


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 23 2006, 17:08
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 23 2006, 17:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 24 2006, 18:32
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



[/quote]
Долго методом тыка чего-то писалось :-(
Вообще-то "это" нормально выглядит так:
[/quote]

Какие все крутые... Надо же поумничать до полного осознания собственной крутости... Если знал о чем речь, что сразу не сказал? А то:

[/quote]
Смею утверждать, что реально у Вас выглядит не так, как Вы пытаетесь здесь описать.
Попробуйте для начала внимательно ПЕРЕЧИТАТЬ свои исходные тексты. Очень похоже :-(
что написали Вы одно, думаете, что написали другое, а сюда постите третье :-(
[/quote]

Умиляет просто такой подход... Чтобы самому подняться надо кого-то опустить. Для того форумы и существуют, чтобы те кто имеет мало опыта/знаний могли пробелы восполнить. Кстати этот код не даст нужного результата. Гы... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 24 2006, 19:11
Сообщение #8


Гуру
******

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



Цитата(EXeGLuMATOR @ Aug 24 2006, 21:32) *
Умиляет просто такой подход... Чтобы самому подняться надо кого-то опустить.
Если знал о чем речь, что сразу не сказал?

Любезный! Вы полагаете, что по Вашим первоначальным постам можно было что-то понять?
Из последнего "исходника" мною просто был поскипан весь бред.
Цитата
Надо же поумничать до полного осознания собственной крутости...

Расслабтесь - умение связно написать несколько строчек на "C", равно, как и на русском языке,
признаком крутости в моих глазах не является.
Цитата
Кстати этот код не даст нужного результата. Гы... smile.gif

О чем это? "Великий и могучий русский языка" - с трудом понимаю :-(.
Если поскипаный бред в результате вносимых задержек приводил к работоспособности чего-то, то это просто свидетельстует о Вашем незнании того девайса с которым работаете а не о несуществующих "проблемах" контроллера.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 24 2006, 19:46
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



[quote name='zltigo' date='Aug 24 2006, 23:11' post='147677']
[/quote]
О чем это? "Великий и могучий русский языка" - с трудом понимаю :-(.
Если поскипаный бред в результате вносимых задержек приводил к работоспособности чего-то, то это просто свидетельстует о Вашем незнании того девайса с которым работаете а не о несуществующих "проблемах" контроллера.
[/quote]


В том-то и дело, что даже желания понять нету - только поумничать бы.. wink.gif А о проблемах контроллера никто и не говорит. Есть особенности его программирования и все. Недокументированные практически. sad.gif

А приведенный Вами wink.gif фрагмент даст тот-же результат, что и мой код в самом первом варианте. Все равно данные будут "застревать". Проверено. Почему? - Вы грамотная знатока русской языка. Думаю не составит труда разобраться. Я разобрался. А код, да... Изящно. Респект. wink.gif Есть чему поучиться... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 24 2006, 19:50
Сообщение #10


Гуру
******

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



Цитата(EXeGLuMATOR @ Aug 24 2006, 22:46) *
Все равно данные будут "застревать". Проверено.

Не морочьте людям голову.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 24 2006, 19:58
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(zltigo @ Aug 24 2006, 23:50) *
Цитата(EXeGLuMATOR @ Aug 24 2006, 22:46) *

Все равно данные будут "застревать". Проверено.

Не морочьте людям голову.


Вот-вот... Не надо морочить...

Тема себя исчерпала. Вопрос закрыт.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 24 2006, 20:30
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



zltigo, опять издеваетесь над людьми? smile.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 24 2006, 20:33
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(GetSmart @ Aug 25 2006, 00:30) *
zltigo, опять издеваетесь над людьми? smile.gif


О! Садюга... maniac.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 24 2006, 20:37
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Aug 25 2006, 00:30) *
zltigo, опять издеваетесь над людьми? smile.gif

zltigo, может быть, и резковат, но приведенный человеком код находится где-то за пределами добра и зла.

Сообщение отредактировал aaarrr - Aug 24 2006, 20:37
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 24 2006, 20:42
Сообщение #15


Гуру
******

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



Цитата(GetSmart @ Aug 24 2006, 23:30) *
zltigo, опять издеваетесь над людьми? smile.gif

А читать написанное Автором с претензией на "сокровенные знания" не пробовали :-).
Попробуйте прочитать! - хотелось-бы получить урок "мягкоти" и "доброты" в оценке таких творений:
Код
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
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 24 2006, 21:29
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 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;
};
}

Который собсно и есть то, что Вы предложили - работает некорректно, поскольку не отслеживает правильно опустошение буфера передачи, почему - отдельная тема, но так есть. Проверь то, что Вы написал wink.gif в работе, хотя-бы на симуляторе, убедишься. Застревает последний байт сообщения.
Понимаю конечно, что ваш вариант передачи полностью передран из примеров и верен по определению, но надо иметь и воображение.

Добро... Зло... Хвост!!! wink.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 24 2006, 21:49
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Aug 25 2006, 17:27
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 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".



Мда.. бывают же люди... Понты, понты... И круче только яйца... А из аргументов - "такого не может быть, потому что не может быть никогда!". Неконструктивно. Считаете что так неправильно - ну так объясните убогим и тупым в чем проблема! Спуститесь с небес на нашу грешную! Где конструктивная критика? Конструктивные замечания? А так - ну считайте... флаг, барабан, все аксессуары. Одна вода и абстракция... wink.gif А код причесывать - это после того как он заработает. Код на этапе разработки и релиз - две большие разницы.

Думаю в данной теме все всё для себя выяснили. Хватит Вам уже за строгого клоуна работать - народ развлекать.

Сообщение отредактировал EXeGLuMATOR - Aug 25 2006, 17:29
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 25 2006, 17:46
Сообщение #19


Гуру
******

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



Цитата(EXeGLuMATOR @ Aug 25 2006, 20:27) *
- ну так объясните убогим и тупым в чем проблема!

Уже отвечал. Повторяю для "особо"....
Это главная "проблема":
Цитата
что написали Вы одно, думаете, что написали другое, а сюда постите третье :-(

Это что делать:
Цитата
то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile"


Если для Вас это пустой звук - продалжайте стучать в бубен, только не надо своими "открытиями" сделанными в "результате" "делится".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
serj_obninsk
сообщение Sep 4 2006, 12:28
Сообщение #20


Участник
*

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



zltigo, не сочтите за труд разъяснить, чем грозит отсутствие volatile? "Оптимизацией" со стороны компилятора, который будет принимать U1LSR за обычную ячейку памяти? Я в правильную сторону думаю?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2006, 18:58
Сообщение #21


Гуру
******

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



Цитата(serj_obninsk @ Sep 4 2006, 15:28) *
чем грозит отсутствие volatile? "Оптимизацией" со стороны компилятора, который будет принимать U1LSR за обычную ячейку памяти?

Да и будет выбрасывать циклическое чтение.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 11 2006, 18:19
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



О! Пошел конструктив! Это радует. Значит таки можно с Вами общаться.


Цитата
то не сочите за труд осмотреть сгенеренный код, посмотреть на Ваше определение U1LSR и прочитать про "volatile"



Наше определение - это то что в LPC2103.h Все там определено. Компилер - Кейл. CARM. Соотв все из его поставки.
#define U1LSR (*((volatile unsigned char *) 0xE0010014))

Что не так?
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 11 2006, 20:23
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Кстати, опять аналогичные проблемы - теперь при приеме потока по сериалу... Причем как-то странно все... Кто может знает, есть ли особенности компилятора какие? А то что-то подозрительно... Кстати, есть у кого описание startup.s ? Просто очень странно - еще и таймеры 2 и 3 не инициализируются - вылетает по ошибке... А они таки есть...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01641 секунд с 7
ELECTRONIX ©2004-2016