simtrace2/sam3s_example/mains/usart.c

145 lines
3.8 KiB
C

#include "board.h"
#include "spi.h"
#include "pio.h"
#include "pmc.h"
#include "usart.h"
#define BUFFER_SIZE 20
const Pin statusled = {LED_GREEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
/*
* Describes the type and attribute of one PIO pin or a group of similar pins.
* The #type# field can have the following values:
* - PIO_PERIPH_A
* - PIO_PERIPH_B
* - PIO_OUTPUT_0
* - PIO_OUTPUT_1
* - PIO_INPUT
*
* The #attribute# field is a bitmask that can either be set to PIO_DEFAULt,
* or combine (using bitwise OR '|') any number of the following constants:
* - PIO_PULLUP
* - PIO_DEGLITCH
* - PIO_DEBOUNCE
* - PIO_OPENDRAIN
* - PIO_IT_LOW_LEVEL
* - PIO_IT_HIGH_LEVEL
* - PIO_IT_FALL_EDGE
* - PIO_IT_RISE_EDGE
*/
#if 0
typedef struct _Pin
{
/* Bitmask indicating which pin(s) to configure. */
uint32_t mask;
/* Pointer to the PIO controller which has the pin(s). */
Pio *pio;
/* Peripheral ID of the PIO controller which has the pin(s). */
uint8_t id;
/* Pin type. */
uint8_t type;
/* Pin attribute. */
uint8_t attribute;
} Pin ; */
#endif
/** Pins to configure for the application.*/
const Pin pins[] = { BOARD_PIN_USART_RXD,
BOARD_PIN_USART_TXD
// PIN_USART1_SCK,
// BOARD_PIN_USART_RTS,
// BOARD_PIN_USART_CTS,
// PINS_SPI,
// PIN_SPI_NPCS0_PA11
};
char Buffer[BUFFER_SIZE] = "Hello World";
/**
* \brief Configures USART in synchronous mode,8N1
* * \param mode 1 for master, 0 for slave
* */
static void _ConfigureUsart(uint32_t freq )
{
uint32_t mode;
/* MASTER; mode = US_MR_USART_MODE_NORMAL
| US_MR_USCLKS_MCK
| US_MR_CHMODE_NORMAL
| US_MR_CLKO
| US_MR_SYNC // FIXME: sync or not sync?
| US_MR_MSBF
| US_MR_CHRL_8_BIT
| US_MR_NBSTOP_1_BIT
| US_MR_PAR_NO ;
*/
// Slave mode:
mode = US_MR_USART_MODE_NORMAL
| US_MR_USCLKS_SCK // we don't have serial clock, do we?
| US_MR_CHMODE_NORMAL
// | US_MR_SYNC
| US_MR_MSBF
| US_MR_CHRL_8_BIT
| US_MR_NBSTOP_1_BIT
| US_MR_PAR_NO;
/* Enable the peripheral clock in the PMC */
PMC_EnablePeripheral( BOARD_ID_USART ) ;
/* Configure the USART in the desired mode @USART_SPI_CLK bauds*/
USART_Configure( BOARD_USART_BASE, mode, freq, BOARD_MCK ) ;
UART_Configure(9600, BOARD_MCK);
/* enable USART1 interrupt */
// NVIC_EnableIRQ( USART1_IRQn ) ;
/* Enable receiver & transmitter */
USART_SetTransmitterEnabled( BOARD_USART_BASE, 1 ) ;
USART_SetReceiverEnabled( BOARD_USART_BASE, 1 ) ;
}
int main() {
register int i = 0;
register int state = 0;
/* Configure pins */
// FIXME: initialize system clock done in lowlevelinit?
PIO_Configure(&statusled, PIO_LISTSIZE(statusled));
PIO_Clear(&statusled);
PIO_Configure( pins, PIO_LISTSIZE( pins ) ) ;
_ConfigureUsart( 1000000UL);
while(1) {
USART_WriteBuffer(BOARD_USART_BASE, Buffer, BUFFER_SIZE);
i = i+1;
if ((i%500000) == 0) {
switch(state) {
case 0:
PIO_Set(&statusled);
state=1;
break;
case 1:
PIO_Clear(&statusled);
state = 2;
break;
default:
state = 0;
}
}
}
// FIXME: do we need to call USARTEnable?
// FIXME: do we need to call USARTDisable?
return 0;
}