Перейти к содержанию
    

AT91SAM7S256 и RS485 ...ерунда какая-то

Люди - подскажите что не впорядке?

вот я инициализирую RS485

// usart1->US_MR = 0x08c0; // rs232

usart1->US_MR = 0x08c1; // rs485

надо заметить, что код программы идеально работает когда идет обмен по RS232

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

 

при этом вроде бы как все работает, да не так как нужно, а именно вот какая проблема

когда идет посылка RTS дергается - вижу осцилом, все вроде - ок

пакеты уходит, ему отвечают, он принимает, но...

корректно по протоколу(своему) принимает только маленькие пакеты до гдето 15 байт

если пакет больше - то там содержимое какоето не понятное и вообще архинепонятное в конце посылки...

 

что это все может быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника.

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

с ним вроде все ок или вы имели ввиду что то иное?

 

вот что касается скорости то - это на скорости 9600

а на 115200 - просто затык

вот это вообще не ясно такое впечатление как будто линия не согласована

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё RTS должен дёргаться на всю посылку. Нет ли переполнения буфера? Очень похоже на левые скорости или отсутствие терминаторов на линии. Ну и код инициализации в студию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё 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;

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

Чисто чтоб поржать :biggrin: давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

// 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:

Чисто чтоб поржать :biggrin: давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.

ну и что за юмор?

все же в порядке здесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну незнаю как тут насчёт поржать. Но вообще-то 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;

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах.

ну и что за юмор?

все же в порядке здесь.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо заметить, что код программы идеально работает когда идет обмен по RS232

 

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

 

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

с ним вроде все ок или вы имели ввиду что то иное?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо заметить, что код программы идеально работает когда идет обмен по RS232

 

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

 

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

с ним вроде все ок или вы имели ввиду что то иное?

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

 

да - я проверял через драйвер RS232 - все работает отлично.

микросхема ADM485AR, работоспособная и подключена правельно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в какой момент устанавливается/снимается RTS?

Хороший вопрос :) Привязан к биту TX_EMPTY. а тот ставится по старту, снимается после стопа + таймгард. Таймгард в приведенном коде 0, что не мешало бы изменить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...