免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3143 | 回复: 2
打印 上一主题 下一主题

UBOOT 下 TL16C752B 串口驱动数据收发 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-02 13:55 |只看该作者 |倒序浏览
本帖最后由 shuimu_1 于 2013-07-16 10:58 编辑

大家好!
小弟最近在做uboot下的TL16C752B串口驱动开发,是基于mpc8313e的
我首先在CodeWarrior(飞思卡尔的一个开发平台)下面通过仿真器调试串口,代码如下
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
#include <stdio.h>
//#include <malloc.h>

#define hong short

#define     BSC_UARTB               0x01
#define     BUAD_9K6_L              0x90             //22.1184M changed by asky
#define     BUAD_9K6_H              0x00
#define     UARTINT_RHR             0x01                        /*set rcv int*/
#define     UARTINT_THR             0x02                 /*set send int*/
#define     BSC_UARTA_ADDR          0xfa000000              //base_addr changed by asky
#define     BSC_UARTB_ADDR          0xfa000080
#define     START                   0x00
#define     MAX_UART_BUF_NUM        60
#define     TX_ENABLE               0x08
#define     RX_ENABLE               0x0B
//////////////////////////////////////////////////
#define     UART_RHR_THR    0x00                                    //enum default add 1
#define     UART_IER                0x02               
#define     UART_FCR_IIR        0x04
#define     UART_LCR                0x06
#define     UART_MCR                0x08
#define     UART_LSR                0x0a
#define     UART_MSR                0x0c
#define     UART_SPR                 0x0e
////////////////////////////////        
#define                UART_DLL                0x00
#define     UART_DLH                0x02
#define     UART_EFR                0x04
#define     UART_NULL                0x06
#define     UART_XON1                0x08
#define     UART_XON2                0x0a
#define     UART_XOFF1_TCR        0x0c
#define     UART_XOFF2_TLR_FIFORDY        0x0e
//////////////////////////////////////////////////
asm void system_call();

asm void system_call()
{
        nofralloc
        sc
        blr
}


unsigned char BSC_TL16C752B_WRITE_REG(unsigned char channal,unsigned char reg,unsigned int val);
unsigned char BSC_TL16C752B_READ_REG(unsigned char channal,unsigned char reg);
int     TL16C752B_init   ();
void    TL16C752B_putc   (unsigned int c);
char    TL16C752B_getc   ();
int     TL16C752B_tstc   ();
int     TL16C752B_reinit ();


////////////////////////////////
//                tl16c752b init                  //
////////////////////////////////
int TL16C752B_init()
{
        unsigned char  temp,temp1,temp2;

        //baud set
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_LCR, 0x80);                           //divisor_enable 8bit_data  1bit_stop
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_DLL, BUAD_9K6_L);       //baud 9600
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_DLH, BUAD_9K6_H);
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_LCR, 0x03);                  //divisor_disable 8bit_data  1bit_stop
               
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_FCR_IIR, 0x07);         //Enable the transmit and receive FIFOs
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_MCR, RX_ENABLE);        // RTS#= 1      DE= RE#=0         rcv
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_IER, UARTINT_RHR);

        return 0;
}
void TL16C752B_putc (unsigned int c)
{
        while (( BSC_TL16C752B_READ_REG(BSC_UARTB, UART_LSR) & 0x20) == 0);
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UARTINT_THR, c);
}

void main()
{
        char i=0;
        long j=0;
        hong k[100];
        printf("Welcome to CodeWarrior!\r\n";
        system_call(); //generate a system call exception to demonstrate the ISR
        TL16C752B_init();
        while(1)
        {
                for(i=0;i<100
                {       
                        i++;
                        TL16C752B_putc(i);

                }
        }
}
//////////////////////////////////////////////////////////////////////////////////////
我是利用红色部分的代码来通过串口向外发送数据的,这有问题吗?
为什么串口芯片上面的TX口没有电平变化呢?
我该怎么做呢?

求各位大牛帮忙!

论坛徽章:
0
2 [报告]
发表于 2013-07-09 15:31 |只看该作者
自己跟进一下,自己的发送数据部分有点问题如下:
改:
void TL16C752B_putc (unsigned int c)
{
        while (( BSC_TL16C752B_READ_REG(BSC_UARTB, UART_LSR) & 0x20) == 0);
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UARTINT_THR, c);
}
为:
void TL16C752B_putc (unsigned int c)
{
        while (( BSC_TL16C752B_READ_REG(BSC_UARTB, UART_LSR) & 0x20) == 0);
        BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_RHR_THR , c);
}
现在的问题是发送的数据和接受的不一样,希望大家给点建议。

论坛徽章:
0
3 [报告]
发表于 2013-07-16 11:02 |只看该作者
小弟再更进一下:
      我想问一下,串口收发的过程,如果串口助手向串口发送数据,在内存里可以看见数据已经写入,然后我将这个接收到的数据再通过串口发送到串口助手,串口打印的数据却不一样,可能会是什么原因呢?
具体过程如下:
串口芯片接受数据(例如:55)
串口助手(55)>>RX>>RHR>>RSR>>串口数据>>CPU(55)
串口芯片发送数据(55)
CPU(55)>>THR>>TSR>>串口数据>>TX>>串口助手(9D,并且改动发送的数据,还接收到的还是9D)
还请各位路过的看官给点建议。
ps:我参uboot下的ns16550写的。如果问的没有技术含量,合理的批评也会虚心接受的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP