1. Подскажите пожалуйста как программно сбрасывать контроллер? Достаточно ли просто укзать строку AT91C_BASE_RSTC->RSTC_RCR=((0xA5 << 24) | 1) ? Нужно ли перед этим конфигурировать? А то там еще и настроечные регисттры есть .... Когда я сбрасываю контроллер этой строкой то у меня просто проц замолкает .... приходится на плате нажимать кнопочку "ресет" ....
2. Как правильно пользоваться RS-485? У меня на палте уже есть 485, я только настраиваю US1 на него и все. Но на входе и выходе данные почему то получаются не те.
Инициализация:
Код
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US1 );
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA,
((unsigned int) AT91C_PA21_RXD1 ) |
((unsigned int) AT91C_PA22_TXD1 ) |
((unsigned int) AT91C_PA24_RTS1 ) ,
0 );
AT91C_BASE_US1->US_IDR = (unsigned int) -1;
AT91C_BASE_US1->US_CR = AT91C_US_RSTRX
| AT91C_US_RSTTX
| AT91C_US_RXDIS
| AT91C_US_TXDIS;
AT91F_US_SetBaudrate(AT91C_BASE_US1, MCK, USART_BAUD_RATE_14400);
AT91F_US_SetTimeguard(AT91C_BASE_US1, 0);
AT91F_PDC_Open((AT91PS_PDC) &(AT91C_BASE_US1->US_RPR));
AT91C_BASE_US1->US_MR = AT91C_US_ASYNC_MODEmy;
AT91C_BASE_US1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
AT91C_ID_US1,
USART_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_PDC_Open (AT91C_BASE_PDC_US1);
AT91C_BASE_US1->US_RPR = (unsigned int) BUFF_485_IN;
AT91C_BASE_US1->US_RCR = 100;
AT91C_BASE_US1->US_RTOR = 16;
AT91F_US_EnableIt(AT91C_BASE_US1, AT91C_US_TIMEOUT );
}
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA,
((unsigned int) AT91C_PA21_RXD1 ) |
((unsigned int) AT91C_PA22_TXD1 ) |
((unsigned int) AT91C_PA24_RTS1 ) ,
0 );
AT91C_BASE_US1->US_IDR = (unsigned int) -1;
AT91C_BASE_US1->US_CR = AT91C_US_RSTRX
| AT91C_US_RSTTX
| AT91C_US_RXDIS
| AT91C_US_TXDIS;
AT91F_US_SetBaudrate(AT91C_BASE_US1, MCK, USART_BAUD_RATE_14400);
AT91F_US_SetTimeguard(AT91C_BASE_US1, 0);
AT91F_PDC_Open((AT91PS_PDC) &(AT91C_BASE_US1->US_RPR));
AT91C_BASE_US1->US_MR = AT91C_US_ASYNC_MODEmy;
AT91C_BASE_US1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
AT91C_ID_US1,
USART_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_PDC_Open (AT91C_BASE_PDC_US1);
AT91C_BASE_US1->US_RPR = (unsigned int) BUFF_485_IN;
AT91C_BASE_US1->US_RCR = 100;
AT91C_BASE_US1->US_RTOR = 16;
AT91F_US_EnableIt(AT91C_BASE_US1, AT91C_US_TIMEOUT );
}
Код
#define AT91C_US_ASYNC_MODEmy ( AT91C_US_USMODE_RS485 + \
AT91C_US_NBSTOP_1_BIT + \
AT91C_US_PAR_EVEN + \
AT91C_US_CHRL_8_BITS + \
AT91C_US_CLKS_CLOCK )
AT91C_US_NBSTOP_1_BIT + \
AT91C_US_PAR_EVEN + \
AT91C_US_CHRL_8_BITS + \
AT91C_US_CLKS_CLOCK )
Отправляю просто набор байт с 0х00 до 0х0F и получаю на компе на входе: FF FD FB F9 F7 ... и тд до E1 .... В чем может быть проблема? Преобразователь на компе который стоит - работает нормально, проверен был ранее на других программах. Отправляю через PDC.
3. Как с помощью TC сделать какой-нибудь сигнал? Мне требуется формировать прямоугольные импульсы .... Может примерчик какой-нибудь маленький есть? Чтобы посмотреть как вобще строятся сигналы.
З.Ы. Забыл добавить .... Работаю в IAR плата с контролллером SAM7S64