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口没有电平变化呢?
我该怎么做呢?
求各位大牛帮忙!
自己跟进一下,自己的发送数据部分有点问题如下:
改:
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);
}
现在的问题是发送的数据和接受的不一样,希望大家给点建议。 小弟再更进一下:
我想问一下,串口收发的过程,如果串口助手向串口发送数据,在内存里可以看见数据已经写入,然后我将这个接收到的数据再通过串口发送到串口助手,串口打印的数据却不一样,可能会是什么原因呢?
具体过程如下:
串口芯片接受数据(例如:55)
串口助手(55)>>RX>>RHR>>RSR>>串口数据>>CPU(55)
串口芯片发送数据(55)
CPU(55)>>THR>>TSR>>串口数据>>TX>>串口助手(9D,并且改动发送的数据,还接收到的还是9D)
还请各位路过的看官给点建议。
ps:我参uboot下的ns16550写的。如果问的没有技术含量,合理的批评也会虚心接受的。
页:
[1]