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