IIC 功能使用方法

IIC 功能使用方法
Application Note
IIC 功能使用方法
1
適用產品:SM59R16A2 / SM59R08A2
IIC 使用概述:
IIC module 硬體使用 SCL (clock)及 SDA (data) 兩條線。
速度:SCL 最高可達 400Kbps(可由軟體設定 SFR IICBR[2:0])。
IIC 可選擇 master 或 slave 兩種模式。
提供中斷(RXIF, TXIF)及兩組控制位址使用。
借由硬體設定,Master 可自動產生 START, Re-START, STOP 信號;Slaver 可自動偵測 START,
Re-START, STOP 信號。
2.6 Slaver 最多可接 127 devices,線材電容量最高限制為 400pF。
2
2.1
2.2
2.3
2.4
2.5
3
以下說明與 IIC 相關的特殊控制暫存器及特殊狀態暫存器
Mnemonic
IICCTL
IICS
IICA1
IICA2
IICRWD
Description
IIC control
register
IIC status register
IIC Address 1
register
IIC Address 2
register
IIC Read/Write
register
Mnemonic: IICCTL
7
6
IICEN
BF
Direct
Bit 7
Bit 6 Bit 5
Bit 4
IIC function
Bit 3
F9h
IICEN
BF
MSS
MAS
RStart
F8h
MStart
RXIF
TXIF
RDR
TDR
FAh
IICA1[7:1]
FBh
IICA2[7:1]
FCh
5
MSS
Bit 2
RXAK
Bit 1
Bit 0
IICBR[2:0]
04h
TXAK
00h
RW
MATCH1
or RW1
MATCH2
or RW2
IICSRWD[7:0]
4
MAS
3
RStart
2
RESET
A0h
60h
00h
1
IICBR[2:0]
0
Address: F9h
Reset
04h
IICEN: IIC 致能旗標 ,若要使用 IIC 必須致能:
當 IICEN = 1,IIC 致能。
當 IICEN = 0,IIC 禁能。
BF: IIC 傳送失敗旗標 Bus failed flag (used in master mode only):
當 Master 傳送資料”1”至 SDA,但 Master 卻偵測為”0”時,此旗標將被硬體設置為”1” 。
此旗標可由軟體清除。
MSS: 主從模式設定 Master or slave mode select:
MSS = 1,設定為 master mode。
MSS = 0,設定為 slave mode。
*要使用 IIC,在設定其它旗標時必須最先致能此旗標。
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
1
Ver A 2008/05
IIC 功能使用方法
Application Note
MAS: IIC 位址旗標 Master address select (master mode only):
MAS = 0 ,選擇控制位址(control byte)由特殊控制暫存器 IICA1 送出。
MAS = 1 ,選擇控制位址(control byte)由特殊控制暫存器 IICA2 送出。
RStart: 重新啟動旗標 Re-start control bit (master mode only):
RStart = 0,在送出位置後旗標由硬體設置為”0” 。
RStart = 1,旗標致能;在收到 ACK 後,重新產生並送出開始條件及位置(IICA1 或 IICA2 則由 MAS 位址旗
標選擇)
IICBR[2:0]: IIC 鮑率選擇旗標 Baud rate selection (master mode only):
where Fosc is the external crystal or oscillator frequency. 旗標預設值為 Fosc/512
IICBR[2:0]
000
001
010
011
100
101
110
111
Mnemonic: IICS
7
6
MStart
RxIF
Baud rate
Fosc/32
Fosc/64
Fosc/128
Fosc/256
Fosc/512
Fosc/1024
Fosc/2048
Fosc/4096
5
TxIF
4
RDR
3
TDR
2
RxAK
1
TxAK
0
RW
Address: F8h
Reset
00h
MStart: 開始控制旗標 Master start control bit (master mode only)
MStart = 1,產生並送出開始條件及位置(位置是 IICA1 或 IICA2,則由 MAS 位址旗標選擇);此旗標由軟
體設置。
MStart = 0,產生並送出結束條件;此旗標由軟體設置。
RxIF: 資料接收中斷旗標 Data receive interrupt flag
Slaver 由此旗標可判斷資料是否已接收
RxIF = 1,已接收到 1Byte 的資料。
RxIF = 0,接收完成後必須由軟體清除。
TxIF: 資料傳送中斷旗標 Data transmit interrupt flag
Master 由此旗標可判斷資料是否已傳出
TxIF = 1,當資料已由讀寫資料暫存旗標 IICRWD 載至位移暫存器,並已由位移暫存器傳送時,TxIF 為”1”
TxIF = 0,傳送資料完成後必須由軟體清除。
RDR: Read data ready
RDR = 1,當 IIC module 接收資料,並儲存至 IICRWD 時,由硬體自動設定為”1” 。
RDR = 0,當 IICRWD 完成資料接收後,必須由軟體清除此旗標;當 RDR = 0 時,IIC module 才可再次寫入
新的資料至 IICRWD。
TDR: Transmit data ready
TDR = 1,當程序為傳送模式時,將資料儲存至 IICRWD 後,由軟體設定此旗標為”1” 告知 IIC module 可傳
出資料。
TDR = 0,當 IIC module 由 IICRWD 讀取資料並完成傳送時,此旗標則由硬體自動清除。
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
2
Ver A 2008/05
IIC 功能使用方法
Application Note
RxAK: Receive acknowledgement
當 IIC module 傳送端時,此旗標為唯讀,不可由程序編寫。
當 IIC module 為 master mode:傳出 1Byte 資料後,slaver 將回覆 RxAK
= 0 : slaver 接收成功。
= 1 : slaver 接收失敗。
當 IIC module 為 slave mode:傳出 1Byte 資料後,master 將回覆 RxAK
= 0 : master 接收成功(某些應用時,表示 master 要求再傳更多資料)。
= 1 : master 接收失敗(某些應用時,表示 master 不再需要任何資料)。
TxAK: Transmit acknowledgement
TxAK 表示 IIC module 當做接收端時,接收 1Byte 資料後的狀態,並回覆傳送端 ACK-1bit(the 9th bit),為圖
14-1 所示。
Fig 14-1 : Acknowledgement bit in the 9th bit of a byte transmission
RW: Slave mode read or write
1. 當 IIC module 為 slave mode 時,此旗標為唯讀,不可由程序編寫。
2. 此旗標由 master 的位址 IICA1(或 IICA2) 的 LSB (bit 0) 所控制:
= 0 : master 要求 slaver 的 IIC module 為接收模式(即 master write, slaver read)
= 1 : master 要求 slaver 的 IIC module 為傳送模式(即 master read, slaver write)
Mnemonic: IICA1
7
6
5
4
IICA1[7:1]
3
2
1
0
Match1 or RW1
Address: FAh
Reset
A0h
Slave mode:
IICA1[7:1]: IIC Address registers
第一組控制位址 IICA1 共 7-bits,當 slaver 接收到 master 的位址時,兩者會相互比對;
Match1: = 1,當 master 與 slave 的控制位址 7-bits 相同時,由硬體設定 8th-bit(Match1 或 RW1)為”1” 。
= 0,當 IIC Stop 時,由硬體清除為”0” 。
Master mode:
IICA1[7:1]: IIC Address registers
共 7-bits 的控制位址,master 將與所有的 slaver 的控制位址相互比對;
RW1: 當 master 與 slave 的控制位址 7-bits 相同時,master 送出 8th-bit(R/W-bit),告知 slaver 讀寫的狀態
RW1= 1:為 master IIC module 接收模式(即 master read, slaver write)。
RW1= 0:為 master IIC module 傳送模式(即 master write, slaver read)。
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
3
Ver A 2008/05
IIC 功能使用方法
Application Note
Fig. 14-2 : RW bit in the 8th bit after IIC address
Mnemonic: IICA2
7
6
5
4
IICA2[7:1]
R/W
3
2
1
0
Match2 or RW2
R or R/W
Address: FBh
Reset
60h
Slave mode:
IICA2[7:1]: IIC Address registers
第二組控制位址 IICA2 共 7-bits,當 slaver 接收到 master 的位址時,兩者會相互比對;
Match2: = 1,當 master 與 slave 的控制位址 7-bits 相同時,由硬體設定 8th-bit(Match2 或 RW2)為”1” 。
= 0,當 IIC Stop 時,由硬體清除為”0” 。
Master mode:
IICA2[7:1]: IIC Address registers
共 7-bits 的控制位址,master 將與所有的 slaver 的控制位址相互比對;
RW2: 當 master 與 slave 的控制位址 7-bits 相同時,master 送出 8th-bit(R/W-bit),告知 slaver 讀寫的狀態:
RW2= 1:為 master IIC module 接收模式(即 master read, slaver write)。
RW2= 0:為 master IIC module 傳送模式(即 master write, slaver read)。
Mnemonic: IICRWD
7
6
5
4
3
IICRWD[7:0]
2
1
0
Address: FCh
Reset
00h
IICRWD[7:0]: IIC 讀寫資料暫存器(8-bits) IIC read write data buffer:
IIC module 為接收模式(讀取)時,接收資料的暫存區。
IIC module 為傳送模式(寫入)時,傳送資料的暫存區。
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
4
Ver A 2008/05
IIC 功能使用方法
Application Note
4
以下為 IIC 相對應的中斷相量表,及中斷相關的致能旗標
Table 11.1 : Interrupt vectors
IE0 – External interrupt 0
TF0 – Timer 0 interrupt
Interrupt Vector
Address
0003h
000Bh
Interrupt Number
*(use Keil C Tool)
0
1
IE1 – External interrupt 1
0013h
2
TF1 – Timer 1 interrupt
RI0/TI0 – Serial channel 0 interrupt
TF2/EXF2 – Timer 2 interrupt
001Bh
0023h
002Bh
3
4
5
SPIIF – SPI interrupt
004Bh
9
ADCIF – A/D converter interrupt
EEIIF – Expanded External Interrupt
IICIF – IIC interrupt
RI1/TI1 – Serial channel 1 interrupt
0053h
005Bh
006Bh
0083h
10
11
13
16
Interrupt Request Flags
Mnemonic
IEN0
IEN1
IEN2
IP0
IP1
Description
Interrupt Enable
0 register
Interrupt Enable
1 register
Interrupt Enable
2 register
Interrupt priority
level 0
Interrupt priority
level 1
Direct
Bit 7
Bit 6
Bit 5
Interrupt
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
RESET
A8h
EA
-
ET2
ES0
ET1
EX1
ET0
EX0
00h
B8h
EXEN2
-
IEIIC
-
IEEEI
IEADC
IESPI
-
00h
9Ah
-
-
-
-
-
-
-
ES1
00h
A9h
-
-
IP0.5
IP0.4
IP0.3
IP0.2
IP0.1
IP0.0
00h
B9h
-
-
IP1.5
IP1.4
IP1.3
IP1.2
IP1.1
IP1.0
00h
(1) IIC 中斷致能設罝:
IEN0 |= 0x80;
//Enable interrupt All
IEN1 |= 0x20;
//Enable interrupt IIC
(2) IIC 中斷程序表示:
void IIC_interrupt(void) interrupt 13 using 1
{
IRCON_IICIF = 0;
//Clear interrupt flag
}
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
5
Ver A 2008/05
IIC 功能使用方法
Application Note
5 以下為 IIC master 及 slave 通訊的流程圖
此流程圖將以兩顆MCU為例,同時說明Master及Slave之動作:
5.1 Master 部分是以 MCU 對一般的 EEPROM (24xx 系列)做 Random Read 的動作方式
5.2 Slave 則是以 MCU 模擬 EEPROM 的動作;當 slave 收到 address 時,則回傳 data 至 master
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
6
Ver A 2008/05
IIC 功能使用方法
Application Note
6 IIC master 及 slave 通訊的範例程式
說明:
6.1 Master 部分是以 MCU 對一般的 EEPROM (24xx 系列)做 Random Read 的動作方式
6.2 Slave 則是以 MCU 模擬 EEPROM 的動作;當 slave 收到 address 時,則回傳 data 至 master
Description
Main program
Master:
//=====================================================================
//
//
SYNCMOS TECHNOLOGY
//
//=====================================================================
#include "..\h\SM59R16A2.h"
#include "..\h\SM59R16A2_extradef.h"
#include "..\LCD\LCD16x2.h"
#include "..\MISC\delay.h"
#define Control_Byte 0xA0
void IICISR(void) interrupt 13 using 3
{
IRCON_IICIF = 0;
}
//Clear interrupt flag
void main()
{
unsigned char temp_addr =0 ,temp_read =0;
unsigned int Counter, Err =0;
//must wait for LCD stable================
LCD_Init();
Delay10mSec(1);
//Initialize IIC=========================
//IICCTL = 0xA7;
// Fosc/4096
IICCTL
= 0xA0;
// Fosc/32
IICS = 0X00;
// Clear Status
//IRCON = 0x00;
//IEN0
= 0x80;
//IEN1
= 0x20;
//IEN2
= 0x00;
while(1)
{
for(temp_addr=100; temp_addr>0; temp_addr--)
{
PrintLcdStrLX( 1, 0, "TX:
RX:
");
SetCursorAddr(1, 4);
PrintLcdDec( temp_addr );
// -- Send Start -IICA1
= Control_Byte;
IICS_MStart
= 1;
while(~IICS_TXIF);
IICS_TXIF = 0;
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
7
Ver A 2008/05
IIC 功能使用方法
Application Note
Description
Master:
// -- Send ADDRESS -IICRWD = temp_addr;
IICS_TDR = 1;
while(~IICS_TXIF);
IICS_TXIF =0;
// -- Send CONTROL -IICA1
= Control_Byte | 0x01;
IICCTL |= 0x08;
while(~IICS_TXIF);
IICS_TXIF = 0;
// -- Read one -IICS_TXAK
= 1;
while( ~IICS_RXIF );
IICS_RXIF= 0;
temp_read= IICRWD;
IICS_RDR = 0;
// -- Send STOP -IICS_MStart
= 0;
//Result
P2 = temp_read;
SetCursorAddr(1, 12);
PrintLcdDec( temp_read );
if(temp_addr +temp_read != 100)
Err++;
SetCursorAddr(2, 0);
PrintLcdDec( Err );
Delay1mSec(10);
}
}
}
Description
Main program
Slave:
//====================================================================
//
//
SYNCMOS TECHNOLOGY
//
//====================================================================
#include "..\h\SM59R16A2.h"
#include "..\h\SM59R16A2_ExtraDef.h"
/* IICS */
sbit MSTART= IICS^7;
sbit RXIF = IICS^6;
sbit TXIF = IICS^5;
sbit RDR = IICS^4;
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
8
Ver A 2008/05
IIC 功能使用方法
Application Note
Description
Slave:
sbit TDR
sbit RXAK
sbit TXAK
sbit RW
= IICS^3;
= IICS^2;
= IICS^1;
= IICS^0;
bit TxInt = 0;
bit RxInt = 0;
unsigned char temp=0x00;
void IIC_interrupt(void) interrupt 13 using 1
{
IRCON_IICIF = 0;
}
//Clear interrupt flag
void main(void)
{
//Initialize IIC=========================
IICCTL
= 0x80;
//Enable IIC module
IICS = 0x00;
//
IICA1
= 0xA0;
//Control Byte 1
IICA2
= 0x50;
//Control Byte 2
//IEN0
= 0x80;
//Enable interrupt All
//IEN1
= 0x20;
//Enable interrupt IIC
//IEN2
= 0x00;
while(1)
{
//IICS
= 0x00;
while(~RXIF);
RDR = 0;
RXIF = 0;
TXAK = 0;
while(~RXIF);
RXIF = 0;
temp = IICRWD;
RDR = 0;
//
// Waiting RxIF set
// ready receive new data
// Clear RxIF
// Return ACK or NACK
// recive data
while(~RXIF);
RDR = 0;
RXIF = 0;
IICRWD = (100 - temp);
TDR = 1;
while(~TXIF);
TXIF = 0;
P2 = IICRWD;
// Load data to IICRWD
// transmit data
// Waiting TxIF set
// Clear TxIF
// test result
}
}
Specifications subject to change without notice, contact your sales representatives for the most recent information.
IRFWX-A077
9
Ver A 2008/05