海思HI35xx平台串口配置方法

Posted 旧年不在cd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海思HI35xx平台串口配置方法相关的知识,希望对你有一定的参考价值。

一、前言

串行接口简称串口(通常指COM接口),是采用串行通信方式的扩展接口,其特点是通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,但传送速度一般,数据传输率为115kbps~230kbps。异步串行UART(Universal Asynchronous Receiver/Transmitter),即通用异步接收/发送。UART是一款并行输入转换为串行输出的芯片(如MAX232、MAX485等),它们通常集成在主板上。UART芯片的另一功能是将TTL逻辑电平进行转换,属于硬件逻辑实现,不需要软件的干涉。UART常用的接口标准有RS-232、RS-485,其中RS-232的传送距离最大为约15米,最高速率为20kb/s;而RS-485的最大传输距离约为1219米,最大传输速率为10Mb/s。这两种接口标准的传输速率与传输速度差异这么大,主要是因对逻辑电平的规定以及信号传输抗干扰能力不一样导致的,在实际应用中根据传输距离及速度的不同需求选用即可。

二、海思UART

在海思芯片架构中,UART主要是将来自外围设备的数据进行串并转换后传入内部总线,以及将数据进行并串转换后输出到外围设备,从而实现两芯片之间的通信。Hi35XX提供了3个UART单元:

  • UART0:4线UART,可用于调试、报警和云台控制。
  • UART1:2线UART,可用于调试、报警。
  • UART3:2线UART,可用于调试、报警。

UART配置:

  • 支持数据位和停止位的位宽可编程。数据位可通过编程设定为5/6/7/8比特,停止位可通过过编程设定为1bit或2bit。
  • 支持奇、偶校验方式或无校验。
  • 支持速率可编程,支持9600bit/s、14400bit/s、19200bit/s、38400bit/s、57600bit/s、76800bit/s、115200bit/s、230400bit/s、460800bit/s多种波特率可选。

三、海思UART启用

海思默认只开启UART0单元作为调试功能使用,在实际应用中我们常常需要使用UART1、UART2来与外围设备对接,以实现串口通信。此时我们就需要配置启用UART1、UART2单元,这个过程分为3步:

  • 确保硬件IO口设计及时钟频率正常
  • 检查UART单元所使用的IO口复用关系
  • 配置内核,将UART映射为设备文件

硬件电路部分按要求布线连接,一般没什么问题,这里主要讲解IO口的复用关系配置及内核配置。

上表是海思芯片IO口复用关系表,由此可知大多数IO口的默认功能都不是作为UART单元来使用,故需要配置它们的复用关系,可以采用在系统启动脚本里添加如下命令来配置IO口的复用关系:

himm 0x120F00F8 0x1
himm 0x120F00FC 0x1
……

接下来是配置内核,以实现UART单元映射为linux下的设备文件,这里主要涉及就是海思的设备树更改,相对简单。进入SDK目录\\osdrv\\opensource\\kernel\\linux-3.18.y\\arch\\arm\\boot\\dts,找到以下设备树文件:

修改以下内容:

至此海思UART单元配置完成,重新编译内核,并将内核烧录运行。如果没有什么异常,在设备上的/dev/目录下会有以下3个设备文件出现,接下来软件对此设备文件进行编程操作即可。

/dev/ttyAMA0
/dev/ttyAMA1
/dev/ttyAMA2

四、海思UART软件操作

与其他的linux设备操作类似,通过open、fcntl、close来实现与UART单元进行操作。在串口设备中,比较特殊的就是串口的波特率、奇偶校验、数据位以及停止位的设置了,只有将它们正确设置了才能进行串口通讯。

*
*Function: HI_Serial_Open(int fd,char* ComDevice)  
*Param: fd:file descirbe handle	 Serial Device: /dev/ttyAMA1 /dev/ttyAMA2
*Output: Ok or Fail
*/
 
int HI_Serial_Open(char* HiSerDevice)  
  
    int fd;
		
	fd = open(HiSerDevice, O_RDWR|O_NOCTTY|O_NDELAY);  
	if (HI_FALSE == fd)  
	  
		perror("HiSerial Can't Open Serial HiSerDevice");  
		return(HI_FALSE);  
	  
	//恢复串口为阻塞状态                                 
	if(fcntl(fd, F_SETFL, 0) < 0)  
	  
		debugpri("fcntl failed!\\n");  
		return(HI_FALSE);  
	       
	else  
	  
		debugpri("fcntl=%d\\n",fcntl(fd, F_SETFL,0));  
	  
	//测试是否为终端设备      
	if(0 == isatty(STDIN_FILENO))  
	  
		debugpri("standard input is not a terminal device\\n");  
		return(HI_FALSE);  
	  
	else  
	  
		debugpri("isatty success!\\n");  
	                
	printf("fd->open=%d\\n",fd);  
	return fd;  
  
 
