OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [soc_twi.adoc] - Diff between revs 60 and 64

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 60 Rev 64
Line 23... Line 23...
 
 
The NEORV32 TWI implements a **TWI controller**. It features "clock stretching" (if enabled via the control
The NEORV32 TWI implements a **TWI controller**. It features "clock stretching" (if enabled via the control
register), so a slow peripheral can halt the transmission by pulling the SCL line low. Currently, **no multi-controller
register), so a slow peripheral can halt the transmission by pulling the SCL line low. Currently, **no multi-controller
support** is available. Also, the NEORV32 TWI unit cannot operate in peripheral mode.
support** is available. Also, the NEORV32 TWI unit cannot operate in peripheral mode.
 
 
The TWI is enabled via the _TWI_CT_EN_ bit in the _TWI_CT_ control register. The user program can start / stop a
The TWI is enabled via the _TWI_CTRL_EN_ bit in the `CTRL` control register. The user program can start / stop a
transmission by issuing a START or STOP condition. These conditions are generated by setting the
transmission by issuing a START or STOP condition. These conditions are generated by setting the
according bits (_TWI_CT_START_ or _TWI_CT_STOP_) in the control register.
according bits (_TWI_CTRL_START_ or _TWI_CTRL_STOP_) in the control register.
 
 
Data is send by writing a byte to the _TWI_DATA_ register. Received data can also be read from this
Data is send by writing a byte to the `DATA` register. Received data can also be read from this
register. The TWI controller is busy (transmitting data or performing a START or STOP condition) as long as the
register. The TWI controller is busy (transmitting data or performing a START or STOP condition) as long as the
_TWI_CT_BUSY_ bit in the control register is set.
_TWI_CTRL_BUSY_ bit in the control register is set.
 
 
An accessed peripheral has to acknowledge each transferred byte. When the _TWI_CT_ACK_ bit is set after a
An accessed peripheral has to acknowledge each transferred byte. When the _TWI_CTRL_ACK_ bit is set after a
completed transmission, the accessed peripheral has send an acknowledge. If it is cleared after a
completed transmission, the accessed peripheral has send an acknowledge. If it is cleared after a
transmission, the peripheral has send a not-acknowledge (NACK). The NEORV32 TWI controller can also
transmission, the peripheral has send a not-acknowledge (NACK). The NEORV32 TWI controller can also
send an ACK by itself ("controller acknowledge _MACK_") after a transmission by pulling SDA low during the
send an ACK by itself ("controller acknowledge _MACK_") after a transmission by pulling SDA low during the
ACK time slot. Set the _TWI_CT_MACK_ bit to activate this feature. If this bit is cleared, the ACK/NACK of the
ACK time slot. Set the _TWI_CTRL_MACK_ bit to activate this feature. If this bit is cleared, the ACK/NACK of the
peripheral is sampled in this time slot instead (normal mode).
peripheral is sampled in this time slot instead (normal mode).
 
 
In summary, the following independent TWI operations can be triggered by the application program:
In summary, the following independent TWI operations can be triggered by the application program:
 
 
* send START condition (also as REPEATED START condition)
* send START condition (also as REPEATED START condition)
Line 48... Line 48...
 
 
[IMPORTANT]
[IMPORTANT]
The serial clock (SCL) and the serial data (SDA) lines can only be actively driven low by the
The serial clock (SCL) and the serial data (SDA) lines can only be actively driven low by the
controller. Hence, external pull-up resistors are required for these lines.
controller. Hence, external pull-up resistors are required for these lines.
 
 
The TWI clock frequency is defined via the 3-bit _TWI_CT_PRSCx_ clock prescaler. The following prescalers
The TWI clock frequency is defined via the 3-bit _TWI_CTRL_PRSCx_ clock prescaler. The following prescalers
are available:
are available:
 
 
.TWI prescaler configuration
.TWI prescaler configuration
[cols="<4,^1,^1,^1,^1,^1,^1,^1,^1"]
[cols="<4,^1,^1,^1,^1,^1,^1,^1,^1"]
[options="header",grid="rows"]
[options="header",grid="rows"]
|=======================
|=======================
| **`TWI_CT_PRSCx`**          | `0b000` | `0b001` | `0b010` | `0b011` | `0b100` | `0b101` | `0b110` | `0b111`
| **`TWI_CTRL_PRSCx`**        | `0b000` | `0b001` | `0b010` | `0b011` | `0b100` | `0b101` | `0b110` | `0b111`
| Resulting `clock_prescaler` |       2 |       4 |       8 |      64 |     128 |    1024 |    2048 |    4096
| Resulting `clock_prescaler` |       2 |       4 |       8 |      64 |     128 |    1024 |    2048 |    4096
|=======================
|=======================
 
 
Based on the _TWI_CT_PRSCx_ configuration, the actual TWI clock frequency f~SCL~ is derived from the processor main clock f~main~ and is determined by:
Based on the _TWI_CTRL_PRSCx_ configuration, the actual TWI clock frequency f~SCL~ is derived from the processor main clock f~main~ and is determined by:
 
 
_**f~SCL~**_ = _f~main~[Hz]_ / (4 * `clock_prescaler`)
_**f~SCL~**_ = _f~main~[Hz]_ / (4 * `clock_prescaler`)
 
 
.TWI register map
.TWI register map (`struct NEORV32_TWI`)
[cols="<2,<2,<4,^1,<7"]
[cols="<2,<2,<4,^1,<7"]
[options="header",grid="all"]
[options="header",grid="all"]
|=======================
|=======================
| Address | Name [C] | Bit(s), Name [C] | R/W | Function
| Address | Name [C] | Bit(s), Name [C] | R/W | Function
.10+<| `0xffffffb0` .10+<| _TWI_CT_ <|`0` _TWI_CT_EN_     ^| r/w <| TWI enable
.10+<| `0xffffffb0` .10+<| `NEORV32_TWI.CTRL` <|`0` _TWI_CTRL_EN_     ^| r/w <| TWI enable
                                    <|`1` _TWI_CT_START_  ^| r/w <| generate START condition
                                              <|`1` _TWI_CTRL_START_  ^| r/w <| generate START condition
                                    <|`2` _TWI_CT_STOP_   ^| r/w <| generate STOP condition
                                              <|`2` _TWI_CTRL_STOP_   ^| r/w <| generate STOP condition
                                    <|`3` _TWI_CT_PRSC0_  ^| r/w .3+<| 3-bit clock prescaler select
                                              <|`3` _TWI_CTRL_PRSC0_  ^| r/w .3+<| 3-bit clock prescaler select
                                    <|`4` _TWI_CT_PRSC1_  ^| r/w
                                              <|`4` _TWI_CTRL_PRSC1_  ^| r/w
                                    <|`5` _TWI_CT_PRSC2_  ^| r/w
                                              <|`5` _TWI_CTRL_PRSC2_  ^| r/w
                                    <|`6` _TWI_CT_MACK_   ^| r/w <| generate controller ACK for each transmission ("MACK")
                                              <|`6` _TWI_CTRL_MACK_   ^| r/w <| generate controller ACK for each transmission ("MACK")
                                    <|`7` _TWI_CT_CKSTEN_ ^| r/w <| allow clock-stretching by peripherals when set
                                              <|`7` _TWI_CTRL_CKSTEN_ ^| r/w <| allow clock-stretching by peripherals when set
                                    <|`30` _TWI_CT_ACK_   ^| r/- <| ACK received when set
                                              <|`30` _TWI_CTRL_ACK_   ^| r/- <| ACK received when set
                                    <|`31` _TWI_CT_BUSY_  ^| r/- <| transfer/START/STOP in progress when set
                                              <|`31` _TWI_CTRL_BUSY_  ^| r/- <| transfer/START/STOP in progress when set
| `0xffffffb4` | _TWI_DATA_ |`7:0` _TWI_DATA_MSB_ : TWI_DATA_LSB_ | r/w | receive/transmit data
| `0xffffffb4` | `NEORV32_TWI.DATA` |`7:0` _TWI_DATA_MSB_ : TWI_DATA_LSB_ | r/w | receive/transmit data
|=======================
|=======================

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.