arm:UART(异步) && IIC(同步)

一、UART

UART---通用异步收发传输器
串行、异步、全双工(两个方向上同时传输,即发送和接收可以同时进行**)通信协议**

读一个数据初始化UART0

4 先清零、后置位

cs 复制代码
void uart0_init(void)
{
	GPHCON &= ~(0xf << 4); 	//配置GPH2、3功能为RXD、TXD
	GPHCON |= (0xA << 4);

	ULCON0 &= ~(1 << 6); //普通模式
	ULCON0 &= ~(7 << 3); //无校验
	ULCON0 &= ~(1 << 2); //1位停止位
	ULCON0 |= ~(0x3 << 0); //数据位8位

	UCON0 &= ~(0x3 << 10);
	UCON0 |= ~(0x2 << 10); //时钟选择PCLK -- 50M
	UCON0 &= ~(0xf << 0);
	UCON0 |= ~(0x5 << 0); //中断或轮询模式

	UBRDIV0 = 325;//波特率 9600
}

发送数据

cs 复制代码
void uart_send(unsigned char * data, int len)
{
	int i = 0;
	for(i = 0;i < len; i++)
	{
		while(!(UTRSTAT0 & (1 << 2)));  
		UTXH0 = data[i];		   
	}
}

接收数据

cs 复制代码
unsigned char uart_recv_byte(void)
{
    unsigned char data = 0;
	while(!(UTRSTAT0 & (1 << 0)));  
	data = URXH0;
		   
	return data;
}

主函数

cs 复制代码
int main(void)
{
	unsigned char data = 0;
	uart0_init();
	while(1)
	{
		data = uart_recv_byte();
		data++;
		uart_send(&data,1);
	}	
	return 0;
}

其他补充




二、IIC

IIC --- 集成电路总线 ;

低速、半双工(不能同时发送和接收数据,同一时刻只能有一个方向上的传输存在)、同步的串行通信总线

一般主机控制SCLK时钟线

每次通信都由主机发起,7位地址+1位读/写

为了控制多主控 IIC 总线操作,必须写入值到以下寄存器中:

-- 多主控 IIC 总线控制寄存器,IICCON

-- 多主控 IIC 总线控制/状态寄存器,IICSTAT

-- 多主控 IIC 总线 Tx/Rx 数据移位寄存器,IICDS

-- 多主控 IIC 总线地址寄存器,IICADD
S3C2440A的IIC总线接口有4种工作模式:

  • 主机发送模式

  • 主机接收模式

  • 从机发送模式

  • 从机接收模式

初始化IIC

cs 复制代码
void iic_init(void)
{
	//配置GPE14、15引脚功能为SCL、SDA
	GPECON &= ~(0xf << 28);
	CPECON |= (0xa << 28);

	IICCON |= (1 << 7);	  //使能应答
	IICCON |= (1 << 6);	  //PCLK/512
	IICCON |= (1 << 5);   //允许中断
	IICCON &= ~(0xf << 0); 	// 预分频1
}

主机发送模式

cs 复制代码
void iic_write(unsigned char addr, unsigned char * data, int len)
{
	int i = 0;
	IICSTAT |= (0x3 << 6);
	IICDS = addr;
	IICSTAT = 0xf0;
	//IICCON &= ~(1 << 4);  //清除挂起位
	while(!(IICCON & (1 << 4)));  //等待挂起标志

	for(i = 0; i < len; i++)
	{
		IICDS = data[i];	
		IICCON &= ~(1 << 4);  //清除挂起位
		while(!(IICCON & (1 << 4)));  //等待挂起标志
	}
	
	IICSTAT = 0xd0;
	IICCON &= ~(1 << 4);  //清除挂起位
}

主机接收模式

cs 复制代码
int iic_read(unsigned char addr, unsigned char * data, int len)
{
	int i = 0;
	IICSTAT &= ~(0x3 << 6);
	IICSTAT |= (0x2 << 6);

	IICDS = addr;
	IICSTAT = 0xb0;
	//IICCON &= ~(1 << 4);  //清除挂起位
	while(!(IICCON & (1 << 4)));  //等待挂起标志

	for(i = 0; i < len; i++)
	{
		data[i] = IICDS;	
		IICCON &= ~(1 << 4);  //清除挂起位
		while(!(IICCON & (1 << 4)));  //等待挂起标志
	}
	
	IICSTAT = 0x90;
	IICCON &= ~(1 << 4);  //清除挂起位
	
	return i;
}
相关推荐
dessler5 分钟前
Docker-如何启动docker
运维·docker·云原生·容器·eureka
zhy295636 分钟前
【DOCKER】基于DOCKER的服务之DUFS
运维·docker·容器·dufs
无为之士11 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
秋名山小桃子20 分钟前
Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决
运维·服务器
与君共勉1213821 分钟前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
岑梓铭27 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
努力学习的小廉28 分钟前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
MZWeiei31 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
7yewh1 小时前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
Arenaschi1 小时前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器