AVR · Embedded System

ATmega – TWI/I2C module

1 GIỚI THIỆU

2-wire Serial Interface (TWI) là một chuẩn giao tiếp phù hợp với các ứng dụng MCU thông thường. TWI cho phép hệ thống có thể kết nối tới 128 thiết bị khác chỉ với 2 bus lines, một dùng cho clock (SCL) và một dùng cho dữ liệu (SDA). Để triển khai bus line, chúng ta sử dụng 2 pull-up resistors R1, R2 cho SDA và SCL. Tất cả các thiết bị kết nối đến bus đều có địa chỉ của riêng mình.

twibus

Figure 1 – TWI Bus Interconnection

Terminology:

  • Master – Thiết bị khởi tạo và kết thúc một transmisson, tạo clock trên SCL.
  • Slave – Thiết bị có địa chỉ cố định, được gọi và phục vụ Master.
  • Transmitter – Thiết bị gửi dữ liệu lên SDA bus line.
  • Receiver – Thiết bị đọc dữ liệu từ SDA bus line.

2 DATA TRANSFER AND FRAME FORMAT

2.1 Transferring Bits

Mỗi data bit được truyền trên TWI bus đi kèm với một xung clock. Mức tín hiệu của Data line (SDA) phải ổn định khi Clock line (SCL) ở mức cao, ngoại trừ tín hiệu START và STOP.

datavilidity

Figure 2.1 – Data Vilidity

2.2 START và STOP

Như ta đã biết, Master khởi tạo và kết thúc một transmission. Một transmission được khởi tạo khi Master gửi một START condition lên SDA và kết thúc khi Master gửi một STOP condition. Giữa START và STOP condition, SDA bus line được xem như đang bận.

START condition: SDA >> LOW khi SCL = HIGH.

STOP condition: SDA >> HIGH khi SCL = HIGH.

Một trường hợp đặc biệt là khi START condition xuất hiện giữa một cặp START-STOP, được gọi là REPEATED START condition, được sử dụng khi Master muốn khởi tạo một transmission mới mà không muốn bị mất quyền kiểm soát bus line bởi các Master khác.

startstop

Figure 2.2 – START, REPEATED START và STOP conditions

2.3 Address Packet Format

Tất cả address packet được truyền trên SDA bus line với 9 bits, trong đó gồm 7 bits địa chỉ, 1 bit READ/WRITE và 1 bit xác nhận. Nếu bit READ/WRITE = 1, read operation sẽ được thực hiện, ngược lại thì write operation được thực hiện. Khi một Slave nhận ra địa chỉ của nó trong address packet, nó sẽ xác nhận bằng cách kéo SDA xuống mức LOW tương ứng với bit thứ 9 trong address packet.

Một address packet bao gồm slave address và READ/WRITE control bit được gọi là: SLA+R và SLA+W.

Address packet được truyền với MSB, slave address có thể được lựa chọn bất kỳ trong khoảng [1, 119] vì 0000 000 được dùng cho General Call và 1111 xxx được dự trữ.

packetformat

Figure 2.3 – Address packet format

2.4 Data Packet Format

Tất cả data packet cũng được truyền trên SDA bus line với 9 bits, bao gồm 8 bits dữ liệu và 1 bit xác nhận. Trong suốt quá trình truyền gửi, Master điều kiển SCL và START/STOP conditions, trong khi đó Receiver xác nhận yêu cầu. Tín hiệu xác nhận (ACK) được Receiver gửi bằng cách kéo SDA xuống mức LOW ở chu kỳ thứ 9 của SCL, nếu SDA line vẫn ở mức HIGH thì NACK (Not Acknowledge) đã được gửi. Khi Receiver đã nhận được byte cuối cùng hoặc vì một lý do nào đó nó không thể tiếp tục nhận dữ liệu, nó sẽ thông báo cho Master bằng cách gửi NACK.

datapacket

Figure 2.4 – Data packet format


3 USING THE TWI

