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的主要内容,如果未能解决你的问题,请参考以下文章