打印

求ARM7 LPC2366的串口接收程序

[复制链接]
8355|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
阿南| | 2012-10-31 11:14 | 只看该作者
对比一下这两个芯片的该状态寄存器是否有区别。

使用特权

评论回复
板凳
mage心寒|  楼主 | 2012-10-31 11:25 | 只看该作者
2# 阿南

两个芯片串口寄存器都一样的,我发是没问题的,现在把连接外部的中间光耦拿掉后,直接跟外部通信是正常的!!

使用特权

评论回复
地板
mage心寒|  楼主 | 2012-10-31 11:33 | 只看该作者
void Uart0_Init(unsigned int bps)
{
          uint16 Fdiv;
          PINSEL0 = (PINSEL0 & 0xffffff0f) | (0x05<<4);     
                U0LCR = 0x80;                               /* 允许访问分频因子寄存器 */
                Fdiv = (Fpclk / 16) / bps;                  /* 设置波特率 */
                U0DLM = Fdiv / 256;                                                       
                U0DLL = Fdiv % 256;       
                U0LCR = 0x03;                               /* 禁止访问分频因子寄存器  且设置为8,1,n */
          U0IER = 0x07;                               /* 允许接收和发送中断 */
                U0FCR = 0x06;                               /* 初始化禁用FIFO */
        //  VICVectCntl0 = 0x26;                      //UART0中断源使能为优先级0
         // VICIntSelect = 0x00000000;                // 所有中断通道设置为IRQ中断
        //  VICVectAddr6 = (uint32)IRQ_UART0;
   // VICVectPriority6  = 0x05;
         // VICIntEnable  = 1 << 6;
        }
       
