- I2C có thể hoạt động ở chế độ chủ hoặc khách với tốc độ 400K bit/s và chế độ chủ sẽ tự động đƣợc phân xử trong hệ thống có nhiều thiết bị chủ.
Hình 3.23. Bus I2C
Hai đƣờng Serial Clock (SCL) và Data line (SDA) phải đƣợc chuyển đổi từ chân GPIO sang I2C qua bộ kết nối.
Trang 79
Hình 3.24. Các thanh ghi của I2C
Giao diện I2C đƣợc điều khiển bởi 7 thanh ghi. Thanh ghi điều khiển có 2 thanh ghi riêng biệt đƣợc sử dụng để set và clear thanh ghi điều khiển (I2CONSET và I2CONCLR). Tốc độ bít đƣợc quyết định bởi hai thanh ghi (I2SCLH và I2CLL); thanh ghi trạng thái trả lại mã điều khiển có liện quan tới các sự kiện trên bus. Thanh ghi ghi đệm phát và đêm truyền, khi LPC đƣợc cấu hình là thiết bị slave thì địa chỉ mạng đƣợc lƣu trong thanh ghi I2ADR.
Các lệnh khởi tạo giao diện I2C:
VICVectCntl1 = 0x00000029; //Chọn độ ƣu tiên cho ngắt
VICVectAddr1 = (unsigned)I2CISR //Đƣa địa chỉ ngắt và vecto ngát VIC VICIntEnable = 0x00000200; //cho phép ngắt
PINSEL0 = 0x50; //chuyển chân GPIO sang chân I2C I2SCLH = 0x08; //Tốc độ bít to 57.6KHz
I2SCLL = 0x08
- Tốc độ bít đƣợc lƣu trong 2 thanh ghi I2SCLH và I2CSLL: Bit Rate = Pclk/(I2SCLH+I2CSLL
- Giả sử trong ví dụ trên PLL không đƣợc sử dụng và xung nhịp bên ngoài là 14.1456MHz thì tốc độ bít là:
Bit Rate = 14.7456/B ( 8 + 8) = 937500
- Cấu hình thanh ghi điều khiển bus I2C để đọc hoặc ghi dữ liệu nhƣ là bus chủ hoặc nhận hoặc trả lời từ bus chủ nhƣ sau:
Trang 80
Hình 3.25. Cấu hình thanh ghi điều khiển I2C Chƣơng trình truyền dữ liệu I2C ở chế độ master nhƣ sau:
void I2CTransferByte(unsigned Addr,unsigned Data) {
I2CAddress = Addr; //Place address and data in Globals to be used by //the interrupt
I2CData = Data;
I2CONCLR = 0x000000FF; //Clear all I2C settings I2CONSET = 0x00000040; //Enable the I2C interface I2CONSET = 0x00000020; //Start condition
}
Hình 3.26. Thanh ghi trạng thái của I2C: Chƣơng trình gửi một kí tự qua I2C:
void I2CISR (void) //I2C interrupt routine {
switch (I2STAT) //Read result code and switch to next action{ case ( 0x08): //Start bit
Trang 81 I2CONCLR = 0x20; //Clear start bit
I2DAT = I2CAddress; //Send address and //write bit break;
case (0x18): //Slave address+W, ACK I2DAT = I2Cdata; //Write data to tx register break;
case (0x20): //Slave address +W, Not ACK
I2DAT = I2CAddress; //Resend address and write bit break;
case (0x28): //Data sent, Ack
I2CONSET = 0x10; //Stop condition break;
default : break; }
I2CONCLR = 0x08; //Clear I2C interrupt flag VICVectAddr = 0x00000000; //Clear interrupt in }