Здравствуйте, помогите разобраться c Tx! Rx работает на всех USART.
Мне нужно 4 USART, USARTE0,USARTE1,USARTF0,USARTF1.
После инициализации из работают только USARTE0 и USARTF0.
Проверял PORTC, на нем тоже только работает только USARTC0.
Проверял на xmega128a1 и xmega128a1u.
USARTC1, USARTE1, USARTF1 инициализирую аналогично с USARTE0, USARTF0, USARTC0
Даташит утверждает, что это всe полноценные USARTы.
#include <avr/io.h>
#define F_CPU 32000000UL
//#define USART_CLK 115200L
#define USART_CLK 110400L
#include <util/delay.h>
unsigned char i,cnt,y, canal;
void setUpSerial()
{
USART_CHSIZE_8BIT_gc;
USARTC0.BAUDCTRLA=(F_CPU/(16*USART_CLK))-1; // baud rate calculation assuming that BSCALE=0;
USARTC0.BAUDCTRLB=0x00;
USARTE0.BAUDCTRLA=(F_CPU/(16*USART_CLK))-1; // baud rate calculation assuming that BSCALE=0;
USARTE0.BAUDCTRLB=0x00;
USARTE1.BAUDCTRLA=(F_CPU/(16*USART_CLK))-1; // baud rate calculation assuming that BSCALE=0;
USARTE1.BAUDCTRLB=0x00;
USARTF0.BAUDCTRLA=(F_CPU/(16*USART_CLK))-1; // baud rate calculation assuming that BSCALE=0;
USARTF0.BAUDCTRLB=0x00;
USARTF1.BAUDCTRLA=(F_CPU/(16*USART_CLK))-1; // baud rate calculation assuming that BSCALE=0;
USARTF1.BAUDCTRLB=0x00;
USARTC0_CTRLA = 0;
USARTE0_CTRLA = 0;
USARTE1_CTRLA = 0;
USARTF0_CTRLA = 0;
USARTF1_CTRLA = 0;
//8 data bits, no parity and 1 stop bit
USARTC0_CTRLC = USART_CHSIZE_8BIT_gc;
USARTE0_CTRLC = USART_CHSIZE_8BIT_gc;
USARTE1_CTRLC = USART_CHSIZE_8BIT_gc;
USARTF0_CTRLC = USART_CHSIZE_8BIT_gc;
USARTF1_CTRLC = USART_CHSIZE_8BIT_gc;
//Enable receive and transmit
USARTC0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode
USARTE0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode
USARTE1_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode
USARTF0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode
// USARTF1_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // And enable high speed mode
USARTF1_CTRLB = USART_TXEN_bm ;
PORTC_OUTSET = PIN3_bm;
PORTC_DIRSET = PIN3_bm;
PORTC_OUTCLR = PIN2_bm;
PORTC_DIRCLR = PIN2_bm;
PORTF_OUTSET = PIN3_bm;
PORTF_DIRSET = PIN3_bm;
PORTF_OUTCLR = PIN2_bm;
PORTF_DIRCLR = PIN2_bm;
PORTF_OUTSET = PIN6_bm;
PORTF_DIRSET = PIN6_bm;
PORTF_OUTCLR = PIN7_bm;
PORTF_DIRCLR = PIN7_bm;
PORTE_OUTSET = PIN3_bm;
PORTE_DIRSET = PIN3_bm;
PORTE_OUTCLR = PIN2_bm;
PORTE_DIRCLR = PIN2_bm;
PORTE_OUTSET = PIN6_bm;
PORTE_DIRSET = PIN6_bm;
PORTE_OUTCLR= PIN7_bm;
PORTE_DIRCLR = PIN7_bm;
}
void setClockTo32MHz()
{
OSC.CTRL = OSC_RC32MEN_bm; //0b00010 // enable 32MHz oscillator
while(!(OSC.STATUS & OSC_RC32MRDY_bm)); //0b00010 // wait for oscillator to be ready
CCP = CCP_IOREG_gc;//0xD8 // disable register security for clock update
CLK.CTRL = CLK_SCLKSEL_RC32M_gc; //0b001 // switch to 32MHz clock
}
void sendChar_USARTC0(char c)
{
while( !(USARTC0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTC0_DATA = c;
}
void sendChar_USARTF0(char c)
{
while( !(USARTF0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTF0_DATA = c;
}
void sendChar_USARTF1(char c)
{
while( !(USARTF1_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTF1_DATA = c;
}
void sendChar_USARTE0(char c)
{
while( !(USARTE0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTE0_DATA = c;
}
void sendChar_USARTE1(char c)
{
while( !(USARTE1_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTE1_DATA = c;
}
void sendString(char *text)
{
while(*text)
{
sendChar(*text++);
}
}
int main(void)
{
setUpSerial();
setClockTo32MHz();
while(1)
{
_delay_ms(500);
sendChar_USARTC0('R');
sendChar_USARTF0('S');
//_delay_ms(1);
sendChar_USARTE1('T');
//_delay_ms(1);
sendChar_USARTF1('M');
//_delay_ms(1);
sendChar_USARTE0('G');
}
}