以下纯手写!
串口原理:串口是一种原理和使用较简单的用于芯片之间或芯片和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()的函数,以后调试其他硬件会用到,这里就不写了。
阅读(2501) | 评论(0) | 转发(2) |