shuimu_1 发表于 2013-07-02 13:55

UBOOT 下 TL16C752B 串口驱动数据收发

本帖最后由 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 chartemp,temp1,temp2;

      //baud set
      BSC_TL16C752B_WRITE_REG(BSC_UARTB, UART_LCR, 0x80);                           //divisor_enable 8bit_data1bit_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_data1bit_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;
        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口没有电平变化呢?
我该怎么做呢?

求各位大牛帮忙!

shuimu_1 发表于 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);
}
现在的问题是发送的数据和接受的不一样,希望大家给点建议。

shuimu_1 发表于 2013-07-16 11:02

小弟再更进一下:
      我想问一下,串口收发的过程,如果串口助手向串口发送数据,在内存里可以看见数据已经写入,然后我将这个接收到的数据再通过串口发送到串口助手,串口打印的数据却不一样,可能会是什么原因呢?
具体过程如下:
串口芯片接受数据(例如:55)
串口助手(55)>>RX>>RHR>>RSR>>串口数据>>CPU(55)
串口芯片发送数据(55)
CPU(55)>>THR>>TSR>>串口数据>>TX>>串口助手(9D,并且改动发送的数据,还接收到的还是9D)
还请各位路过的看官给点建议。
ps:我参uboot下的ns16550写的。如果问的没有技术含量,合理的批评也会虚心接受的。
页: [1]
查看完整版本: UBOOT 下 TL16C752B 串口驱动数据收发