Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S256 и RS485 ...ерунда какая-то
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
PrSt
Люди - подскажите что не впорядке?
вот я инициализирую RS485
// usart1->US_MR = 0x08c0; // rs232
usart1->US_MR = 0x08c1; // rs485
надо заметить, что код программы идеально работает когда идет обмен по RS232
я надеясь на то что 485 у камня аппаратный его же и хочу использовать - а тут такой кастыль...

при этом вроде бы как все работает, да не так как нужно, а именно вот какая проблема
когда идет посылка RTS дергается - вижу осцилом, все вроде - ок
пакеты уходит, ему отвечают, он принимает, но...
корректно по протоколу(своему) принимает только маленькие пакеты до гдето 15 байт
если пакет больше - то там содержимое какоето не понятное и вообще архинепонятное в конце посылки...

что это все может быть?
aaarrr
С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника.
PrSt
Цитата(aaarrr @ Jun 13 2006, 13:07) *
С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника.

всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах
с ним вроде все ок или вы имели ввиду что то иное?

вот что касается скорости то - это на скорости 9600
а на 115200 - просто затык
вот это вообще не ясно такое впечатление как будто линия не согласована
Nicholas
Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё RTS должен дёргаться на всю посылку. Нет ли переполнения буфера? Очень похоже на левые скорости или отсутствие терминаторов на линии. Ну и код инициализации в студию.
PrSt
Цитата(Nicholas @ Jun 14 2006, 14:35) *
Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё RTS должен дёргаться на всю посылку. Нет ли переполнения буфера? Очень похоже на левые скорости или отсутствие терминаторов на линии. Ну и код инициализации в студию.

RTS действительно деркается вроде как надо бы...
терминаторов действиельно нет
их установка ни чего не меняет

вот моя процедура переинициализации

void init_ComPort1_reinit(unsigned long value){ // Init USART (COM_1) RE_INIT

AT91PS_USART usart1 = AT91C_BASE_US1;
AT91PS_PIO usart1_pio = AT91C_BASE_PIOA;
AT91PS_PMC pmc = AT91C_BASE_PMC;
AT91PS_PDC pdc = AT91C_BASE_PDC_US1;

//Disable usart
usart1->US_CR = 0x00;

//enable the clock of USART
pmc->PMC_PCER = 1<<AT91C_ID_US1;
//set baud rate divisor register

/*
скорость=Fкварца/(CD*16)
CD=Fкварца/(скорость*16)
CD скорость Fкварца
960 1200 18432000
480 2400 18432000
120 9600 18432000
80 14400 18432000
30 38400 18432000
20 57600 18432000
10 115200 18432000 */

// usart1->US_BRGR = 0xA; //((18432000)/115200x16)
usart1->US_BRGR = value;

//write the Timeguard Register
usart1->US_TTGR = 0;

//Set the USART mode
// usart1->US_MR = 0x08c0; // rs232
usart1->US_MR = 0x08c1; // rs485

//Enable the RX and TX PDC transfer requests
pdc->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;

//Enable usart
usart1->US_CR = 0x50;

// Init IO
// Disable PIO on DBGU pins
usart1_pio->PIO_PDR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_PER &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// Enable peripheral A on DBGU pins
usart1_pio->PIO_ASR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_BSR &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// enableRxInterrupt
usart1->US_IER |= AT91C_US_RXRDY;
usart1->US_IDR &= ~AT91C_US_RXRDY;

}
Master
Цитата(PrSt @ Jun 15 2006, 08:55) *
RTS действительно деркается вроде как надо бы...
терминаторов действиельно нет
их установка ни чего не меняет
Надеюсь, это не голые слова.
Цитата
вот моя процедура переинициализации
...
// Init IO
// Disable PIO on DBGU pins
usart1_pio->PIO_PDR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_PER &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// Enable peripheral A on DBGU pins
usart1_pio->PIO_ASR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_BSR &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// enableRxInterrupt
usart1->US_IER |= AT91C_US_RXRDY;
usart1->US_IDR &= ~AT91C_US_RXRDY;

}
А вот это реальный шедевр! Просто зачОт какой-то laugh.gif
Чисто чтоб поржать biggrin.gif давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.
PrSt
[quote name='Master' date='Jun 15 2006, 09:53' post='123869']
...
// Init IO
// Disable PIO on DBGU pins
usart1_pio->PIO_PDR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_PER &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// Enable peripheral A on DBGU pins
usart1_pio->PIO_ASR |= (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);
usart1_pio->PIO_BSR &= ~(AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA24);

// enableRxInterrupt
usart1->US_IER |= AT91C_US_RXRDY;
usart1->US_IDR &= ~AT91C_US_RXRDY;

}
[/quote]А вот это реальный шедевр! Просто зачОт какой-то laugh.gif
Чисто чтоб поржать biggrin.gif давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.
[/quote]
ну и что за юмор?
все же в порядке здесь.
Nicholas
Ну незнаю как тут насчёт поржать. Но вообще-то PDR и PER доступны только на запись. Когда вы делаете |= это означает, что он сначала читается. Я таким счастьем не страдал, но мне кажется ничего хорошего из него не прочитается. Да и просто не надо это. Если вам надо что-то запретить - пишите в PDR единички. Разрешить - в PER. Совместная запись здесь ни к чему.
Если не понятно изъясняюсь - вот код инита обычного уарта (для примера):

int usart1_Init(void)
{
//Setup USART1

//setup power management controller
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_US1);

//Enable RxD & TxD pins
AT91C_BASE_PIOA->PIO_PDR= AT91C_PA21_RXD1 | AT91C_PA22_TXD1;

AT91C_BASE_US1->US_CR = AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */

AT91C_BASE_US1->US_MR = AT91C_US_USMODE_NORMAL | /* Normal Mode */
AT91C_US_CLKS_CLOCK | /* Clock = MCK */
AT91C_US_CHRL_8_BITS | /* 8-bit Data */
AT91C_US_PAR_NONE | /* No Parity */
AT91C_US_NBSTOP_1_BIT; /* 1 Stop Bit */

AT91C_BASE_US1->US_BRGR = USART1_BRD; /* Baud Rate Divisor */

//* open Usart 1 interrupt

//* Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = (1<<AT91C_ID_US1);
//* Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US1] = (unsigned int) & USART1_IRQ_Handler ;
//* Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US1] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | USART1_INTERRUPT_PRIORITY;
//* Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_US1);

//enable interrupt in AIC
AT91C_BASE_AIC->AIC_IECR =(1<<AT91C_ID_US1);

//interrupt mask
AT91C_BASE_US1->US_IER= AT91C_US_RXRDY ;

AT91C_BASE_US1->US_CR = AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */

return 0;

}
Master
Цитата(PrSt @ Jun 15 2006, 12:58) *
Цитата
... давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.

ну и что за юмор?
все же в порядке здесь.
Чувствуется, обидел. Хотя не хотел. Просто было весело. Причём настолько, что забыл даже упомянуть то, о чём не забыл Nicholas - нужно уберать чтение перез записью.
defunct
Цитата
надо заметить, что код программы идеально работает когда идет обмен по RS232


Можно здесь уточнить. Имеется в виду что RS485 драйвер подключен к UART'у, а последний просто настроен на работу без аппаратного RTS? Или вы проверяли режим 232 через драйвер RS232?

Цитата
всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах
с ним вроде все ок или вы имели ввиду что то иное?

Что значит драйвер используется в других приборах? Вас спросили о преобразователе уровней UART <> RS485 микросхемка такая. Так вот конкретно в этом девайсе она у вас правильно подключена и 100% работоспособная?
PrSt
Цитата(defunct @ Jun 15 2006, 23:30) *
Цитата
надо заметить, что код программы идеально работает когда идет обмен по RS232


Можно здесь уточнить. Имеется в виду что RS485 драйвер подключен к UART'у, а последний просто настроен на работу без аппаратного RTS? Или вы проверяли режим 232 через драйвер RS232?

Цитата
всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах
с ним вроде все ок или вы имели ввиду что то иное?

Что значит драйвер используется в других приборах? Вас спросили о преобразователе уровней UART <> RS485 микросхемка такая. Так вот конкретно в этом девайсе она у вас правильно подключена и 100% работоспособная?


да - я проверял через драйвер RS232 - все работает отлично.
микросхема ADM485AR, работоспособная и подключена правельно.
rezident
Я не знаком с этим SAMом, но у меня практически-теоретический попутный вопрос возник. RTS управляет DE? Т.е. направлением передачи ADM485? А в какой момент устанавливается/снимается RTS? Когда последний байт в сдвиговый регистр UART поступил или когда последний бит из сдвигового регистра UART был выдвинут или все же когда был сформирован последний стоп-бит последнего символа?
beer_warrior
Цитата
А в какой момент устанавливается/снимается RTS?

Хороший вопрос smile.gif Привязан к биту TX_EMPTY. а тот ставится по старту, снимается после стопа + таймгард. Таймгард в приведенном коде 0, что не мешало бы изменить.
PrSt
Цитата(rezident @ Jun 16 2006, 11:44) *
Я не знаком с этим SAMом, но у меня практически-теоретический попутный вопрос возник. RTS управляет DE? Т.е. направлением передачи ADM485?

управляет (DE соедененым с RE)
beer_warrior
BTW.
А сама микросхема приемника какая?
И к какому питанию подключена?
rezident
Цитата(PrSt @ Jun 16 2006, 19:12) *
Цитата(rezident @ Jun 16 2006, 11:44) *

Я не знаком с этим SAMом, но у меня практически-теоретический попутный вопрос возник. RTS управляет DE? Т.е. направлением передачи ADM485?

управляет (DE соедененым с RE)

Я понимаю, что у ADM485 входы DE и RE соединены, а какой сигнал ими обоими управляет-то?
aaarrr
А прием чем ведется? Компьютером, или таким же устройством?

Цитата(PrSt @ Jun 16 2006, 17:12) *
управляет (DE соедененым с RE)

Может быть, дело в неподтянутом выходе RO?
PrSt
Цитата(beer_warrior @ Jun 16 2006, 16:35) *
BTW.
А сама микросхема приемника какая?
И к какому питанию подключена?

микросхема ADM485
питание 5В
defunct
Цитата(PrSt @ Jun 16 2006, 09:51) *
да - я проверял через драйвер RS232 - все работает отлично.
микросхема ADM485AR, работоспособная и подключена правельно.
..
управляет (DE соедененым с RE)


Вот, а теперь можете усложнить задачу. Оставить режим 232, но выходы УАРТа подключить к ADM485. Программно взводить RTS при отправке, и сбрасывать RTS после отправки. Должно работать. Также примите во внимание сообщение aaarrr (подтяните вывод RO к питанию, не важно к +5 или к +3.3 ).

После того как в таком тесте пойдет передача данных, можете включать режим 485.
beer_warrior
У меня сейчас на столе, точно такая же игрушка. Работает весьма цивильно на 9600 при пакете 512 байт. Питание 5В. Терминаторов и смещения нет, на другом конце FTDI232 с ST485.Единственная оговорка - за занятостью ног, направлением щелкаю программно и все работает тип-топ.
(К моему вопросу по USART - нахомутал в вызове/завершении прерывания и маскировании флагов).
Имхо стоит поиграться таймгардом и ,как советует коллега defunct,попробовть жестко установить направление и испытывать в однонаправленном режиме.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.