MC95FG204 의 I 2 C Bus Application v1.0 : v1.0 v1.1 I2CMR 의 BIT2 로 master or slave mode 를설정하도록 f_master 제거함. 1. Introduction 이어플리케이션노트는 MC95FG204의 Multi-Master I 2 C Bus Application에대해설명한다. I 2 C Bus는 SCL, SDA 2 Wire로구성된 Synchronous 통신형태이며대기상태에서는 SCL, SDA가 High 상태를유지한다. 한개의 Master가다수의 Slave를제어할수있도록 Wired-AND logic 으로구성된다. 본응용에서는 Master 기능과 Slave 기능을동시에수행할수있는 Multi-Master 응용을소개하며 EEPROM 24C04 통신 Format을기준으로설명한다. EEPROM Write EEPROM Read 1.1 Master Write and Read Master는통신 Clock인 SCL을주관하여통신 Line의주인이되어 Slave에게명령을내릴수있다. 만약 SCL line이 Logic Low 상태로남아있으면 Master는 Clock 주도권을잃어버리고 Slave 상태로남는다. 이를 Arbitration Lost라하며 Multi-Master 통신망에서다른 Slave가 Clock 주도권을차지하여 Master가될수있는기회를제공한다. SRT는 I 2 C 통신의논리적인시작을의미하며전기적으로 SCL이 High인상태에서 SDA가 Low상태로전환하고 Setup Time이상동안유지되는것을의미한다. STP는 SCL이 Low인상태에서 SDA가 Low에서 High로전환될때통신 STOP함을의미한다. MAD는 Slave Address( 주소값 b7~b1) 이며, CMD(b0) 는읽기 (1)/ 쓰기 (0) 를지정한다.
ACK 는받는쪽에서보내는쪽으로정확하게받았음을지정하는것으로 9 th Clock 에서보내는 쪽에서는 SDA 단자를입력으로전환하여받는쪽에서의 ACK 신호를인식한다. 이는 하드웨어적으로실시간에이루어진다. 이렇게 8bit 의 Data 와 ACK 를합쳐 9bit 단위로통신하며 완료후인터럽트가걸린다. 아래 Read Write Frame 에서각,(comma) 후인터럽트가발생한다. SRT: Start Signal RST: Restart Signal (SDA가 High인상태에서다시 Start가발생할때 ) MAD: Main Slave Address (MSB 7bit) CMD: Data Direction Command Read (1) / Write (0) SAD: Sub Register Address (8bit) ACK: Acknowledge Signal (1bit) DATA: Data Byte (8bit) STP: Stop Signal Write: SRT MAD+CMD+ACK, SAD+ACK, DATA0+ACK, DATA1+ACK,,.STP Read: SRT MAD+CMD+ACK, SAD+ACK, RST MAD+CMD+ACK, DATA0+ACK,,STP 읽기는 Sub Register 주소쓰기후, Data 값읽기명령을새로보내어해당 Sub Register 의 값부터연속적으로읽어온다. 따라서 STOP 을하지말고 Restart 를수행하여 Read Command 보내어읽기전환하고본격적으로 Data 를읽는다. 1.2 Slave Receive and Transmit 초기화상태에서모든 I 2 C Device는 Slave상태를유지하며 SCL, SDA는 High (Free) 상태이다. SRT 신호가발생되고 Master가 First 9개 Clock을발생할때, Master가보내는 MAD+CMD 가운데 MAD값이자신의 Self Address와일치할경우 SCL Line을 Low 상태로 Master에게 Acknowledge ( 하드웨어적으로 ) 를알려줌과동시에 I 2 C 인터럽트가발생하여필요한소프트웨어적인일을수행한다. Slave 동작은반드시인터럽트에의한하드웨어적인도움을받아야만가능하다. 본 24C04 응용에서는 Slave 인터럽트의역할은 Master가지정한 SLAVE Address와 Command 주기, Sub Address주기를설정하는일을제외하고모두 Slave가 Master 요구한 Data 값을보내는역할이다. 1.3 MC95FG204 I 2 C Hardware I2CMR (I 2 C Mode Control Register, address 0xDA) 는 8bit 읽기 / 쓰기레지스터이며각 Bit 들을 의미는아래와같다. IIF(bit7) 는인터럽트가발생될때 1이된다. 이 bit는인터럽트서버루틴을발생하지않고일반루틴에서 I 2 C byte 송수신여부를확인하여처리할때이용되며사용후강제로지워야한다. IICEN(bit6) 은 I 2 C 하드웨어를 Enable 상태로만들고자할때 1을설정한다. RESET(bit5) 은 Internal Register 값을초기화할때 1을설정한다. INTEN(bit4) 은 I 2 C인터럽트를활성화하고자할때 1을설정한다.
ACKEN(bit3) 는하드웨어적인 Acknowledge 발생 ( 자동 ) 기능을활성화할때 1을설정한다. 일반적으로 1을설정하여 Acknowledge 신호가자동발생되도록하지만 Master가 Slave로부터값을읽어올때마지막 byte에서는 Acknowledge를발생하지않음으로써 Slave가더이상송신할필요없이통신을종료하도록알려주는기능으로이용되기도한다. STOP(bit1) 은 Master가 I 2 C Frame을종료하기위한신호를발생할때 1을설정한다. START(bit7) 는 Master가 I 2 C Frame을시작하기위한신호를발생할때 1을설정한다. 또한한 Frame간의정보를손상함이없이 Command만변경할때 STOP신호없이 RESTART 신호를발생할때도이용된다. I2CSR (I 2 C Status Register, address 0xDB) 는 8bit 읽기전용레지스터이며각 Bit 들을의미는 아래와같다. GCALL(bit7) 은 MAD값을 0x0? 로하는호출이발생할경우 1이된다. 이는 Master가다른모든 Slave를초기화하기위한 Command로사용되며모든 SLave들은 GCALL bit가인식되면현재의상황을종료하고 Slave mode상태로대기한다. TEND(bit6) 는 1byte 통신이완료된경우 1이된다. 인터럽터를사용하지않는 I 2 C 통신에서는 TEND bit를읽어 1byte 전송이완료되었는가를판단한다. 이 bit는향후 Master/Slave의상태를나타내는 ID bit로사용하도록하드웨어를수정할계획이다. STOP(bit5) 은 Master가 STP 신호를발생할때 Slave가 1이된다. STOP이발생하면 Slave 상태로초기화후대기한다. SSEL(bit4) 은 Master가보내는 MAD 값과자신의 Self Address값이일치되었을때 1이되며 Slave로서역할을할준비를한다. 만약 CMD가쓰기명령이면약속된값을 I2CDR에써넣어서 Master가읽어가도록한다. MLOST(bit3) 는 Master가 SCL을통해 Clock을보내는중다른 Slave가 SCL line을 Low로잡으면 Master에서 1이된다. 1이발생된 Master는 Clock의주도권을내놓고 Slave 상태로대기하여야한다. 이는 Multi Master 통신에서 Slave 상태로머물러있던다른 Master가 Clock 주도권을갖기위한수단이다. BUSY(bit2) 는 Clock이발생하여통신중이거나다른 Slave가 SDA line을 LOW상태로잡고있을때 1이된다. 이는 Master가한 Frame을보내기위한시작단계에서 BUS의상태를확인해보고자할때이용된다. 또한 bus상태가 Free하지못하고 Pending 여부를확인할때이용된다. TMODE(bit1) 는 Data의송수신방향을보여준다. Transmit(1)/Receive(0) RXACK(bit0) 는 Data를보낸쪽에서받은쪽이 Acknowledge신호를제대로발생했는가여부를확인하기위한 Bit이다. 9 th Clock에서정확하게 ACK 신호를발생하면 1이된다. I2CSCLLR (SCL Low Period Register, address 0xDC) 는 SCL Clock Speed 를설정하기위해 Low 구간의시간을지정한다. I2CSCLHR (SCL High Period Register, address 0xDC) 는 SCL Clock Speed 를설정하기위해 High 구간의시간을지정한다.
I2CSDAHR (SDA Hold Register, address 0xDE) 는 SRT, RST, STP 와같은 I 2 C start, stop 신호를 발생할때 SDA 가 Low 상태를유지하는구간을정의한다. I2CDR (I 2 C Data Register, address 0xDF) 는 8bit 통신 Data 읽기 / 쓰기를하는 Register 이다. I2CSAR (Self Address Register, address 0xD7) 는 Slave mode 에서자신의주소 (Slave Address) 를 지정하기위한레지스터이다. 2. Description 2.1 I 2 C Bus 초기화설정 MC95FG204 는 400KHz 고속통신 I 2 C 를지원하지만본예제에서는일반적인 I 2 C 통신을다룬다. I 2 C 초기화를위한 Peripheral Register 설정은다음과같다. void I2C_Initial(void) I2CMR = 0x20; // I2C clear I2CMR = 0x40; // I2C enable I2CMR = 0x50; // I2C interrupt enaable I2CSCLLR = 100; // SCL Speed is 40KHz@8MHz I2CSCLHR = 100; // I2CSDAHR = 50; // SDA hold time 6.5us@8MHz I2CAR = SELF_ADDRESS; // self address is 0xA0 I2CMR = IICEN+INTEN+ACKEN; // I2C interrupt enable EA = 1; // global interrupt enable I2C_Initial() 함수는 Program 시작할때또는오류가발생할때초기화수행한다. 2.2 I 2 C Bus Start I 2 C bus 하드웨어를초기화한상태에서 Master 로서송신 Frame 을수행하고자할때 I2C_Start() 함수를호출하면설정된값에따라 Data 를출력하게된다. *wi2c_post 는보낼 Data Pointer 이고, ri2c_mad 는 Main Slave Address 값이다. 실제보내기위한 Data 는 xtx_buffer[n] 에사전저장되어 있어야한다. void I2C_Start(void) wi2c_post = &xtx_buffer; // 보낼 Data 저장위치지정. xtx_buffer[0] = 0x83; xtx_buffer[1] = 0x23; // 보낼 Data[0] // 보낼 Data[1]
xtx_buffer[2] = 0x56; ri2c_count = 4; // 보낼 Data[2] // 3 byte 송신 I2CMR = 0x59; // start generation I2CDR = 0xA0; // I2CSR = 0xFF; // I2CMR = 0x04; // Master mode 예를들어 Master가 Slave(0xA0) 의 Register1(0x01)~Register3(0x03) 에각 0x83, 0x23, 0x56 이상 3 byte를준비하여보내고자한다면 xtx_buffer[0] 에 0x83, xtx_buffer[1] 에 0x23, xtx_buffer[2] 에 0x56을사전에저장하여야한다. 또한 ri2c_count에 3byte 보냄을선언한다. f_rd_eeprom, f_restart 는 24x04 EEPROM의통신특징을구분하기위해설정한 Bool Data이다. 2.3 Multi Master I 2 C Interrupt Subroutine MC95FG204 는하드웨어 I 2 C 기능을이용하여 Multi-Master I 2 C Bus 를구현할수있다. 다양한 I 2 C Format 의통신을간단하게지원하므로프로그램의유연성을높인다. 이는 void I2C_Int_Handler(void) interrupt 12 Byte itemp; // itemp = I2CSR; // if(i2csr & 0x00) // arbtration Lost(3), general call(7), STOP(5) I2C_Initial(); // if((i2cmr & 0x04)==0) // SSEL[4] (Slave) if(itemp & 0x10) // SSEL[4] (Slave) address matchded? if(itemp & 0x02) // I2CDR = *wi2c_post; // wi2c_post = &xtx_buffer; // *wi2c_post = I2CDR; // slave sub-address set if(itemp & 0x02) // slave transmit? I2CDR = *wi2c_post; // // *wi2c_post = I2CDR; // slave receive? // I2CSR = 0xFF; // // Master mode
if(itemp & 0x02) // TMODE[1] master transmit? if(itemp & 0x01) // RXACK ack in? rtx_count--; // ACK ok if(rtx_count) // I2CDR = *wi2c_post; // I2CSR = 0xFF; // // I2CMR = 0x7A; // STOP generation // I2C_Initial(); // ACK fail // master receive? rrx_count--; // last byte no ACK! if(rrx_count) if(rrx_count==1) I2CMR = 0x70; // last byte read no ACK! *wi2c_post = I2CDR; master receive I2CSR = 0xFF; I2CMR = 0x7A; // STOP generation end byte? I 2 C 하드웨어가물리적으로 Clock 을가동하고 Data Shifter 를움직여 Data 를송수신시작하는 시점은 I2CSR 에 0xFF 값을넣는순간부터수행된다.