@@ -8,7 +8,19 @@ import Clash.Cores.I2C.BitMaster
88import Clash.Cores.I2C.ByteMaster
99import Clash.Annotations.TH
1010
11- -- | Core for I2C communication
11+ -- | Core for I2C communication. Returns the output enable signals for SCL en SDA
12+ -- These signals assume that when they are `True`, they pull down SCL and SDA respectively.
13+ -- For 2-wire I2C, you can use BiSignals (`Clash.Signal.Bidirectional.BiSignalIn` and `Clash.Signal.Bidirectional.BiSignalOut`)
14+ -- An example i2c design could look like this:
15+ -- i2cComp clk rst ena sclIn sdaIn = (sclOut, sdaOut)
16+ -- where
17+ -- sclOut = writeToBiSignal sclIn (mux sclOe (pure $ Just 0) (pure Nothing))
18+ -- sdaOut = writeToBiSignal sdaIn (mux sdaOe (pure $ Just 0) (pure Nothing))
19+ -- (sclOe, sdaOe) = unbundle i2cO
20+ -- i2cIn = bundle (readFromBiSignal sclIn, readFromBiSignal sdaIn)
21+ -- (dout,i2cOpAck,busy,al,ackWrite,i2cOut) = i2c clk arst rst ena clkCnt claimBus i2cOp ackRead i2cI
22+ -- ...
23+
1224i2c ::
1325 forall dom .
1426 KnownDomain dom =>
@@ -22,45 +34,61 @@ i2c ::
2234 " ena" ::: Signal dom Bool ->
2335 -- | Clock divider
2436 " clkCnt" ::: Signal dom (Unsigned 16 ) ->
25- -- | Start signal
26- " start" ::: Signal dom Bool ->
27- -- | Stop signal
28- " stop" ::: Signal dom Bool ->
29- -- | Read signal
30- " read" ::: Signal dom Bool ->
31- -- | Write signal
32- " write" ::: Signal dom Bool ->
33- -- | Ack signal
34- " ackIn" ::: Signal dom Bool ->
35- -- | Input data
36- " din" ::: Signal dom (BitVector 8 ) ->
37+ -- | Claim bus signal
38+ " claimBus" ::: Signal dom Bool ->
39+ -- | I2C operation
40+ " i2cOp" ::: Signal dom (Maybe I2COperation ) ->
41+ -- | Acknowledge signal to be transmitted from master to slave on read operations
42+ -- True means SDA is low.
43+ " ackRead" ::: Signal dom Bool ->
3744 -- | I2C input signals (SCL, SDA)
3845 " i2c" ::: Signal dom (" scl" ::: Bit , " sda" ::: Bit ) ->
3946 -- |
4047 -- 1. Received data
4148 -- 2. Command acknowledgement
4249 -- 3. I2C bus busy
4350 -- 4. Arbitration lost
44- -- 5. I2C slave acknowledgement
51+ -- 5. Received acknowledge signal from slave to master on write operations.
52+ -- True means SDA is low.
4553 -- 6. Outgoing I2C signals
46- -- 6.1 SCL
47- -- 6.2 SCL Output enable`
48- -- 6.3 SDA
49- -- 6.4 SDA Output enable
54+ -- 6.1 SCL Tri-state signals, Nothing means pulled high.
55+ -- 6.2 SDA Tri-state signals, Nothing means pulled high.
5056 " " :::
5157 ( " i2cO" ::: Signal dom (BitVector 8 )
52- , " scl" ::: Signal dom Bool
53- , " sclOEn" ::: Signal dom Bool
54- , " sda" ::: Signal dom Bool
55- , " sdaOEn" ::: Signal dom Bool
56- , " i2cO" ::: Signal dom (" scl" ::: Bit , " sclOEn" ::: Bool , " sda" ::: Bit , " sdaOEn" ::: Bool ))
57- i2c clk arst rst ena clkCnt start stop read write ackIn din i2cI = (dout,hostAck,busy,al,ackOut,i2cO)
58+ , " i2cOpAck" ::: Signal dom Bool
59+ , " busy" ::: Signal dom Bool
60+ , " al" ::: Signal dom Bool
61+ , " ackWrite" ::: Signal dom Bool
62+ , " i2cO" ::: Signal dom (" sclOut" ::: Maybe Bit , " sclOut" ::: Maybe Bit ))
63+ i2c clk arst rst ena clkCnt claimBus i2cOp ackRead i2cI =
64+ (dout,i2cOpAck,busy,al,ackWrite,i2cO)
65+
5866 where
59- (hostAck,ackOut,dout,bitCtrl) = byteMaster clk arst enableGen (rst,start,stop,read ,write,ackIn,din,bitResp)
60- (bitResp,busy,i2cO) = bitMaster clk arst enableGen (rst,ena,clkCnt,bitCtrl,i2cI)
61- (_cmdAck,al,_dbout) = unbundle bitResp
67+ (i2cOpAck,ackWrite,dout,bitCtrl)
68+ = byteMaster clk arst enableGen (rst,claimBus,i2cOp,ackRead,bitResp)
69+ (bitResp,busy,i2cO)
70+ = bitMaster clk arst enableGen (rst,ena,clkCnt,bitCtrl,i2cI)
71+ (_cmdAck,al,_dout) = unbundle bitResp
6272-- See: https://github.com/clash-lang/clash-compiler/pull/2511
6373{-# CLASH_OPAQUE i2c #-}
6474
75+ i2cTop ::
76+ " clk" ::: Clock System ->
77+ " arst" ::: Reset System ->
78+ " rst" ::: Signal System Bool ->
79+ " ena" ::: Signal System Bool ->
80+ " clkCnt" ::: Signal System (Unsigned 16 ) ->
81+ " claimBus" ::: Signal System Bool ->
82+ " i2cOp" ::: Signal System (Maybe I2COperation ) ->
83+ " ackRead" ::: Signal System Bool ->
84+ " i2cI" ::: Signal System (" scl" ::: Bit , " sda" ::: Bit ) ->
85+ " " :::
86+ ( " i2cO" ::: Signal System (BitVector 8 )
87+ , " i2cOpAck" ::: Signal System Bool
88+ , " busy" ::: Signal System Bool
89+ , " al" ::: Signal System Bool
90+ , " ackWrite" ::: Signal System Bool
91+ , " i2cO" ::: Signal System (" sclOut" ::: Maybe Bit , " sdaOut" ::: Maybe Bit )
92+ )
6593i2cTop = i2c @ System
6694makeTopEntity 'i2 cTop
0 commit comments