From 702e5ab763eb40572e7f2734b7affef66cd5b712 Mon Sep 17 00:00:00 2001 From: stnolting Date: Sun, 15 Dec 2024 20:21:24 +0100 Subject: [PATCH] [docs] add new TWD section --- docs/datasheet/soc_twd.adoc | 167 ++++++++++++++++++++++++++++++++ docs/figures/twd_sequences.png | Bin 0 -> 51252 bytes docs/sources/twd_sequences.json | 34 +++++++ 3 files changed, 201 insertions(+) create mode 100644 docs/datasheet/soc_twd.adoc create mode 100644 docs/figures/twd_sequences.png create mode 100644 docs/sources/twd_sequences.json diff --git a/docs/datasheet/soc_twd.adoc b/docs/datasheet/soc_twd.adoc new file mode 100644 index 000000000..dd74f858f --- /dev/null +++ b/docs/datasheet/soc_twd.adoc @@ -0,0 +1,167 @@ +<<< +:sectnums: +==== Two-Wire Serial Device Controller (TWD) + +[cols="<3,<3,<4"] +[frame="topbot",grid="none"] +|======================= +| Hardware source files: | neorv32_twd.vhd | +| Software driver files: | neorv32_twd.c | +| | neorv32_twd.h | +| Top entity ports: | `twd_sda_i` | 1-bit serial data line sense input +| | `twd_sda_o` | 1-bit serial data line output (pull low only) +| | `twd_scl_i` | 1-bit serial clock line sense input +| | `twd_scl_o` | 1-bit serial clock line output (pull low only) +| Configuration generics: | `IO_TWD_EN` | implement TWD controller when `true` +| | `IO_TWD_FIFO` | RX/TX FIFO depth, has to be a power of two, min 1 +| CPU interrupts: | fast IRQ channel 0 | FIFO status interrupt (see <<_processor_interrupts>>) +| Access restrictions: 2+| privileged access only, non-32-bit write accesses are ignored +|======================= + + +**Overview** + +The NEORV32 TWD implements a I2C-compatible **device-mode** controller. Processor-external hosts can communicate +with this module by issuing I2C transactions. The TWD is entirely passive an only reacts on those transmissions. + +Key features: + +* Programmable 7-bit device address +* Programmable interrupt conditions +* Configurable RX/TX data FIFO to "program" large TWD sequences without further involvement of the CPU + +.Device-Mode Only +[NOTE] +The NEORV32 TWD controller only supports **device mode**. Transmission are initiated by processor-external modules +and not by an external TWD. If you are looking for a _host-mode_ module (transactions initiated by the processor) +check out the <<_two_wire_serial_interface_controller_twi>>. + + +**Theory of Operation** + +The TWD module provides two memory-mapped registers that are used for configuration & status check (`CTRL`) and +for accessing transmission data (`DATA`). The `DATA` register is transparently buffered by separate RX and TX FIFOs. +The size of those FIFOs can be configured by the `IO_TWD_FIFO` generic. Software can determine the FIFO size via the +`TWD_CTRL_FIFO_*` bits. + +The module is globally enabled by setting the control register's `TWD_CTRL_EN` bit. Clearing this bit will disable +and reset the entire module also clearing the internal RX and TX FIFOs. Each FIFO can also be cleared individually at +any time by setting `TWD_CTRL_CLR_RX` or `TWD_CTRL_CLR_TX`, respectively. + +The external two wire bus is sampled sampled and synchronized to processor's clock domain with a sampling frequency +of 1/8 of the processor's main clock. To increase the resistance to glitches the sampling frequency can be lowered +to 1/64 of the processor clock by setting the `TWD_CTRL_FSEL` bit. + +.Current Bus State +[TIP] +The current state of the I²C bus lines (SCL and SDA) can be checked by software via the `TWD_CTRL_SENSE_*` control +register bits. Note that the TWD module needs to be enabled in order to sample the bus state. + +The actual 7-bit device address of the TWD is programmed by the `TWD_CTRL_DEV_ADDR` bits. Note that the TWD will +only response to a host transactions if the host issues the according address. Specific general-call or broadcast +addresses are not supported. + +Depending on the transaction type, data is either read from the RX FIFO and transferred to the host ("read operation") +or data is received from the host and written to the TX FIFO ("write operation"). Hence, data sequences can be +programmed to the TX FIFO to be fetched from the host. If the TX FIFO is empty and the host keeps performing read +transaction, the transferred data byte is automatically set to all-one. + +The current status of the RX and TX FIFO can be polled by software via the `TWD_CTRL_RX_*` and `TWD_CTRL_TX_*` +flags. + + +**TWD Interrupt** + +The TWD module provides a single interrupt to signal certain FIFO conditions to the CPU. The control register's +`TWD_CTRL_IRQ_*` bits are used to enabled individual interrupt conditions. Note that all enabled conditions are +logically OR-ed. + +* `TWD_CTRL_IRQ_RX_AVAIL`: trigger interrupt if at least one data byte is available in the RX FIFO +* `TWD_CTRL_IRQ_RX_FULL`: trigger interrupt if the RX FIFO is completely full +* `TWD_CTRL_IRQ_TX_EMPTY`: trigger interrupt if the TX FIFO is empty + +The interrupt remains active until all enabled interrupt-causing conditions are resolved. +The interrupt can only trigger if the module is actually enabled (`TWD_CTRL_EN` is set). + + +**TWD Transmissions** + +Two standard I²C-compatible transaction types are supported: **read** operations and **write** operations. These +two operation types are illustrated in the following figure (note that the transactions are split across two lines +to improve readability). + +.TWD single-byte read and write transaction timing (not to scale) +image::twd_sequences.png[] + +Any new transaction starts with a **START** condition. Then, the host transmits the 7 bit device address MSB-first +(green signals `A6` to `A0`) plus a command bit. The command bit can be either **write** (pulling the SDA line low) +or **read** (leaving the SDA line high). If the transferred address matches the one programmed to to `TWD_CTRL_DEV_ADDR` +control register bits the TWD module will response with an **ACK** (acknowledge) by pulling the SDA bus line actively +low during the 9th SCL clock pulse. If there is no address match the TWD will not interfere with the bus and move back +to idle state. + +For a **write transaction** (upper timing diagram) the host can now transfer an arbitrary number of bytes (blue signals +`D7` to `D0`, MSB-first) to the TWD module. Each byte is acknowledged by the TWD by pulling SDA low during the 9th SCL +clock pules (**ACK**). Each received data byte is pushed to the internal RX FIFO. Data will be lost if the FIFO overflows. +The transaction is terminated when the host issues a **STOP** condition. + +For a **read transaction** (lower timing diagram) the cost keeps the SDA line at high state while sending the clock +pulse. The TWD will read a byte from the internal TX FIFO and will transmit it MSB-first to the host (blue signals `D7` +to `D0)`. During the 9th clock pulse the host has to acknowledged the transfer (**ACK**). If no ACK is received by the +TWD no data is taken from the TX FIFO and the same byte can be transmitted in the next data phase. If the TX FIFO becomes +empty while the host keeps reading data, all-one bytes are transmitted. The transaction is terminated when the host +issues a **STOP** condition. + +A **repeated-START** condition can be issued at any time bringing the TWD back to the start of the address/command +transmission phase. The control register's `TWD_CTRL_BUSY` flag remains high while a bus transaction is in progress. + +.Abort / Termination +[TIP] +An active or even stuck transmission can be terminated at any time by disabling the TWD module. +This will also clear the RX/TX FIFOs. + + +**Tristate Drivers** + +The TWD module requires two tristate drivers (actually: open-drain drivers - signals can only be actively driven low) for +the SDA and SCL lines, which have to be implemented by the user in the setup's top module / IO ring. A generic VHDL example +is shown below (here, `sda_io` and `scl_io` are the actual TWD bus lines, which are of type `std_logic`). + +.TWD VHDL Tristate Driver Example +[source,VHDL] +---- +sda_io <= '0' when (twd_sda_o = '0') else 'Z'; -- drive +scl_io <= '0' when (twd_scl_o = '0') else 'Z'; -- drive +twd_sda_i <= std_ulogic(sda_io); -- sense +twd_scl_i <= std_ulogic(scl_io); -- sense +---- + + +**Register Map** + +.TWD register map (`struct NEORV32_TWD`) +[cols="<2,<1,<4,^1,<7"] +[options="header",grid="all"] +|======================= +| Address | Name [C] | Bit(s), Name [C] | R/W | Function +.18+<| `0xffffea00` .18+<| `CTRL` <|`0` `TWD_CTRL_EN` ^| r/w <| TWD enable, reset if cleared + <|`1` `TWD_CTRL_CLR_RX` ^| -/w <| Clear RX FIFO, flag auto-clears + <|`2` `TWD_CTRL_CLR_TX` ^| -/w <| Clear TX FIFO, flag auto-clears + <|`3` `TWD_CTRL_FSEL` ^| r/w <| Bus sample clock / filter select + <|`10:4` `TWD_CTRL_DEV_ADDR6 : TWD_CTRL_DEV_ADDR0` ^| r/w <| Device address (7-bit) + <|`11` `TWD_CTRL_IRQ_RX_AVAIL` ^| r/w <| IRQ if RX FIFO data available + <|`12` `TWD_CTRL_IRQ_RX_FULL` ^| r/w <| IRQ if RX FIFO full + <|`13` `TWD_CTRL_IRQ_TX_EMPTY` ^| r/w <| IRQ if TX FIFO empty + <|`14:9` - ^| r/- <| _reserved_, read as zero + <|`18:15` `TWD_CTRL_FIFO_MSB : TWD_CTRL_FIFO_LSB` ^| r/- <| FIFO depth; log2(`IO_TWD_FIFO`) + <|`24:12` - ^| r/- <| _reserved_, read as zero + <|`25` `TWD_CTRL_RX_AVAIL` ^| r/- <| RX FIFO data available + <|`26` `TWD_CTRL_RX_FULL` ^| r/- <| RX FIFO full + <|`27` `TWD_CTRL_TX_EMPTY` ^| r/- <| TX FIFO empty + <|`28` `TWD_CTRL_TX_FULL` ^| r/- <| TX FIFO full + <|`29` `TWD_CTRL_SENSE_SCL` ^| r/- <| current state of the SCL bus line + <|`30` `TWD_CTRL_SENSE_SDA` ^| r/- <| current state of the SDA bus line + <|`31` `TWD_CTRL_BUSY` ^| r/- <| bus engine is busy (transaction in progress) +.2+<| `0xffffea04` .2+<| `DATA` <|`7:0` `TWD_DATA_MSB : TWD_DATA_LSB` ^| r/w <| RX/TX data FIFO access + <|`31:8` - ^| r/- <| _reserved_, read as zero +|======================= diff --git a/docs/figures/twd_sequences.png b/docs/figures/twd_sequences.png new file mode 100644 index 0000000000000000000000000000000000000000..7471b485b5dc02688312cd41738dadc0030dfbc6 GIT binary patch literal 51252 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

PDRM7YGm)L zF1an9?7GH({;){=Wd}7uC8v1L2gi^jx1GS-8aB(5n?g*Ng05W(5e&%YG{_C~s62^= z*jf>r_ApwSQxOsW1Q7{Kc4(43A zaEnWjPuC^Q+b_!@sZ%FlQkKlRnyvRrwpOiklsvcEv{}I>s(EZ(;rl#Dl9LB9jn*Yk z^M47zQ+*y!EFKUq-mO<3ivsRwRGrubAr(^Rs0e>K5J2G;`0Dd3A;^i)3OBnLeV~oe+%HoptgpqRiX>$c)+(CU*-<=;qtu8 zQbq0N9Hi`bIB9$2O7Y0S7#a6#&KBJ_;xJ)w-0cLfqkVbL<}h$x_CwXPmX%D@IYCQ94&Eo}o|QK)pSc zb1)RrBZsu7eB;v?qtC6HO8$NsyU^V~K;9_p3V6h|;yoaT>C`6gCmpk?cyxSe!OGAH zlnV+cF}d64&2&vkw^v108fnW`AWy|eot|Za4OVVhs<-s1SF~*>jqNR6@^nkP>&tG3 z7=yzRBKCC`oYfd&@&&W%6z4`jCbd;#IcxEA0dqG4sFbS$d4rP|xljU2v$JE;(w1rM z`6jSft$rC(>I+^GL#AQ=FkZ~J^TDz*77}@@u99Zo@c@j8qfbkQ(lgSl-96De-_MJY zOP8UstM}w3JybrMVytFTU$n+_!WTRN#snn19_b@@?m#A`W(uztCr-R+iV`C5gpdPg z-YF7REkBHiqaJh)Rv<2Yr3IaWZCIo+8V`yC?kd=iyUEf9nI@sJCg+MImB#iBkR>Dx zz_Do!!!2{?lR<&gJ@0Op1AVJw?tEmraJ6S)q>E3ZmujvOR~8~aOR`lDE57iAJvksudgoOR{6U{~Y6bR8J z;%iA}`L{Ju);>w4X=S#YL2al{Kkvy(UaDW%1#~w5U^EWGfgOPtu-%4;pK%e3c(>`t zU4H}Qx_jp;EPz7)@YdEJWqyGA2tvD@9#{2`8sCEpsw(PrOZV4X%cC*saoyHXUo2S|R`>jq7k zw(!@D5#iWzdIXiOxSoZ?PTe!X#-2m$odDgQ=`?_EQOx}EDJsLSS;c|--OR%EOFfE# zSYt3D*cInc;IrA}iYhRO4b@j4tT7zKGWE~oU;(c1-r_mzqxZvz2C>NcgBW#}9t6?) zFD%C|foqdt3Z1U=XUpKkw0jOk=z;-UA#!7Gr3Afk)?^=YURt?#I!vUGqqJhY>+)() zPfv!?EBZi=e5JDht-@7NI`GF~V&0K%Xmv&qHn|Sb1NuEn%Vp7OpdLCAlu@`()DQQu zk>S#$u(|}+#rS zR}K|8j&4vSctnAr4r6!#JDobxPzYofo`xztchy`ZFS^Fm=M|=)NzS1&o#(-*wLa$; zJG+y9g3YSnEIydQYCl#)%WL#eq%al1Q>MOyKE;E1y0>m6C`^MCWo7Q|t`_C*VW!{S zauCY;UxBX$m9(YGmTE+s*foO&0AyAb5%KEYVv7Wh7@d z2Hd>flF{1MxM4Ktm^!OJzTNO*o2Xa?e0?>a*_3nRZ4R){?=sUqt$`4{AMO+!Qgj^y zqP~MblA^%Kj}HwvT~T;EE8~hFB!O@l{1~)Qf#(pEyYr-UNuQY)bGc*$7tSqdeC5h+ zc41XTZlyqhUyP&(-MQ=c9k0ZaIQJE8wOH&xc)Zg${zu=s|HTiJsJo&_47x!Jw$oO_ zasRKs#NAHLxe~oQM5#K|t=JuNB`R%$&7$MTjw{~gmsl$dscz75r$_EN}?5goK1wG{5jWpXL5`5c?);-<>dbXiI_e z?Qx~C-{d&aCb*_`t3v)y{|)q^CkWFN@F(l@31pY~g`-{fLuD?|yfpPTbkZoWB{3&qw?p56X?uXG6fczB=Syxxqe6hPN#Pp%% z|9qm1vS0$eLYJ#&`4?nnN9_jKpu0*{(~!&+zal&Dd(dYtE9P?6m{iB^WWx$ zoKxi_^gnrQfREp!IFKQED8<#MEBi1VfUd(FTH ze#WzKDQf_}Rb??pY&Uh@g=cBPCj}AricnWOJC!&g5?TYT53?RdIF?dvRdDM*(U~ho#uV;Nc=ozA2lbm57%H zJsU!Q4v2&l`}Ayle~oW2+42XDHLt9su4Q*AA1v)X4@CVMxO6#WFT8#~n4G!n?q+G( zJ$p3KoZ#w??@UFk@Bzx>!XK1JA}$fPe5!3?=R(XquQ)}d{mG~%)#vD$Td(BKi<{Pw zP|}tDn$Qf%u}><`a|@kiL5i(1m%@}e0-m2m-2_! z89F3Opc#=h5^BYSse4}%@Y)qms7>iG@l{#;%V zmyj@A?nbuyzJBp5KW@O4!9UH=JP%!U12KNz7Vmc?^D4G~wV^FXJT+SQq6JG@=^BvH z@O5)flmct16>xVfoiBfw(rz;DoWX&mr`Y>02MT1}?}XD}3Tm|l8E#(8duk&^fJKO2 z3%pgutc$#OgU!xxQRdIyrYe5y_mPr;ke>*UHAu|4X%{}!1YOR})9R8hoqtnL-`2Rt z^0pd)A=PSuOgvj4AbpM&KX$I=fa#$8$S0|W7+=aaw8q5goj3Bs25=Q{sl*>(Ci~?E zJNzk7TLsabQRr%Apz$pOwh57-tckn^M8L^Kfab#U#xFJy92C+kG|u69d6329^OoAM zBPRKs@7iSBzjDXPsryXHD!NR|%uba0Nyz8#nKxuEPgH(-GzfI zV#AA?_Bcj=A&cOTULPkwkD4UIr~Tut)b9aTl_DXDS&kO*pnuOloTRZcT8}hU?j;I2 zc>lm^!a$-EZ5te)A3a)rVNOcaIxs-bs%}vB@O)DnBsy%OHsbY!_jd2u+omrsay2o6 zRDerl6)`j70ds9B`W3AbVf4UUbl2456IFt~MMe@B&dnRJoeUj=ii!>GiK*on#%!0e zQ(YrTl);BW_L+rYZ*a>z-0CW?V7|qwu0$n2a$gU_HvSZ)_T%&2`s`%yZ-qkz6vTWt zre1dl_E0=!zCrhUri9-LC~h_VvD4+GZR!u{4T+!u5Lc6%pPvP)0m%Jvf&{#B+>;eI(i%H8ev~>_;#)wNtVjY4Z%v!}ytg+gmWW;$oPBG}MQ>EwoYhtybG`(#HlFd@dcMwl zUX3h%UgR7FV27lJPNX|p)SYI;C+|}rkF>w||BxMY_9J|AX|r zO$>YuMpa!>-M0PdkE|tD*G&KB;@j)&b~KJ3jY@kR!H!{3{mT2!`_c|DoFX%A4pS_$_T&%#oi zjR}S0#7sB)fK3Sr+x*ztfLX&IM;{Oj4tegNC$~TxiT%>Wu}!0x-?=vGj@8TvnM{xm z9t#Zmeh559&r!kkJtS^Hh%w!f;y7C2{s}N1r(_&P9Wr+30ir+=xfwV+RFdtED?8{S zn^VR#-gvwLHqVfZ|BMb+!kP($J7sIkqkm-?43?SfBGxO?E}awLsq$JFE*svikc{y9 zImn@ic$AWlqYFo8&mKjA6QTEeq3mWr+kN)5WxnyW_U<+zoD{gfpsIXG`g=J=yizIZ zG3e%ZB-SuqcpI>keWCVTj4sHZ2)+AS43<%-vK?G*?z8LAWqK@$Uo{-kWe|f zLW0Xs&1TUn49!*Oa?IQbcfYWzs;W1({UdXl%oo<2a$j-&I}-?654Qk=BM2Crq>&TP z0Tf~jfR*kh7G0{ek|2N30(P&qjYX6kUx|7RDx#%LsehpxD!tZPbo^VZ9CkCLyW_rbrA1A?_&|+|Y87n=|Jj@2r z;MFkK4)y1-BBP7!%bkMHUkX=(^)Y=2Jbi^YDpu#s#BrlsA$XWyKos{MDeTiVi}9NwWa_7FR7+M%VFz|LikIfhgorB zJ6Xf(Pwse~Y+o{EpG>&S?p=RE9%qQ}5C$w~ss8@{n;d`6%vaUjrIx1O;dl zZ4d}2LH11frT1&61o{p3v+VOjK-sAUbgHDx%g1Jg=Ft0KnH*}bq7((48_SXJFIRUjGHZRS&Z`uED=Czmq!F_B2C=cyw-q?~QwAM}dhWsKIH G;Qs>bOV0rS literal 0 HcmV?d00001 diff --git a/docs/sources/twd_sequences.json b/docs/sources/twd_sequences.json new file mode 100644 index 000000000..4f2a3705b --- /dev/null +++ b/docs/sources/twd_sequences.json @@ -0,0 +1,34 @@ +{signal: [ + [ + "write byte", + {name: 'SDA', wave: '10.7..7..7..7..7..7..7..0..0..x|.', node: 'a.b.....................c..d..e', data: ['A6', 'A5', 'A4', 'A3', 'A2', 'A1', 'A0']}, + {name: 'SCL', wave: '1.0.10.10.10.10.10.10.10.10.10.|.'}, + {}, + {name: 'SDA', wave: 'x|.5..5..5..5..5..5..5..5..0..0.1', node: '...........................f..gh.i', data: ['D7', 'D6', 'D5', 'D4', 'D3', 'D2', 'D1', 'D0']}, + {name: 'SCL', wave: '0|..10.10.10.10.10.10.10.10.10.1.'} + ], + {}, + {}, + [ + "read byte", + {name: 'SDA', wave: '10.7..7..7..7..7..7..7..1..0..x|.', node: 'j.k.....................l..m..n', data: ['A6', 'A5', 'A4', 'A3', 'A2', 'A1', 'A0']}, + {name: 'SCL', wave: '1.0.10.10.10.10.10.10.10.10.10.|.'}, + {}, + {name: 'SDA', wave: 'x|.9..9..9..9..9..9..9..9..0..0.1', node: '...........................o..pq.r', data: ['D7', 'D6', 'D5', 'D4', 'D3', 'D2', 'D1', 'D0']}, + {name: 'SCL', wave: '0|..10.10.10.10.10.10.10.10.10.1.'} + ] + ], + edge: [ + 'a-b START', + 'c-d WRITE', + 'd-e ACK by TWD', + 'f-g ACK by TWD', + 'h-i STOP', + + 'j-k START', + 'l-m READ', + 'm-n ACK by TWD', + 'o-p ACK by HOST', + 'q-r STOP' + ] +}