Estoy usando dos XMEGA256-A3BU en las placas Xplata XMEGA-A3BU. Mi objetivo es hacer posible MPCM (modo de comunicación multiprocesador) entre los dos usando su USART en modo síncrono.
Se conectan físicamente para que las PC1 (SCL), PC2 (RXD) y PC3 (TXD) del maestro se conecten a la PC1 (SCL), PC3 (TXD) y PC2 (RXD) del esclavo, respectivamente.
Utilizo el "servicio serie USART" de ASF 3.33 para hacer que la comunicación funcione.
Código de inicialización del maestro:
static usart_serial_options_t usart_options = {
.baudrate = 1200;
.charlength = USART_CHSIZE_8BIT_gc,
.paritytype = USART_PMODE_ODD_gc,
.stopbits = false
};
sysclk_enable_module(SYSCLK_PORT_C, PR_USART0_bm);
usart_serial_init(&USARTC0, &usart_options);
usart_set_mode(&USARTC0, USART_CMODE_SYNCHRONOUS_gc);
// Pin to set as output for clock signal.
ioport_configure_pin(IOPORT_CREATE_PIN(PORTC, 1), IOPORT_DIR_OUTPUT);
// Port to output clock signal on.
PORTCFG.CLKEVOUT = PORTCFG_CLKOUT_PC1_gc;
usart_set_rx_interrupt_level(&USARTC0, USART_RXCINTLVL_OFF_gc);
usart_set_tx_interrupt_level(&USARTC0, USART_TXCINTLVL_OFF_gc);
Código de inicialización del esclavo:
static usart_serial_options_t usart_options = {
.baudrate = 1200;
.charlength = USART_CHSIZE_8BIT_gc,
.paritytype = USART_PMODE_ODD_gc,
.stopbits = false
};
sysclk_enable_module(SYSCLK_PORT_C, PR_USART0_bm);
usart_serial_init(&USARTC0, &usart_options);
usart_set_mode(&USARTC0, USART_CMODE_SYNCHRONOUS_gc);
// Pin to set as input for clock signal.
ioport_configure_pin(IOPORT_CREATE_PIN(PORTC, 1), IOPORT_DIR_INPUT);
// Do not output the clock signal.
PORTCFG.CLKEVOUT = PORTCFG_CLKOUT_OFF_gc;
usart_set_rx_interrupt_level(&USARTC0, USART_RXCINTLVL_OFF_gc);
usart_set_tx_interrupt_level(&USARTC0, USART_TXCINTLVL_OFF_gc);
Utilizo usart_serial_putchar(&USARTC0, buffer[i])
y usart_serial_getchar(&USARTC0, &buffer[i])
para enviar y recibir datos para las pruebas, el diseño final usará DMA.
Para hacer funcionar el MPCM (y hacer posible agregar más esclavos al bus), sé que necesito cambiar al 1 bit de inicio + 9 bits de datos + paridad + 1 formato de bit de parada, y también sé que de alguna manera debería usar estas constantes que encontré en el archivo iox256a3bu.h
:
#define USART_MPCM_bm 0x02 /* Multi-processor Communication Mode bit mask. */
#define USART_MPCM_bp 1 /* Multi-processor Communication Mode bit position. */
¿Podría alguien ayudarme con algún código de ejemplo ASF? ¿Qué debo agregar para configurar la propia dirección del esclavo y dónde debo definir en el maestro a quién tengo intención de enviar el mensaje?