群里PIC的大虾们,,下面那段UART程序通信不上,请帮忙看是否程序的问题,谢谢!
/**********************************************
File name :30f2010.c
Chip type :Dspic30f2010
edition :1.0
Program type :Application
Clock frequency :20.000000MKz
Memory model :Small
External SRAM size :512
Data Stack size :1024
**********************************************/
#include"p30f2010.h"
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define RB2 PORTBbits.RB2 //发送指示灯控制端口
#define RB3 PORTBbits.RB3 //接收指示灯控制端口
#define RB4 PORTBbits.RB4
#define FERR U1STAbits.FERR //帧错误位
#define PERR U1STAbits.PERR //奇偶校验错误位
#define OERR U1STAbits.OERR //接收缓冲器溢出状态位
#define RX_BUFFER_SIZE 8 //接收缓冲区大小
#define TX_BUFFER_SIZE 8
uchar rx_buffer[RX_BUFFER_SIZE]; //定义接受缓冲区
uchar tx_buffer[TX_BUFFER_SIZE];
uchar rx_wr_index,rx_rd_index,rx_counter; //写指针,读指针,存放在队列中已接收到的字符个数
uchar rx_temp,tx_remp,tx_counter,tx_rd_index;
uint rec_counter,kgbzw,pwmbzw,spwmbzw,lampbzw,lampsum,key,t1_counter,timesum,pwm_temp;
uint rx_buffer_overflow; //接收缓冲区溢出标志
/*****************************延时程序***********************************/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=1250;b>0;b--);
}
/****************************UART初始化子程序*********************/
void init_UART(void)
{
U1MODE=0X8080 ; //使能UART模块,8个数据位,一个停止位
U1STA=0X14C0 ; //状态控制寄存器
U1BRG=129 ; //((FCY/16)/BAUD)-1 =129.21设置波特率=BAUD
IPC2bits.U1TXIP = 5 ; // 设置uart1发送接收中断优先级为5
IPC2bits.U1RXIP = 5 ; // 设置uart1接收中断优先级为5
U1STAbits.UTXEN=1 ; //发送使能
IEC0bits.U1TXIE=1 ; //发送中断使能
IEC0bits.U1RXIE=1 ; //接收中断使能
//IFS0bits.U1TXIF = 0 ; // 清UART1发送中断标志位
//IFS0bits.U1RXIF = 0 ; // 清UART1接收中断标志位
}
/****************************接收中断服务程序*******************/
void __attribute__((__interrupt__)) __U1RXInterrupt(void)
{
uchar status,data;
status=U1STA; // 读取接收状态标志位,必须先读,当读了RXREG后,U1STA就自动清零
data=U1RXREG; //读取数据接收缓冲寄存器
RB3=1; //接收指示灯亮
//判断收到字符是否有数据帧、校验或数据溢出错误
if((status&(FERR|PERR|OERR))==0)
{
rx_buffer[rx_wr_index]=data; //将字符填充到接收缓冲队列中
if(++rx_wr_index==RX_BUFFER_SIZE) //指针指向下一单元,并判断是否到队列的尾部
//(不表示接收缓冲区是否满)
rx_wr_index=0; //到了尾部,指向头部(构成环状)
if(++rx_counter==RX_BUFFER_SIZE) // 队列中收到字符加1,并判断是否队列已满
{ //队列满了
rx_counter=0; //队列中收到字符个数为0,表示队列中所有以前的数据作废,
//这是因为最后数据已经把前面数据覆盖了
rx_buffer_overflow=1; //置位溢出标志,在主程序中必要地
//方需要判断该标志,一证明所读数据的完整性
RB3=0; //接收指示灯灭
}
}
}
void RX_LED_ON(void)
{
RB3=1; //接收灯亮
delay(500); //延时500ms
RB3=0;
}
/****************************发送中断服务程序*******************/
void __attribute__((__interrupt__)) __U1TXInterrupt(void)
{
if(tx_counter)
{ //发送队列中还有未发送的数据
--tx_counter; //末发送数据减1
U1TXREG=tx_buffer[tx_rd_index]; //发送一个数据
if(++tx_rd_index==TX_BUFFER_SIZE) tx_rd_index=0; //读指针指向下一个未发送的数据,
//如果指到了队列尾部,则回到队列头部
}
}
/***************** MAIN ROUTINE(主程序)**************************/
int main()
{
init_UART();
while(1)
{
}
} |