Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318840
  • 博文数量: 49
  • 博客积分: 4045
  • 博客等级: 上校
  • 技术积分: 1195
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 12:56
文章分类

全部博文(49)

文章存档

2013年(29)

2010年(6)

2009年(6)

2008年(8)

我的朋友

分类: 嵌入式

2013-03-11 09:37:12

  以下纯手写!
    串口原理:串口是一种原理和使用较简单的用于芯片之间或芯片和PC之间通信的电路模块。通常串口输出输入电平为TTL(<5V)/CMOS(5~15V)电平,若TTL电平,则逻辑1>2.4V,逻辑0<0.4V;若CMOS电平,逻辑1接近电源电压,逻辑0接近0V。(好像是这么回事,有待验证)但是,我们通常为了提高传输距离,把TTL/CMOS电平转化为RS-232逻辑电平,3~12V表示0,-3~-12V表示1。有MAX232进行电平转换等芯片。软件编写人员一般不需要了解这些。
    串口之所以简单是是因为只需要一根接收线,一根发送线,一根地线(给双方提供参考电平)。三星6410有4个UART,都支持红外模式,为全双工,即为同时可以收也可以发。
    收发格式为:一个起始位,5、6、7、8个数据位,1个校验位(奇或偶校验,因为硬件技术提升还因为串口一般是用来调试用的,错一个字节啥的没关系,所以现在基本不用这位),1个或俩个结束位。
    配置代码:void uart_init(void)
{
        GPACON &= ~(0xff << 0);
        GPACON |= (0x22 << 0);//GPIO for UART
        ULCON0 = (0x3 << 0);//选择完之后为8N1
        UCON0 = (0 << 10)|(1 << 2)|(1 << 0);//选择PCLK(上一节配置的时钟为66.5Mhz)、从发送和接收缓存寄存器中读数据用轮询方式
        UBRDIV0 = 35;
        UDIVSLOT0 = 0x0080;/*DIV_VAL = (PCLK / (b/s × 16 ) ) –1 
                                         DIV_VAL = (EXT_UCLK0 / (b/s × 16 ) ) –1 
                                          或者 
                                          DIV_VAL = (EXT_UCLK1 / (b/s × 16 ) ) –1  这三句话表示外部时钟源的选择,然后带入自己的波特率,求得DIV_VAL!  66.5M=66.5*10^6*/
                                        /*DIV_VAL = UBRDIVn(DIV_VAL的整数部分) + ((UDIVSLOTn 中 1 的个数)/16=小数部分)*/

}//这里不适用FIFO,那么缓冲相当于1个字节

下面是如何使用配置完的UART进行收发的代码:

       void uputchar(char c)
{
        UTXH0 = c;
        while(!(UTRSTAT0 & (1 << 2)));
}
char ugetchar(void)
{
        while(!(UTRSTAT0 & (1 << 0)));
        return URXH0;
}

然后用一个main()函数来循环调用输出输入函数来测试。

还可以自己根据这个处理字符的小函数实现一个类似printf()的函数,以后调试其他硬件会用到,这里就不写了。


阅读(436) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~