ARM-------->第五天,uart通信I2C和SPI

Posted 旅人520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM-------->第五天,uart通信I2C和SPI相关的知识,希望对你有一定的参考价值。

1.uart通信------>异步的串行通信

异步:随机的,没有时钟线

同步:有时钟线

单工:A->B

半双工:a->b 或者 b->a

全双工:a->b  b->a

串行通信:一次只发送一个bit位

波特率:每一秒发送的数据的位数

 

 

uart控制器工作原理:

 

注意:在设置波特率时,因为每一位都会采样16次,所以最终需要的时钟是100M/(115200*16)HZ

采样16次,将中间789次的平均值作为最终的结果,这样可以确保读到的数据是准确的

超级终端的串口接收:接收并显示到文本框

发送:直接在键盘事件的处理函数中进行发送,也就是你按下啥,啥就通过串口发送出去了,你在终端的文本框看不到

如何知道你确实发出去了,那你就在板子上接收到之后,再给pc发回来

在ARM第四天笔记的基础上,添加uart.h文件、uart.c文件,修改makefile工程文件

uart.h文件:

#ifndef _UART_H_
#define _UART_H_

#define GPA1CON *((volatile unsigned int *)0x11400020)
#define ULCON2 *((volatile unsigned int *)0x13820000)
#define UBRDIV2 *((volatile unsigned int *)0x13820028)
#define UFRACVAL2 *((volatile unsigned int *)0x1382002C)
#define UCON2 *((volatile unsigned int *)0x13820004)
#define UTRSTAT2 *((volatile unsigned int *)0x13820010)
#define  UTXH2 *((volatile unsigned int *)0x13820020)
#define UTRSTAT2 *((volatile unsigned int *)0x13820010)
#define  URXH2 *((volatile unsigned int *)0x13820024)


void uart_init();
void uart_putc(char c);
char uart_getc();
#endif

uart.c文件:

#include "uart.h"


void uart_init()
{
	//设置GPA1_0和GPA1_1的功能为uart的txd和rxd
	//将GPA1CON的0-7位设置为0x22
	GPA1CON = GPA1CON & ~0XFF | 0X22;
	
	//设置数据位为8位,无奇偶校验位,停止位为1
	ULCON2 = 0X3;
	
	//设置波特率为115200
	UBRDIV2 = 53;
	UFRACVAL2 = 4;
	
	//设置发送和接收方式为轮询
	UCON2 = UCON2 & ~0XF | 0X5;
}

//发送一帧数据
void uart_putc(char c)
{
	//判断发送寄存器是否为空
	//如果为空就给发送寄存器赋值,否则就等待
	
	while(1)
	{
		if(UTRSTAT2 & 0x2)  //为空
		{
			break;
		}
	}
	
	//while(!(UTRSTAT2 & 0x2));
	UTXH2 = c;
}

char uart_getc()
{
	//判断接收寄存器是否有合法数据,不为空
	//如果有合法数据就取出,赋给自定义字符,返回该字符
	unsigned char c;
	while(!(UTRSTAT2 & 0x1));
	c = URXH2;
	return c;
}

修改makefile工程文件:

CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy

all:
	$(CC) -g -c -o main.o main.c 
	$(CC) -g -c -o led.o led.c 
	$(CC) -g -c -o start.o start.s  	 	
	$(CC) -g -c -o wdt.o wdt.c  
	$(CC) -g -c -o pwm.o pwm.c 
	$(CC) -g -c -o uart.o uart.c	
	$(LD) start.o led.o uart.o main.o wdt.o pwm.o -Tmap.lds -o led.elf
	$(OBJCOPY)  -O binary -S led.elf led.bin
	$(CROSS)objdump -D led.elf > led.dis
	 
clean:
	rm -f *.o *.elf *.bin *.dis

main.c文件:

#include "uart.h"


void delay()
{
	int i;
	for(i = 0; i < 500000; i++);
}

int main()
{
	wdt_init();
	led3_init();
	pwm_init();
	
	uart_init();    //初始化uart
	while(1) 
	{
		WTCNT = 15625;
		char c=uart_getc();
		uart_putc(c);
		if('1'==c)     //输入1----->点亮led3
		{
			led3_on();
		}
		else           //输入其他----->熄灭led3
		{
			led3_off();
		}
	}
	
	return 0;
}

2.I2C和SPI---------->同步的串行通信

串行通信总线,用于芯片级的通信,都有时钟线,是同步的,一对多的通信

I2C:两根线   时钟线scl   数据线sda   半双工

 时钟前沿输出

时钟后沿采样

 

主机如何找到从机?

每一个从机都有自己的7位地址

 

SPI:四根线  sck  miso  mosi  ss  全双工  

 

 

 

极性0:时钟信号空闲状态为0

极性1:时钟信号空闲状态为1

相位0:时钟的前半个周期读数据,后半个周期改变数据

相位1:时钟的前半个周期改变数据,后半个周期读数据

注意:通信双方的极性和相位必须一致

以上是关于ARM-------->第五天,uart通信I2C和SPI的主要内容,如果未能解决你的问题,请参考以下文章

ARM裸机开发:串口通信

RTOS训练营I2C和UART知识和预习安排 + 晚课提问

RTOS训练营I2C和UART知识和预习安排 + 晚课提问

RTOS训练营I2C和UART知识和预习安排 + 晚课提问

UARTSPI和I2C详解

S5PV210-arm-裸机-i2c