Перейти к содержанию
    

Проблема со "старшими" портами USART на xmega128a1 и xmega128a1u

Здравствуйте, помогите разобраться 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');

}

}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даташит утверждает, что это всe полноценные USARTы.

Правильно утверждает.

В одном из проектов на ATxmega128A1U задействованы 6 USARTов и 2 SPI.

Все работают штатно.

 

PORTF_OUTSET = PIN6_bm;

PORTF_DIRSET = PIN6_bm;

PORTF_OUTCLR = PIN7_bm;

PORTF_DIRCLR = PIN7_bm;

Уточните где RXD и TXD и не изменяются ли другие биты регистра при такой записи "PORTF_DIRSET = PIN6_bm"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибоб уважаемый zombi!! Вы действительно правы, моя банальная невнимательность

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...