第9章
串列傳輸介面
2
串列埠的硬體特性
SPCE061A 有兩個串列介面,
z 一個是具有同步時脈的 SIO,
z 另一個是無同步時脈的通用非同步串列介面UART。
SIO串列設備共用時脈與資料匯流排接腳,其傳輸 訊號包括讀/寫、位址與8位元資料,不同設備間 可以靠著裝置事先定義的位址來識別。
UART的資料同步是靠起始位元的脈波來完成,當 資料傳送完畢,其後須有停止位元,用來與下一筆 資料的起始位元隔離。SIO與UART接腳皆與
IOB埠接腳共用
串列埠接腳
4
SIO 的讀寫操作時序
非同步串列傳輸格式
6
串列埠控制的暫存器
$7024H 讀/寫
P_UART_BaudScalarLow
$7022H 讀/寫
P_UART_Command2
$7023H 讀/寫
P_UART_Data
$7024H 讀/寫
P_UART_BaudScalarLow
$7020H P_SIO_Stop 寫
$7021H P_UART_Command1 寫
$701AH 讀/寫
P_SIO_Data
$701FH 讀/寫
P_SIO_Start
$701DH 讀/寫
P_SIO_Addr_High
$701CH 讀/寫
P_SIO_Addr_Mid
$701BH 讀/寫
P_SIO_Addr_Low
$701EH 讀/寫
P_SIO_Ctrl
I/O位址
操作
暫存器名稱
UART相關暫存器
P_UART_Command1 (寫) ($7021H) 規劃中斷方式、同位元
P_UART_Command2 (讀/寫) ($7022H) 狀態
P_UART_Data(讀/寫)($7023H)
P_UART_BaudScalarLow(讀/
寫)($7024H) 速率
P_UART_BaudScalarHigh (讀/
8
P_SIO_Ctrl 暫存器
致能讀/寫框的傳輸功能 (預設值) X
- X X
X 0
X X
關閉讀/寫框的傳輸功能 X
- X X
X 1
X X
設定資料框傳輸方向為讀取(預設值) X
- X X
X X
0 X
設定資料框傳輸方向為寫入 X
- X X
X X
1 X
IOB0與IOB1作為通用的 I/O 埠 (預設值) X
- X X
X X
X 0
IOB0與IOB1作為SCK與SDA用 X
- X X
X X
X 1
資料傳輸速率設為CPUCLK/32 X
- X 1
1 X
X X
資料傳輸速率設為CPUCLK/8 X
- X 0
1 X
X X
資料傳輸速率設為CPUCLK/4 X
- X 1
0 X
X X
資料傳輸速率為CPUCLK/16 (預設值) X
- X 0
0 X
X X
串列設備位址為24位元(A0~A23) 1
- 1 X
X X
X X
串列設備位址為8位元(A0~A7) 0
- 1 X
X X
X X
無位址設定 1
- 0 X
X X
X X
串列設備位址為16 位元(A0~A15) (預設值) 0
- 0 X
X X
X X
Addr_Select Clock_Sel -
R/W_EN SIO_Config R/W
功能說明 b0
b1 B3 b2
b4 B5
b7 b6
P_SIO_Data 暫存器
D0 D1
D2 D3
D4 D5
D6 D7
b0 b1
b2 b3
b4 b5
b6
b7
10
P_SIO_ Addr 暫存器群
A0 A1
A2 A3
A4 A5
A6 A7
b0 b1
b2 b3
b4 b5
b6 b7
A8 A9
A10 A11
A12 A13
A14 A15
b0 b1
b2 b3
b4 b5
b6 b7
P_SIO_ Addr_Low
P_SIO_Addr_ Mid
P_SIO_Addr_High
A16 A17
A18 A19
A20 A21
A22 A23
b0 b1
b2 b3
b4 b5
b6 b7
P_SIO_Start /P_SIO_Stop
- -
- -
- -
- Busy
b0 b1
b2 b3
b4 b5
b6 b7
P_SIO_Stop P_SIO_Start
向 P_SIO_Stop暫存器寫入任一數值,可以停止資料傳輸
12
P_UART_Command1暫存器
關閉奇偶同位檢查功能
- 0 -
-
-
-
-
-
啟用奇偶同位檢查功能
- 1 -
-
-
-
-
-
奇同位校檢功能
-
- 0 -
-
-
-
-
偶同位校檢功能
-
- 1 -
-
-
-
-
內部重置位元(停用)
-
-
-
- 0 -
-
-
內部重置位元(啟用)
-
-
-
- 1 -
-
-
禁止 TxRDY 產生 UART IRQ 中斷
-
-
-
-
- 0 -
-
允許 TxRDY 產生 UART IRQ 中斷
-
-
-
-
- 1 -
-
禁止 RxRDY 產生 UART IRQ 中斷
-
-
-
-
-
- 0 -
允許 RxRDY 產生 UART IRQ 中斷
-
-
-
-
-
- 1 -
- -
P_Check Parity
-
I_Reset TxIntEn
RxIntEn
功能 b0
b1 b2
b3 b4
b5 b6
b7
P_UART_Command2暫存器
1:允通發送接腳 0:禁止發送接腳 1:允通接收接腳
0:禁止接收接腳
- -
- -
- -
TxPinEn RxPinEn
b0 b1
b2 b3
b4 b5
b6
b7
14
UART 錯誤原因及解決方法
改善傳輸條件 傳輸條件差,可能有雜訊干擾
PE (同位元錯誤)
1.提高接收資料的速度 2.降低資料傳輸速度 接收端RX接收資料的速度低於發
送端TX發送資料的速度,導 致RX端資料溢出
OE (溢出錯誤)
1.使用一致的資料格式
2.設置一致的串列傳輸速率 發送接腳 TX 和接收接腳 RX 的
資料幀的格式或串列傳輸速 率不一致
FE (框架錯誤)
解決方法 原因
錯誤類型
P_UART_Data 暫存器
D0 D1
D2 D3
D4 D5
D6 D7
b0 b1
b2 b3
b4 b5
b6
b7
16
P_UART_BaudScalar 暫存器群
UART 串列傳輸速率的計算公式如下:
Fosc=49.152 / 40.960 / 32.768 MHz時,
傳輸速率Baud= ( Fosc / 4 ) / Scale
Fosc=24.576 / 20.480 MHz時,
傳輸速率Baud= ( Fosc / 2 ) / Scale
24.576 / 49.152MHz 常用速率值
57690 213
D5H 00H
57600
51200 240
F0H 00H
51200
48000 256
00H 01H
48000
38400 320
40H 01H
38400
19200 640
80H 02H
19200
9600 1280
00H 05H
9600
4800 2560
00H 0AH
4800
2400 5120
00H 14H
2400
1500 8192
FFH 1FH
1500 (最小值)
實際傳輸速率
(bps) Scale (十進位)低位元組
($7024H)高位元組
($7025H)
串列傳輸速率
(bps)
18
20.48 / 40.96MHz常用速率值
115056 89
59H 115200 (最大 00H
值)
102400 100
64H 00H
102400
57528 178
B2H 00H
57600
51200 200
C8H 00H
51200
48075 213
D5H 00H
48000
40000 256
00H 01H
40000
38352 267
0BH 01H
38400
19212 533
15H 02H
19200
9597 1067
2BH 04H
9600
4801 2133
55H 08H
4800
2400 4267
ABH 10H
2400
1500 6827
ABH 1AH
1500 (最小值)
實際串列傳輸速 率(bps)
Scale (十進位)低位元組
($7024H)高位元組
($7025H)
串列傳輸速率
(bps)
32.768 MHz 常用速率值
57690 142
8EH 00H
57600
51200 160
A0H 00H
51200
47906 171
ABH 00H
48000
38460 213
D5H 00H
38400
19185 427
ABH 01H
19200
9604 853
55H 03H
9600
4799 1707
ABH 06H
4800
2400 3413
55H 0DH
2400
1500 5461
55H 15H
1500 (最小值)
實際串列傳輸速 率(bps)
Scale (十進位)低位元組
($7024H)高位元組
($7025H)
串列傳輸速率
(bps)
20
SPCE061A 與 PC 連接圖
SPR4096電路圖
22
UART相關副程式1
void UART_Init() {
char ch;
// 注意: 特殊接腳時仍須設定GPIO暫存器, 否則可能因被強迫pull-high/low而不動作
*P_IOB_Dir=0x0400; // IOB10=output(TX), IOB7=input(RX)
*P_IOB_Attrib=0x0480; // IOB10=not invert, IOB7=float
*P_UART_Command1=0x20; // UART reset, 無同位元
*P_UART_Command1=0x00;
//*P_UART_BaudScalarHigh=0x00; // Baud=115200bps //*P_UART_BaudScalarLow=0x6B;
*P_UART_BaudScalarHigh=0x05; // Baud=9600bps
*P_UART_BaudScalarLow=0x00;
*P_UART_Command2=0x00C0; // 致能RX/TX ch = *P_UART_Data; // 清除緩衝區
}
UART相關副程式2
char UART_GetByte() {
while( ! (*P_UART_Command2 &
0x0080)) { //等待接收完畢
*P_Watchdog_Clear=C_WDTCL R;
}
return *P_UART_Data;
24
UART相關副程式3
void UART_SendByte(char ch) {
while( !( *P_UART_Command2 &
0x0040)) { //等待前一次發射完畢
*P_Watchdog_Clear=C_WDTCL R;
}
uart.h
void UART_Init();
char UART_GetByte();
void UART_GetString(char *);
void UART_Put_Dec(unsigned int );
void UART_SendByte(char);
void UART_SendString(char *);
void
UART_SendString_no_linefeed(ch
26