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;
}
相关推荐
小小管写大大码14 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
嵩山小老虎14 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模14 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zhang1338308907514 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a413244714 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.15 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技15 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能
程序员允诺15 小时前
[DevOps实战] 彻底解决依赖地狱:如何编译全静态、可移植的 Xorriso 工具
运维·devops
酣大智15 小时前
接口模式参数
运维·网络·网络协议·tcp/ip
一只自律的鸡16 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug