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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблема с 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
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

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

 


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


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