/****************************************************************************
* 名    称:UART0_SendByte()
* 功    能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(int data)
{                        
       U0THR=data;
       while( (U0LSR&0x40)==0 );                    // 等待数据发送完毕     
}

void UART0_Rev(void)                      //串口接收可以用
{
         UART0_SendByte(0x00);
         while ((U0LSR & 0x01)==0);  //??
         UART0_SendByte(U0RBR);                                                                  
}
程序贴上,手上没啥资料。。。卡这了。。发是可以的接收不行!!

使用特权

评论回复
5
阿南| | 2012-10-31 14:19 | 只看该作者
外部硬件的问题。把串口连接部分的电路图放出来看看。

使用特权

评论回复
6
mage心寒|  楼主 | 2012-10-31 14:39 | 只看该作者
   TX0和RX0直接接到芯片lpc2366

使用特权

评论回复
7
阿南| | 2012-10-31 16:00 | 只看该作者
看不出问题,楼主换一个光耦试试,会不会是那个接收的光耦出现质量或焊接问题。

使用特权

评论回复
8
mage心寒|  楼主 | 2012-10-31 16:02 | 只看该作者
7# 阿南
我换了好几块板子了,应该不是元器件的问题吧。。。好纠结的说。。。

使用特权

评论回复
9
阿南| | 2012-10-31 16:48 | 只看该作者
如果不是光耦问题,那就要用示波器测试ARM接收管脚的波形时序,对比接不接光耦是的差异。

使用特权

评论回复
10
阿南| | 2012-10-31 16:49 | 只看该作者
或者也可把波特率降低试试

使用特权

评论回复
11
mage心寒|  楼主 | 2012-11-1 08:22 | 只看该作者
10# 阿南 昨晚加班调试了,发现了现象,LPC2366有四个串口,在没有配置串口IO的情况下只能发送不能接收,将对应的IO上拉可以接收,但是问题是要么接收要么发送,两个都配置上拉的时候只能发送,不知道是不是LPC2366的问题,有遇到这个问题的大侠可以说说嘛。。很纠结的说。

使用特权

评论回复
12
ywd1979ywd| | 2012-11-1 08:28 | 只看该作者
你可以把这个光耦去掉,直接通一下,我想可能是串口接口电流驱动方面的问题

使用特权

评论回复
13
ywd1979ywd| | 2012-11-1 08:30 | 只看该作者
就是把光耦拆掉用接收线短接

使用特权

评论回复
14
jlass| | 2012-11-1 08:54 | 只看该作者
PC817的速度很慢的
你把波特率调到9600试试

使用特权

评论回复
15
阿南| | 2012-11-1 09:05 | 只看该作者
把这个问题反馈给ZLG或者NXP的其它代理

使用特权

评论回复
16
mage心寒|  楼主 | 2012-11-1 09:32 | 只看该作者
14# jlass 但是单向通信没有问题,应该不是光耦的问题!!

使用特权

评论回复
17
zhenglixin| | 2012-11-1 09:45 | 只看该作者
仔细检查下,配置和状态查询有无问题

使用特权

评论回复
18
mage心寒|  楼主 | 2012-11-1 09:50 | 只看该作者
15# 阿南
阿南哥给个联系方式吧,打了几家代理都是再卖,没有技术支持的。

使用特权

评论回复
19
jlass| | 2012-11-1 09:58 | 只看该作者
你用示波器测测看,数据在哪里出现异常了,应该可以基本定位问题,如果是在原端就出问题了的话只能找技术支持或再看几遍芯片的datasheet

使用特权

评论回复
20
mage心寒|  楼主 | 2012-11-1 17:23 | 只看该作者
uint8 SetIO_Func(uint16 IoPort ,uint8 Fuct,uint8 InOut)
{
    uint8   PortNum,err;
    uint32  Pull,Sift;
//                OS_ENTER_CRITICAL();
    err=NO_ERR;
    PortNum=IoPort>>12;                  //取出IO口选项
    Pull=(IoPort&0x0F00)>>8;            //取出连续IO口上下拉状态
    if(Pull==1) Pull=0x02;              //禁止设置保留状态
    IoPort=IoPort&0x001F;               //取出IO的位置
    switch(PortNum)
    {
        case 0:             //P0口
        {   
//            SCS |= FAST_PORT;     //设定为高速口
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE0=(PINMODE0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL0=(PINSEL0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE1=(PINMODE1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL1=(PINSEL1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO0DIR =FIO0DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO0DIR =FIO0DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 1:             //P1口
        {
//            SCS |= FAST_PORT;     //设定为高速口
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE2=(PINMODE2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL2=(PINSEL2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE3=(PINMODE3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL3=(PINSEL3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO1DIR =FIO1DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO1DIR =FIO1DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 2:             //P2口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE4=(PINMODE4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL4=(PINSEL4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE5=(PINMODE5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL5=(PINSEL5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO2DIR =FIO2DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO2DIR =FIO2DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 3:             //P3口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE6=(PINMODE6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL6=(PINSEL6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE7=(PINMODE7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL7=(PINSEL7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO3DIR =FIO3DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO3DIR =FIO3DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        case 4:             //P4口
        {
            if(IoPort<16)        //低16个IO口
            {
                Sift=IoPort<<1;
                PINMODE8=(PINMODE8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL8=(PINSEL8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);     //IO 功能
            }
            else
            {
                Sift=(IoPort-16)<<1;
                PINMODE9=(PINMODE9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift);   //上下拉状态
                PINSEL9=(PINSEL9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift);    //IO 功能
            }            
            if(Fuct==0)
            {
                if(InOut==DIR_IN)
                {
                    FIO4DIR =FIO4DIR&(~((uint32)(0x1)<<IoPort));
                }
                else
                {
                    FIO4DIR =FIO4DIR|((uint32)(0x1)<<IoPort);
                }
            }
        }break;
        default:            //错误设置
        {
            err=ERR_OP;
        }break;
    }
//                OS_EXIT_CRITICAL();
    return err;
}
有这样一个函数,可以通过设置他来改变IO的状态但是不管我怎么设置,就是不能设置IO可以接收,也可以发送。很纠结的说、。。

使用特权

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

本版积分规则

19

主题

1019

帖子

13

粉丝