SWRU626 December 2025 CC3501E , CC3551E
The devices on the bus must have the capability to hold the bus after data reception and transmission and wait for software to acknowledge the transaction.
In Target mode, there are a number of software ACK controls implemented inside the IP in TACKCTL register.
TACKCTL.TACKOEN
This allows I2C Target to Not Acknowledge (NACK) for invalid data or command or Acknowledge (ACK) for valid data or command. The I2C clock is pulled low after the last data bit of the byte until Target_TACKCTL.ACKOVAL is written.
TACKCTL.ACKOEN_ON_START
When set this bit will automatically turn on the Target SACKOEN field following a Start Condition.
Sequence:
General Notes:
CCTR.TACKOEN
Similarly, the Controller in receive mode is capable of getting software ACK/NACK after ‘n’ number of bytes received.
When set and the Controller is receiving data and the number of bytes indicated in MBLEN have been received, the state machine will generate RXDONE interrupt and wait at the start of the ACK for FW/SW to indicate if an ACK or NACK should be sent. The ACK or NACK is selected by writing the CCTR.ACK bit and setting ACK accordingly. The software should write 1 to CCTR.STOP to stop the transaction. Otherwise, it can update the MBLEN to new value to continue with the transaction.
The SCL High Bus Busy Timeout is different from SCL high Timeout. While SCL high Timeout counts only during active transactions, SCL High Busy Bust Timeout counts when the bus is IDLE. It also only affects the state of this status bit and doesn’t generate any interrupt.
Both of them share the same s/w programmed count value.
SCL High Bus Busy Timeout counter enable condition is:
assign scl_high_bb_detect_en = enable_i & |scl_high_cnt_i & scl_i & idle_i & bus_busy_i & ~scl_high_bb_detect;
where,
enable_i= mmr_MASTER_I2CCCR_ACTIVE | mmr_Target_I2CTCTR_ACTIVE
scl_high_cnt_i = S/w programmed count value
scl_i = State of SCL line
idle_i = i2c_CSR_s[5] & ~i2c_sfsm_busy_o (IDLE status from Controllerand Target FSM)
bus_busy_i = State of this status bit
scl_high_timeout = Signal that flags a SCL high bus busy timeout event;