реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема со "старшими" портами USART на xmega128a1 и xmega128a1u
Karnav
сообщение Apr 14 2017, 18:08
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 14-04-17
Пользователь №: 96 537



Здравствуйте, помогите разобраться c Tx! Rx работает на всех USART.
Мне нужно 4 USART, USARTE0,USARTE1,USARTF0,USARTF1.
После инициализации из работают только USARTE0 и USARTF0.
Проверял PORTC, на нем тоже только работает только USARTC0.
Проверял на xmega128a1 и xmega128a1u.

USARTC1, USARTE1, USARTF1 инициализирую аналогично с USARTE0, USARTF0, USARTC0
Даташит утверждает, что это всe полноценные USARTы.
CODE
#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 - Apr 15 2017, 12:59
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 14 2017, 19:45
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 937
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Karnav @ Apr 14 2017, 21:08) *
Даташит утверждает, что это вс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"
Go to the top of the page
 
+Quote Post
Karnav
сообщение Apr 15 2017, 13:58
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 14-04-17
Пользователь №: 96 537



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

Сообщение отредактировал IgorKossak - Apr 15 2017, 14:39
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2017 - 08:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016