AVR TWI hoạt động với interrupt-base và hardware-base. Interrupt được tạo sau tất cả các sự kiện, chẳng hạn như reception of a byte hoặc transmission of a START condition. Bởi vì TWI được dựa trên interrupt, chúng ta có thể tiếp tục các thao tác khác trong khi TWI đang gửi một byte. Với hardware-base, TWI module đã thực hiện tất cả các bước để tạo một transmission, việc của chúng ta chỉ là kiểm tra status và đưa ra các cách xử lý thích hợp.

Chú ý rằng nếu bit TWIE trong TWCR và bit I trong SREG cùng được set thì TWINT flag sẽ tạo một interrupt khi một sự kiện được xử lý xong. Nếu bit TWIE bị clear, chúng ta buộc phải polling TWINT flag. Đặc biệt, TWINT flag không được xóa tự đông bởi hardware và phải được xóa trước khi bắt đầu một thao tác nào đó bằng cách set nó lên 1.

Sơ đồ dưới đây mô tả cách giao tiếp giữa Application và TWI module.

usingtwi

Figure 2.5 – Interfacing the Application to the TWI


4 TRANSMISSION MODES

TWI có thể hoạt động ở 4 modes: Master Transmitter (MT), Master Receiver (MR), Slave Transmitter (ST) và Slave Receiver (SR).

Abbreviations:

  • S – START condition.
  • Rs – REPEATED START condition.
  • R – Read bit (1).
  • W – Write bit (0).
  • A – Acknowledge bit (low level at SDA).
  • Data – 8-bit data byte.
  • P – STOP condition.
  • SLA – Slave address.

4.1 Master Transmitter Mode

Trong Master Transmitter Mode, một số lượng byte dữ liệu sẽ được gửi tới Slave Receiver. Để vào Master mode, START condition phải được gửi. Format của Address Packet sẽ xác định xem Master sẽ vào Master Transmitter Mode (SLA+W) hay Master Receiver Mode (SLA+R).

START condition được gửi bằng cách set các bit TWINT, TWSTA, TWEN trong thanh ghi TWCR:

TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTA)

Sau khi START condition được gửi, TWINT flag được set bởi hardware và status code trong TWSR sẽ là 0x08.

Để vào Master Transmitter Mode, SLA+W phải được ghi vào thanh ghi TWDR. Tiếp theo TWINT flag phải được xóa để TWI có thể gửi SLA+W lên SDA bus line:

TWCR = (1 << TWINT) | (1 << TWEN)

Khi SLA+W được gửi và bit ACK đã được nhận, TWINT flag lại được set và status code được ghi trong thanh ghi TWSR gồm 0x18, 0x20 và 0x38.

Sau khi SLA+W được gửi thành công, chúng ta sẽ gửi Data Packet đến Receiver Slave bằng cách ghi dữ liệu vào TWDR khi bit TWINT = 1 (TWINT flag vẫn chưa được xóa), sau đó chúng ta xóa TWINT flag để tiếp tục gửi TWDR lên SDA bus line:

TWCR = (1 << TWINT) | (1 << TWEN)

Việc truyền gửi tiếp tục cho đến khi byte dữ liệu cuối cùng được gửi và kết thúc bởi STOP condition hoặc REPEATED START condition:

STOP condition:  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO)

REPEATED condition: TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTA)

Sau khi REPEATED START condition được gửi, Master có thể truy cập đến các Slave khác mà không cần gửi STOP condition. Repeated START cho phép Master chuyển đổi giữa các Slave, Master Transmitter Mode và Master Receiver Mode mà không mất quyền kiểm soát bus lines.

Thông tin chi tiết về các status code: Table 26-3. Datasheet ATmega328.

4.2 Master Receiver Mode

Trong Master Receiver Mode, một số lượng data byte sẽ được nhận từ Slave Transmitter.

START condition được gửi bằng cách set các bit TWINT, TWSTA, TWEN trong thanh ghi TWCR:

TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTA)

Sau khi START condition được gửi, TWINT flag được set bởi hardware và status code trong TWSR sẽ là 0x08.

Để vào Master Receiver Mode, SLA+R phải được ghi vào thanh ghi TWDR. Tiếp theo TWINT flag phải được xóa để TWI có thể gửi SLA+R lên SDA bus line:

