[问题] xmega128a1 usartt传输疑问

楼主: papaya125 (都你说就好了)   2014-11-06 17:04:35
小弟最近在学习xmega的芯片,遇到许多困难
望大大们海量能教教我~~~~
小弟我基本架构已经完成了
基本上电脑可以接受到单芯片传出来的资料
但是我设置传出"33" 电脑串口助手显示 80 80 00
然后电脑端的串口助手输出"11"(希望灯1.3.5.7亮)时,也是跳到else(led灯全亮)
程式如下:
================程式分隔线====================
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//=======函数定义========
void USART_INIT (void);
uint8_t usart_rx (USART_t* _usart);
void usart_tx (USART_t* _usart,uint8_t data);
//由pc传送,单芯片接收指令
#define LED1357_ON 11
#define LED2468_ON 22
//PORT
#define USART_MAIN USARTE0
int main(void)
{
PORTJ_DIR=0xFF; //led enable
PORTJ_OUTSET=0xff; //led 设1 灯灭
USART_INIT();
sei(); //全局中断开启
while(1)
{
PORTJ_OUTSET = 0Xff; //led 设1 灯灭
usart_tx(&USART_MAIN,33); //向pc端送出讯号
_delay_ms(200) ;
}
}
//=========初始化usart=============
void USART_INIT (void)
{
PORTE.DIRSET = PIN3_bm; //TX 输出
PORTE.DIRCLR = PIN2_bm; //RX 输入
//控制模式选择= 异步 | 基偶校验关闭 | 停止位1位 | 长度8bit
USARTE0.CTRLC= 0X03 ;
USARTE0.BAUDCTRLA = 103; //波特率 9600
USARTE0.BAUDCTRLB = 0;
USARTE0.CTRLB= USART_RXEN_bm | USART_TXEN_bm ; //启用接收.传送.8bit
PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm;
USARTE0.CTRLA= USART_RXCINTLVL_HI_gc; //接收中断"高" 当单芯片的STATUS暂存器的RXCID被置位时,触发中断
}
//=========接收中断========
ISR(USARTE0_RXC_vect)
{
switch(usart_rx(&USART_MAIN))
{
case LED1357_ON:
PORTJ_OUTCLR = 0X55;
_delay_ms(100);
break;
case LED2468_ON:
PORTJ_OUTCLR = 0XAA;
_delay_ms(100);
break;
default: //上述皆无
PORTJ_OUTCLR = 0Xff;
_delay_ms(100);
break;
}
}
//=======中断后读取DATA=============
uint8_t usart_rx(USART_t* _usart) // uint8_t为0~255超过归0重来 (0x00~0xFF)
{
while(((_usart->STATUS)& USART_RXCIF_bm)==0); //_usart的成员STATUS读 "单芯片USART_RXCIF_bm地方" 的值,读到0时 表示有接收中断
return (_usart->DATA); //回传 _usart存取他的成员DATA(数据寄存器)
}
//===========发送中断=============
void usart_tx( USART_t* _usart , uint8_t data )
{
while (((_usart->STATUS) &USART_DREIF_bm)==0); //_usart的成员STATUS读 "单芯片USART_DREIF_bm地方" 的值,读到0时 表示有data
_usart->DATA=data; //_usart存取他的成员DATA(数据寄存器) =data
}
=====================程式结束===============
失败后 小弟第一直觉就是时间写错,于是改用外部晶振来控制一样失败
情况与上面一致
以下是小弟写的由外部晶振控制系统时间
============程式分隔线==================================
#ifndef F_CPU
#define F_CPU 20000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//=======函数定义========
void USART_INIT (void);
void Initial_colck_seting(void);
uint8_t usart_rx (USART_t* _usart);
void usart_tx (USART_t* _usart,uint8_t data);
//SWITCH
#define LED1357_ON 11
#define LED2468_ON 22
//PORT
#define USART_MAIN USARTE0
int main(void)
{
PORTJ_DIR=0xFF; //led enable
PORTJ_OUTSET=0xff; //led 设1 灯灭
Initial_colck_seting();
USART_INIT();
sei(); //全局中断开启
while(1)
{
PORTJ_OUTSET = 0Xff; //led 设1 灯灭
usart_tx(&USART_MAIN,33); //向pc端送出讯号
_delay_ms(200) ;
}
}
//=========初始化usart=============
void USART_INIT (void)
{
PORTE.DIRSET = PIN3_bm; //TX 输出
PORTE.DIRCLR = PIN2_bm; //RX 输入
//控制模式选择= 异步 | 基偶校验关闭 | 停止位1位 | 长度8bit
USARTE0.CTRLC= 0X03 ;
USARTE0.BAUDCTRLA = 129; //波特率 9600
USARTE0.BAUDCTRLB = 0;
USARTE0.CTRLB= USART_RXEN_bm | USART_TXEN_bm ; //启用接收.传送.8bit
PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm;
USARTE0.CTRLA= USART_RXCINTLVL_HI_gc; //接收中断"高" 当单芯片的STATUS暂存器的RXCID被置位时,触发中断
}
//=========接收中断========
ISR(USARTE0_RXC_vect)
{
switch(usart_rx(&USART_MAIN))
{
case LED1357_ON:
PORTJ_OUTCLR = 0X55;
_delay_ms(100);
break;
case LED2468_ON:
PORTJ_OUTCLR = 0XAA;
_delay_ms(100);
break;
default: //上述皆无
PORTJ_OUTCLR = 0Xff;
_delay_ms(100);
break;
}
}
//=======中断后读取DATA=============
uint8_t usart_rx(USART_t* _usa // uint8_t为0~255超过归0重来 (0x00~0xFF)
{
while(((_usart->STATUS)& USART_RXCIF_bm)==0); //_usart的成员STATUS读 "单芯片USART_RXCIF_bm地方" 的值,读到0时 表示有接收中断
return (_usart->DATA); //回传 _usart存取他的成员DATA(数据寄存器)
}
//===========发送中断=============
void usart_tx( USART_t* _usart , uint8_t data )
{
while (((_usart->STATUS) &USART_DREIF_bm)==0); //_usart的成员STATUS读 "单芯片USART_DREIF_bm地方" 的值,读到0时 表示有data
_usart->DATA=data; //_usart存取他的成员DATA(数据寄存器) =data
}
//==============时钟设定==================
void Initial_colck_seting(void) //PLL=倍频 XOSC=晶体振荡器
{
/* 振荡源与振荡频率设定 使用外部振荡器4MHZ + 5倍 PLL 使系统振荡频率为20MHZ*/
//系统时钟与时钟选项
CCP = CCP_IOREG_gc; // 配置更改保护注册 Protected IO register Configuration Change Protection Register
CLK.CTRL = CLK_SCLKSEL_XOSC_gc; //系统时钟选项=外部震荡
CLK.PSCTRL = 0; //分频 0=不分频
//振荡器
OSC.CTRL = OSC_PLLEN_bm | OSC_XOSCEN_bm; //振荡器 = 倍频 | 外部晶振
OSC.XOSCCTRL = OSC_XOSCSEL_XTAL_1KCLK_gc | OSC_FRQRANGE_2TO9_gc;// 外部振荡器= 选择和启动时间 | 震荡频率选择 2TO9
// 2TO9==>2MHz~9MHz 适用电容C1.C2=15pF
OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | OSC_PLLFAC4_bm ; //倍频设定=外部晶振 | 4倍
_delay_ms(100);
}

Links booklink

Contact Us: admin [ a t ] ucptt.com