打印
[ZLG-ARM]

LPC2131UART中断发送问题!!!

[复制链接]
2082|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
win2000_li|  楼主 | 2007-2-27 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在初始化时,已经把发送中断与接收中断都打开了。为什么我发数据时。不进发送中断啊???数据也发不出去。但是接收是这常的。请高手们指点。。。。。

程序如下:
#include "config.h"

#define buffer 64

const uint32 LED1 = (1 << 18);    // P1.18控制LED1,低电平点亮

uint8 Err[]="abcdefgh";

/* 定义串口模式设置数据结构 */
typedef struct 
{
    uint8 datab;        // 字长度,5/6/7/8可选
    uint8 stopb;        // 停止位,1/2可选
    uint8 parity;        // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UartMode;

typedef struct 
{
    uint8 RxBuffer[buffer], TxBuffer[buffer]; //定义发送与接收缓冲区
    uint8 RxWrite, RxRead;                    //定义接收存、取指针
    uint8 TxWrite, TxRead;                    //定义发送存、取指针
    uint8 TxFlag;                              //定义发送空标志
}UartStruct;

UartStruct Uart;

volatile uint8 rcv_new;      // 接收新数据标志

/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void  IRQ_UART0 (void)    __irq 
{
    uint8 i, IIR;
    
    while(((IIR = U0IIR)&0x01) == 0)       //中断处理完成后退出
    {    //有中断未处理完
        switch(IIR&0x0e)
        {
            case 0x02:           //发送中断(THER)
            for(i = 0; i < 16; i++)
            {
                if(Uart.TxRead == Uart.TxWrite)
                {
                                            Uart.TxFlag = 1;//发送空标志置1
                break;    
                }
                else
                {
                   U0THR = Uart.TxBuffer[Uart.TxRead++]; //取发送缓冲区的数据
            if(Uart.TxRead >= buffer) 
            {
                            Uart.TxRead = 0; 
                        }
                    }        
                }
            break;

            case 0x04:        //接收中断(RDA)
            case 0x0c:        //字符超时指示(CTI)
                while (U0LSR & 0x01) //从FIFO中取出全部数据
                {
                    Uart.RxBuffer[Uart.RxWrite++] = U0RBR;
                    if(Uart.RxWrite >= buffer)
                    {
                        Uart.RxWrite = 0;
                    }
                       Uart.TxFlag = 0;
                }
            break;

            case 0x06:                            //接收线状态(RLS)
                //ErrState = U0LSR;             // 清除出错中断
                 //ErrState = U0RBR;            // 读出出错字符并放弃 
            break;

            default:
            break;
        }
    }
    VICVectAddr = 0x00;    // 中断处理结束
}


/*
**************************************************
** 函数名称 :UartTxStar()
** 函数功能 :把数据写入发送缓冲区,并启动发送中断。
** 入口参数 :TxAddr    定义数组
**                Num
** 出口参数 :
**************************************************
*/
void UartTxStar(uint8 *TxAddr, uint8 Num)
{
    for(; Num > 0; Num--)
     {
        Uart.TxBuffer[Uart.TxWrite++] = *TxAddr;
        if(Uart.TxWrite>=buffer)
        {
            Uart.TxWrite = 0;
        }
        TxAddr++;                   
    }
}

/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud    波特率
**                set    模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UartMode set)
{
    uint32 bak;
    
    /* 参数过滤 */
    if ((baud ==0 ) || (baud > 115200))    return (0);
    if ((set.datab <5) || (set.datab > 8)) return (0);
    if ((set.stopb == 0) || (set.stopb > 2)) return (0);
    if (set.parity > 4)    return (0);
    
    /* 设置串口波特率 */
    U0LCR = 0x80;                        // DLAB = 1    
    bak   = (Fpclk >> 4) / baud;
    U0DLM = bak >> 8;
    U0DLL = bak & 0xFF;
    
    /* 设置串口模式 */
    bak   = set.datab - 5;        // 设置字长
    if (set.stopb == 2)    
             bak |= 0x04;// 判断是否为2位停止位
    
    if (set.parity != 0)
    {
        set.parity = set.parity - 1;
        bak |= 0x08;
    }
    bak |= set.parity << 4;    // 设置奇偶校验
    
    U0LCR = bak;
    
    return (1);
}


/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
    UartMode set;

    set.datab  = 8;
    set.stopb  = 1;
    set.parity = 0;

    Uart.RxWrite = 0;
    Uart.RxRead = 0;
    Uart.TxWrite = 0;
    Uart.TxRead = 0;
    
    rcv_new = 0;
    
    PINSEL0 = (PINSEL0&(~0x0F))|0x05;    // 设置I/O连接到UART0
    PINSEL2 = PINSEL2 & (~0x08);        // P1[25:16]连接GPIO
    
    IO1DIR  = LED1;            // 设置LED1控制口为输出
    
    UART0_Init(115200, set)   // 串口初始化
    U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
    U0IER = 0x03;                        // 允许RBR中断,即接收中断     允许发送中断
        
    /* 使能UART0中断 */
    VICIntSelect = 0x00000000;    // 设置所有的通道为IRQ中断
    VICVectCntl0 = 0x20 | 0x06;    // UART0分配到IRQ slot0,即最高优先级
    VICVectAddr0 = (uint32)IRQ_UART0;    // 设置UART0向量地址
    VICIntEnable = 1 << 0x06;        // 使能UART0中断
                                                                 
    while (1)
    {
            UartTxStar(Err, 8);
    }
}

相关帖子

沙发
win2000_li|  楼主 | 2007-2-27 15:40 | 只看该作者

程序是在KEIL RV3.03A编译环境!!

把IRQEnable()去掉了,是不是这里的问题的啊????

还有发送的FIFO是不是不用设置深度啊//??

使用特权

评论回复
板凳
win2000_li|  楼主 | 2007-2-27 16:44 | 只看该作者

问题解决了。先谢谢21IC的所有人和前辈们的经验!!

我理解:
    
     先给U0THR寄存器一个触发值;就是你51里的TI = 1一样啊。
     
     必须先有一个触发条件!!!就像一个开关,打开才能发送。
 
     不打开,就是不能发送中断.  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

718

帖子

1

粉丝