TWCR = (1 << TWINT) | (1 << TWEN)

Khi SLA+R được gửi và bit ACK đã được nhận, TWINT flag lại được set và status code được ghi trong thanh ghi TWSR gồm 0x38, 0x40 và 0x48.

Tiếp theo chúng ta yêu cầu dữ liệu từ Slave với ACK sau mỗi byte nhận được:

TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA)

Received data có thể được đọc từ thanh ghi TWDR. Quá trình nhận dữ liệu tiếp tục cho đến khi Master nhận đủ dữ liệu yêu cầu, gửi NACK đến Slave và kết thúc mới STOP hoặc REPEATED condition:

Not Acknowledge: TWCR = (1 << TWINT) | (1 << TWEN)

STOP condition:  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO)

REPEATED condition: TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTA)

Sau khi REPEATED START condition được gửi, Master có thể truy cập đến các Slave khác mà không cần gửi STOP condition. Repeated START cho phép Master chuyển đổi giữa các Slave, Master Transmitter Mode và Master Receiver Mode mà không mất quyền kiểm soát bus lines.

Thông tin chi tiết về các status code: Table 26-4. Datasheet ATmega328.

4.3 Slave Receiver Mode

Trong Slave Receiver Mode, một số lượng data byte sẽ được nhận từ Master Transmitter.

Để khởi tạo Slave Receiver Mode, Slave Address cần phải được ghi vào TWAR và các bit TWEA, TWEN trong TWCR phải được set.

TWAR = address

TWCR = (1 << TWEN) | (1 << TWEA)

Khi Slave Address và Write bit được nhận bởi Slave, TWINT flag được set và status code trong TWSR sẽ được dùng để xác định các hành động thích hợp.

Nếu bit TWEA bị xóa trong quá trình truyền gửi, TWI sẽ gửi NACK đến SDA sau khi nhận được byte tiếp theo. Nó được dùng để chỉ ra rằng Slave không thể nhận thêm dữ liệu.

Khi bit TWEA = 0, Slave không xác nhận địa chỉ của nó. Tuy nhiên TWI Serial Bus vẫn tiếp tục theo dõi và tiếp tục bất cứ khi nào TWEA = 1. Như vậy bit TWEA có thể được dùng để tạm thời cô lập Slave với TWI Serial Bus.

Thông tin chi tiết về các status code: Table 26-6. Datasheet ATmega328.

4.4 Slave Transmitter Mode

Trong Slave Transmitter Mode, một số lượng data byte sẽ đượcgửi đến Master Receiver.

Để khởi tạo Slave Transmitter Mode, Slave Address cần phải được ghi vào TWAR và các bit TWEA, TWEN trong TWCR phải được set.

TWAR = address

TWCR = (1 << TWEN) | (1 << TWEA)

Khi Slave Address và Read bit được nhận bởi Slave, TWINT flag được set và status code trong TWSR sẽ được dùng để xác định các hành động thích hợp.

Nếu bit TWEA bị xóa trong quá trình truyền gửi, Slave sẽ gửi byte cuối cùng đến Master. Status code 0xC0 hoặc 0xC8 tùy theo Master Receiver phản hồi NACK hay ACK. Slave sẽ chuyển sang “not addressed Slave mode” và từ chối các yêu cầu từ Master.

Khi bit TWEA = 0, Slave không xác nhận địa chỉ của nó. Tuy nhiên TWI Serial Bus vẫn tiếp tục theo dõi và tiếp tục bất cứ khi nào TWEA = 1. Như vậy bit TWEA có thể được dùng để tạm thời cô lập Slave với TWI Serial Bus.

Thông tin chi tiết về các status code: Table 26-5. Datasheet ATmega328.


Chúng ta vừa tìm hiểu nguyên lý hoạt động của giao tiếp TWI/I2C trên các MCU dòng AVR ATmega. Cảm ơn các bạn đã theo dõi bài viết.

Các bạn có thể vào Github của mình để clone thư viện I2C mà mình thường sử dụng.

Thân ái và quyết thắng.

Reference:
[1] Giao tiếp TWI-I2C.
[2] ATmega328p Datasheet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s