协议类编程(常用的协议类模块有:UART,IIC,SPI,NAND Falsh,LCD)
UART作用:今天编写uart程序,预期的实验结果是,在S5PV210开发板上实现用串口实现接受和发送功能,实现和PC机通讯。
三. 常用概念
UART:universal asyncrecive transmit通用异步收发器。
用于PC机和开发板之间的通讯,数据传输,控制。
1. 串口的接线:RSTXD,RSRXD(读写数据线),RSCTS,RSRTS(流量控制线),GND地线。
2. 异步:你不知道什么时候S5PV210什么时候会传数据。
3. 协议:你说的别人要听的懂。(收发数据的格式)
4. 双方时序:你的语速要让别人跟的上。(波特率)
5. UART如何传数据?
1)约定协议 :起始位,停止位,数据位,奇偶校验位。PC机通过软件设置串口协议,S5PV210通过设置控制串口控制器。
2)约定时序: 波特率,每发一次数据需要多少时间等。
四.编程思路
1.查看原理图,确定串口和CPU的连线GPIO,将特定的GPIO设置为UART输出;
2. 首先看芯片手册UART章节,查看UART寄存器的功能描述,查看我们具体需要设置那些寄存器。
3.根据对寄存器的了解,写初始化函数,接受和发送函数。
五。相关寄存器
1.初始化相关的寄存器
1)GPA0:设置引脚状态位UART
2)ULCON0:红外线模块,奇偶校验,停止位,传输数据位宽。
3)UCON0:(T/R)DMA,clock Selection(PCLK/SCLK_UART),(T/R)interrput Type中断必须脉冲-查询必须电平,(T/R)Mode(中断,查询)。
4)UBRDIV0,UDIVSLOT:分别设置UBRDIV和UDIVSLOTn
DIV_VAL =(PCLK / (bps x 16)) −1 求出DIV_VAL,PLCK一般为66.7MHZ
UBRDIVn =DIV_VAL的整数部分( integer part of DIV_VAL ) 求出UBRDIV,(去DIV_VAL整数)
DIV_VAL =UBRDIVn + (num of 1's in UDIVSLOTn)/16 求出UDIVSLOTn,四舍五入,查表。
5)UMCON0,UFCON0:设为0x0
2.接受发送相关寄存器
1)URXH0,UTXH0:发送和接受寄存器。
2)UTRSTAT0:确定(R/T)buf的状态,再发送和接受。
3.中断相关的寄存器
UINTP0,UINTSP0,UINTM0:和中断有关。
六.主程序和相关函数
int xmain()
{
int ch = -1;
close_buzzer();
init_uart();
init_led();
*rGPJ2DAT = 0xff;
while(1)
{
ch = recv_uart();
if(-1 != ch)
{
*rGPJ2DAT = ~(*rGPJ2DAT);
send_uart((unsigned int)ch);
}
}
return 0;
}
void init_uart()
{
//将特定的GPIO口设置为UART模式。
*GPA0CON = 0x22;
*UFCON0 = 0x0;
*UMCON0 = 0x0;
*ULCON0 =(3<<0)|(0<<2)|(0<<5)|(0<<6);
*UCON0 =(1<<0)|(1<<2)|(1<<8)|(1<<9)|(0<<10);
//(66700000/(115200*16) -1)
*UBRDIV0 = 35;
*UDIVSLOT = 0x888;
}
int recv_uart()
{
int ch;
if((*UTRSTAT0 & 0x01) == 0x01)
{
ch = *URXH0;
return ch;
}
else
{
return -1;
}
}
voidsend_uart(unsigned int ch)
{
while((*UTRSTAT0 & 0x04) == 0x00);
*UTXH0 = ch;
}