/*
*Function: HI_Serial_Close(int fd) 
*Param: fd:file descirbe handle	 
*Output: Null
*/
 
void HI_Serial_Close(int fd)  
  
	if(fd > 0)
		close(fd); 
	return;	
  
 
/*
*Function: HI_Serial_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity) 
*Param1: fd: file descirbe handle	 
*Param2: speed: select the Serial speed.115200,19200,9600...
*Param3: flow_ctrl: if use flow control
*Param4: databits: data bit select
*Param5: stopbits: stopbits select	
*Param5: parity: partiy select	
*Output: Ok or Fail
*/
int HI_Serial_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)  

    /*******
    ********
    ********/  

 
int HI_Serial_Usage(void)

    printf("Usage:\\n");
    printf("\\tmyhicom [-d] <HiSerialDevice> [-s] get netdeviece info [-rw] read or wite select\\n");
    printf("\\tmyhicom [-h] for more usage\\n");
    printf("\\tmyhicom [-v] the verson of the sofware\\n");
	printf("\\tExample:\\n\\tmyhicom -d /dev/ttyAMA1 -s 115200 -w HiSerial:HelloWorld\\n");

 
 
/*
**Function: main()
**usage: read or write com
**parameter: help
*/
int main ( int argc, char *argv[] )

	int cmd;
	int len;
    //extern char *optarg;
    //extern int optind, opterr, optopt;
	char HiSerialDev[32]="/dev/ttyAMA1";
	char sendbuf[1024]=0;
	char recvbuf[1024]=0;
	int SerialSpeed = 115200;
	
	Hi_init_signals();
	if(argc == 1)
	
		HI_Serial_Usage();		
		exit(0);
	
	else
	
		while ((cmd = getopt(argc, argv, ":d:s:rw:hv")) != -1)
		
			switch (cmd)
			
				case 'h':
					HI_Serial_Usage();
					break;
				case 'v':
					printf("myHicom --Verson V1.0.0\\n");
					break;
				case 'd':
					//printf("catch -d %s \\n",optarg);
					memset(HiSerialDev,0,sizeof(HiSerialDev));
					sprintf(HiSerialDev,"%s",optarg);
					printf("myHicom HiSerialDev %s\\n",optarg);
					break;
				case 's':
					SerialSpeed = atoi(optarg);
					printf("myHicom speed %d\\n",SerialSpeed);
					break;
				case 'r':					
					 debugpri("myHicom read\\n");
					 HiSerfd = HI_Serial_Open(HiSerialDev);
					 HI_Serial_Init(HiSerfd,SerialSpeed,0,8,1,'N');
					 while(1)
					 
						len = HI_Serial_Recv(HiSerfd, recvbuf,sizeof(recvbuf));  
						if(len > 0)  
						  
							recvbuf[len] = '\\0';  
							printf("Hiserial receive data: %s\\n",recvbuf);  
							memset(recvbuf,0,sizeof(recvbuf));
							//break;  
						  
						else  
						  
							debugpri("Hiserial haven't data receive \\n");  
						  
						sleep(2); 						 
					 ;		
					 break;
				case 'w':
					 debugpri("myHicom write %s\\n",optarg);
					 HiSerfd = HI_Serial_Open(HiSerialDev);
					 printf("fd = %d device = %s speed = %d\\n",HiSerfd,HiSerialDev,SerialSpeed);
					 HI_Serial_Init(HiSerfd,SerialSpeed,0,8,1,'N');					 
					 sprintf(sendbuf,"%s\\n",optarg);					 
					 HI_Serial_Send(HiSerfd, sendbuf, strlen(sendbuf)+1); 
					 if(HiSerfd > 0)
						 HI_Serial_Close(HiSerfd);					
					 break;
			    case ':':
                    printf ("option: -%c missing argument. -h for help.\\n",(char)optopt);
                    break;
			    case '?':
                    printf("Unknown option: -%c\\n",(char)optopt);
                    break;
				default:
					exit(0);
			
			
		
	return 0;

五、总结

串口通信加强了主控芯片与外围设备之间的联系,通过RS485接口可以实现远距离通信。在海思平台开发中,可以实现球机平台远程控制、红外报警等智能监控应用。本文主要是总结海思UART单元的应用于配置及提供一个简单的串口通信样例实现。

样例运行效果图:

以上是关于海思HI35xx平台串口配置方法的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg开发笔记:ffmpeg在移植到海思HI35xx平台之将ffmpeg库引入到sample的demo中

FFmpeg开发笔记:ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

FFmpeg开发笔记:ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

经验分享华为海思Hi35xx系列ARM32交叉编译opencv

OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

海思Hi35xx uboot启动分析总结