User manual

Table Of Contents
Zynq-7000 AP SoC Technical Reference Manual www.xilinx.com 614
UG585 (v1.11) September 27, 2016
Chapter 20: I2C Controller
2. Clear interrupts. Read and write back the read value to i2c.Interrupt_status_reg0.
3. Write read data count to transfer size register and hold bus if required. Write read data
count value to i2c.Transfer_size_reg0. If read data count greater than FIFO depth, set
i2c.Control_reg0 [HOLD] = 1.
4. Write the slave address. Write the address to the i2c.I2C_address_reg0 register.
5. Wait for data to be received into the FIFO. Poll on i2c.Status_reg0 [RXDV] = 1.
a. If i2c.Status_reg0 [RXDV] = 0, and any of i2c.Interrupt_status_register [NACK],
i2c.Interrupt_status_register [ARB_LOST], i2c.Interrupt_status_register [RX_OVF],
i2c.Interrupt_status_register [RX_UNF] interrupts are set, then stop the transfer and report
the error, otherwise continue to poll on i2c.Status_reg0 [RXDV].
b. If i2c.Status_reg0 [RXDV] = 1, and if any of i2c.Interrupt_status_register [NACK],
i2c.Interrupt_status_register [ARB_LOST], i2c.Interrupt_status_register [RX_OVF],
i2c.Interrupt_status_register [RX_UNF] interrupts are set, then stop the transfer and report
the error. Otherwise, go to step 6.
6. Read data and update count. Read data from FIFO until i2c.Status_reg0[RXDV] = 1. Decrement
the read data count and if it is less than or equal to the FIFO depth, clear i2c.Control_reg0[HOLD].
7. Check for Completion of transfer. If total read count reaches zero, poll on
i2c.Interrupt_status_reg0 [COMP] = 1. Otherwise continue from step 5.
Example: Master Write Using Polled Method
1. Set Direction of transfer as write and Clear the FIFO’s. Write 0x40 to i2c.Control_reg0.
2. Clear Interrupts. Read and write back the read value to i2c.Interrupt_status_reg0.
3. Calculate the space available in FIFO. Subtract i2c.Transfer_size_reg0 value from FIFO depth.
4. Fill the data into FIFO. Write the data to i2c.I2C_data_reg0 based on the count obtained in
step 3.
5. Write the Slave Address. Write the address to i2c.I2C_address_reg0 register.
6. Wait for TX FIFO to be empty. Poll on i2c.Status_reg0 [TXDV] = 0.
a. If i2c.Status_reg0 [TXDV] = 1, any of i2c.Interrupt_status_register [NACK],
i2c.Interrupt_status_register [ARB_LOST], i2c.Interrupt_status_register [RX_OVF],
i2c.Status_register [TX_OVF] are set, then stop the transfer and report the error otherwise
continue to poll.
b. If i2c.Status_reg0 [TXDV] = 0, repeat step 3, 4 and 6 until there is no further data.
7. Wait for completion of transfer. Check for i2c.Interrupt_status_reg0 [COMP] = 1.
Example: Master Read Using Interrupt Method
1. Set direction of transfer as read and clear the FIFO’s. Write 0x41 to i2c.Control_reg0.
2. Clear interrupts. Read and write back the read value to i2c.Interrupt_status_reg0.
3. Enable Timeout, NACK, Rx overflow, Arbitration lost, DATA, Completion interrupts. Write
0x22F to i2c.Intrpt_en_reg0.
4. Write read data count to transfer size register and hold bus if required. Write read data
count value to i2c.Transfer_size_reg0. If read data count greater than FIFO depth, set
i2c.Control_reg0 [HOLD].