prst 0 13 июня, 2006 Опубликовано 13 июня, 2006 · Жалоба Люди - подскажите что не впорядке? вот я инициализирую RS485 // usart1->US_MR = 0x08c0; // rs232 usart1->US_MR = 0x08c1; // rs485 надо заметить, что код программы идеально работает когда идет обмен по RS232 я надеясь на то что 485 у камня аппаратный его же и хочу использовать - а тут такой кастыль... при этом вроде бы как все работает, да не так как нужно, а именно вот какая проблема когда идет посылка RTS дергается - вижу осцилом, все вроде - ок пакеты уходит, ему отвечают, он принимает, но... корректно по протоколу(своему) принимает только маленькие пакеты до гдето 15 байт если пакет больше - то там содержимое какоето не понятное и вообще архинепонятное в конце посылки... что это все может быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 13 июня, 2006 Опубликовано 13 июня, 2006 · Жалоба С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 14 июня, 2006 Опубликовано 14 июня, 2006 · Жалоба С AT91SAM7S64 проблем не наблюдалось. Если RTS дергается на всю длину посылки, стоит проверить драйвер. Также посмотрите соответствие битовой скорости передатчика и приемника. всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах с ним вроде все ок или вы имели ввиду что то иное? вот что касается скорости то - это на скорости 9600 а на 115200 - просто затык вот это вообще не ясно такое впечатление как будто линия не согласована Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick507 0 14 июня, 2006 Опубликовано 14 июня, 2006 · Жалоба Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё RTS должен дёргаться на всю посылку. Нет ли переполнения буфера? Очень похоже на левые скорости или отсутствие терминаторов на линии. Ну и код инициализации в студию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба Если на том же драйвере с той же линией всё работает, то смотрите скорости. И ещё 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 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба 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: Чисто чтоб поржать давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба ... // 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: Чисто чтоб поржать давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах. ну и что за юмор? все же в порядке здесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick507 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба Ну незнаю как тут насчёт поржать. Но вообще-то 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 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба ... давайте попробуем убрать каждую вторую строчку в последних трёх абзацах "процедуры переинициализации". Сообщите о результатах. ну и что за юмор? все же в порядке здесь. Чувствуется, обидел. Хотя не хотел. Просто было весело. Причём настолько, что забыл даже упомянуть то, о чём не забыл Nicholas - нужно уберать чтение перез записью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 15 июня, 2006 Опубликовано 15 июня, 2006 · Жалоба надо заметить, что код программы идеально работает когда идет обмен по RS232 Можно здесь уточнить. Имеется в виду что RS485 драйвер подключен к UART'у, а последний просто настроен на работу без аппаратного RTS? Или вы проверяли режим 232 через драйвер RS232? всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах с ним вроде все ок или вы имели ввиду что то иное? Что значит драйвер используется в других приборах? Вас спросили о преобразователе уровней UART <> RS485 микросхемка такая. Так вот конкретно в этом девайсе она у вас правильно подключена и 100% работоспособная? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба надо заметить, что код программы идеально работает когда идет обмен по RS232 Можно здесь уточнить. Имеется в виду что RS485 драйвер подключен к UART'у, а последний просто настроен на работу без аппаратного RTS? Или вы проверяли режим 232 через драйвер RS232? всмысле - "стоит проверить драйвер"? этот же драйвер у нас используется в других приборах с ним вроде все ок или вы имели ввиду что то иное? Что значит драйвер используется в других приборах? Вас спросили о преобразователе уровней UART <> RS485 микросхемка такая. Так вот конкретно в этом девайсе она у вас правильно подключена и 100% работоспособная? да - я проверял через драйвер RS232 - все работает отлично. микросхема ADM485AR, работоспособная и подключена правельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба Я не знаком с этим SAMом, но у меня практически-теоретический попутный вопрос возник. RTS управляет DE? Т.е. направлением передачи ADM485? А в какой момент устанавливается/снимается RTS? Когда последний байт в сдвиговый регистр UART поступил или когда последний бит из сдвигового регистра UART был выдвинут или все же когда был сформирован последний стоп-бит последнего символа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба А в какой момент устанавливается/снимается RTS? Хороший вопрос :) Привязан к биту TX_EMPTY. а тот ставится по старту, снимается после стопа + таймгард. Таймгард в приведенном коде 0, что не мешало бы изменить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба Я не знаком с этим SAMом, но у меня практически-теоретический попутный вопрос возник. RTS управляет DE? Т.е. направлением передачи ADM485? управляет (DE соедененым с RE) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба BTW. А сама микросхема приемника какая? И к какому питанию подключена? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться