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:時鐘的前半個周期改變資料,后半個周期讀資料
注意:通信雙方的極性和相位必須一致
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294522.html
標籤:其他
上一篇:最快過橋思維題
