Код:
#include "lib_AT91SAM7S64.h"
...
AT91F_US0_CfgPIO();
AT91F_US0_CfgPMC();
AT91F_US_EnableIt(US_PORT, AT91C_US_RXBUFF | AT91C_US_TIMEOUT);
AT91F_US_Configure(US_PORT, MCK, AT91C_US_ASYNC_MODE, BR , 0);
//USART_BAUD_RATE
AT91F_US_ResetRx(US_PORT);
AT91F_US_ResetTx(US_PORT);
// Loop forever
for (;;) {
AT91C_BASE_PIOA->PIO_CODR = LED1; // Clear 1 (= Save 0) to PA17
wait();
AT91C_BASE_PIOA->PIO_SODR = LED1; // Save 1 to PA17
wait();
if ((AT91C_BASE_PIOA->PIO_PDSR & SW1) == 0) { /* Check if SW1 is pressed */
AT91C_BASE_PIOA->PIO_CODR = LED2; /* Turn On LED2 */
wait();
//printf('A\n');
while (!AT91F_US_TxReady(US_PORT));
AT91F_US_PutChar(US_PORT,'A');
} else {
AT91C_BASE_PIOA->PIO_SODR = LED2; /* Turn Off LED2 */
wait();
}
if ((AT91C_BASE_PIOA->PIO_PDSR & SW2) == 0) { /* Check if SW2 is pressed */
if (AT91F_US_RxReady(US_PORT))
{ c = AT91F_US_GetChar(US_PORT);}
else {c = 'F';}
while (!AT91F_US_TxReady(US_PORT));
AT91F_US_PutChar(US_PORT,c);
AT91C_BASE_PIOA->PIO_CODR = LED2; /* Turn On LED2 */
wait();
} else {
AT91C_BASE_PIOA->PIO_SODR = LED2; /* Turn Off LED2 */
wait();
}
}
Вот этот код символы передаёт. По нажатию на кнопку №1 на терминале появляется символ 'A'.
Однако обратная передача (с терминала на МК) не работает. По нажатию на кнопку №2 (должно происходить чтение символа и возвращение его на обратно на терминал) возвращается 'F'. И вообще, такое ощущение, что PUTTY ничего не передаёт (судя по курсору).
HyperTerminal тоже ведет себя странно. Он подключается, только когда снята галка "Detect Carrier Loss". В этом случае при нажатии кнопок №1 и №2 символы 'А' и 'F' появляются. А если галку поставить, то пишет "Unable to Open COM18. Please check your port settings".
Есть версия, что это из-за не подсоединённых RTS и CTS (на макетной плате к МК линии не подсоединены). Но с другой стороны, вероятно, плату тестировали? Т.е. всё должно работать.