基于fl2440的串口通信

时间:2021-08-13 19:31:33

串口通信的格式:

 

基于fl2440的串口通信

 

起始位 数据位 奇偶校验位 停止位

传输速率:
每一个数据位的宽度定于发送波特率的倒数。微机异步串行通信中,常用的波特率为110、
150、300、600、1200、2400、4800、9600、57600、115200 等。
电气特性:
要完成基本的通信功能,实际上值需要RXD、TXD 和GND 即可,但由于RS-232-C 标准所
定义的高、低电平信号于S3C2440A 系统的LVTTL 电路定义的高、低电平信号完全不同,LVTTL
的标准逻辑“1”对应2-3.3V,标准逻辑“0”对应0-0.4V,而RS-232C 标准采用负逻辑方
式,逻辑“1”对应-5――15V,标准逻辑“0”对应+5-+15V。显然两者间要进行通信,必
须经过电平的转换,转换芯片采用max202。

RS-232C 标准规定,当误码率小于4%时,要求导线的电容值应小于2500PF。
对于普通导线,其电容值约为170PF/M。则允许距离L=2500PF/(170PF/M)=15M.这一距离的计
算,是偏于保守的,实际应用中,当使用9600bps,普通双绞屏蔽线时,距离可达30~35 米。
零Modem 的最简连线(3 线制)

由此可以看出,串口只是适合于短距离的地方,在选择每一种器件的时候都必须考虑其使用场合,精度,温度影响,等等。否则前功尽弃。

 

串口的模块功能图:

基于fl2440的串口通信

其中包括,控制单元,接受移位,发送移位, 接受/发送fifo模块,波特率产生器。

编程实现:

1)设置串口传输格式,数据位数,奇偶校验位,停止位

2)设置波特率产生器的时钟源、设置串口工作方式(查询方式(polling mode), 中断模式(interrupt mode), DMA( direct memory access))

3)通过各种状态标志,或者中断服务子程序发送、接受数据

 源代码:

 AREA |DATA|, CODE, READONLY
 
 ENTRY
 
 ;LDR R13,=0x1000 /*将本句注释掉发现似乎没有什么影响,不知道写上为何用意?删除后执行效果一样!*/
 IMPORT rs232Main
 
 B rs232Main
 
 END

 

/*宏定义*/

#define ULCON0   (*(volatile unsigned *)0X50000000)  //UART线控制寄存器
#define UCON0    (*(volatile unsigned *)0X50000004)  //UART控制寄存器
#define UFCON0   (*(volatile unsigned *)0X50000008)  //FIFO控制寄存器
#define UTRSTAT0  (*(volatile unsigned *)0X50000010)  //UART状态寄存器
#define UBRDIV0  (*(volatile unsigned *)0X50000028) //波特率
#define UTXH0    (*(volatile unsigned *)0X50000020)
#define URXH0    (*(volatile unsigned *)0X50000024)
#define GPBDAT   (*(volatile unsigned *)0X58000054)

 
 void rs232Main()

{
    char buf;

    ULCON0 &= 0xffffff00;/*将0-7位置零*/
    ULCON0 |= 0x03;/*设置为8位,无奇偶校验,停止位1位,正常模式*/
    UCON0   = 0X0805;/*查询方式(polling mode)正常运行模式,不产生,接受或者发送错误中断,串口时钟是PCLK,*/
    /*计算公式:UBRDIVn = (int)( UART clock / ( buad rate x 16) ) - 1*/
    /*26+1 = 27 27*16*115200 PCLK 约等于 50M*/
    UBRDIV0 = 0x1a; /*设置波特率为115200*/
   
    while (1)
    {
        while (UTRSTAT0 & 0x01)
        {
            buf = URXH0;
            while (!(UTRSTAT0 & 0X04));
            UTXH0 = buf;   
        }

    }//这里必须使用while(1)不然,其会执行到linux的操作系统上去,最开始还不知道是什么原因...

}

地址范围

Please select which region to write : Esc to abort
0 : offset 0x00000000, size 0x00020000 [boot]
1 : offset 0x00020000, size 0x00060000 [bootParam]
2 : offset 0x00080000, size 0x00100000 [pic]
3 : offset 0x00180000, size 0x00380000 [MyApp]
4 : offset 0x00500000, size 0x00300000 [kernel]/*紧跟其后的就是linux内核*/
5 : offset 0x00800000, size 0x03c00000 [fs_yaffs]/*文件系统*/
6 : offset 0x04400000, size 0x00080000 [eboot]
7 : offset 0x04480000, size 0x03b80000 [wince]

 

--------------------------------------------------------------坚持不懈、追求卓越--------------------------------------------------------------------------