Blame view

Documentation/i2c/i2c-protocol.rst 3.25 KB
f6fcefa10   Luca Ceresoli   docs: i2c: rename...
1
2
3
  ================
  The I2C Protocol
  ================
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
4

2f07c05f1   Luca Ceresoli   docs: i2c: call i...
5
  This document describes the I2C protocol. Or will, when it is finished :-)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
  
  Key to symbols
  ==============
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
9
  =============== =============================================================
02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
10
11
12
  S               Start condition
  P               Stop condition
  Rd/Wr (1 bit)   Read/Write bit. Rd equals 1, Wr equals 0.
db0d7424e   Luca Ceresoli   docs: i2c: i2c-pr...
13
  A, NA (1 bit)   Acknowledge (ACK) and Not Acknowledge (NACK) bit
02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
14
  Addr  (7 bits)  I2C 7 bit address. Note that this can be expanded as usual to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
                  get a 10 bit I2C address.
02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
16
  Comm  (8 bits)  Command byte, a data byte which often selects a register on
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
                  the device.
02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
18
  Data  (8 bits)  A plain data byte. Sometimes, I write DataLow, DataHigh
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
                  for 16 bit data.
02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
20
  Count (8 bits)  A data byte containing the length of a block operation.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21

02622c886   Luca Ceresoli   docs: i2c: i2c-pr...
22
  [..]            Data sent by I2C device, as opposed to data sent by the
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
23
24
                  host adapter.
  =============== =============================================================
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
  
  
  Simple send transaction
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
28
  =======================
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29

ca5dbb027   Luca Ceresoli   docs: i2c: i2c-pr...
30
  Implemented by i2c_master_send()::
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
  
    S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
  
  
  Simple receive transaction
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
36
  ==========================
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

ca5dbb027   Luca Ceresoli   docs: i2c: i2c-pr...
38
  Implemented by i2c_master_recv()::
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
  
    S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
  
  
  Combined transactions
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
44
  =====================
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45

ca5dbb027   Luca Ceresoli   docs: i2c: i2c-pr...
46
  Implemented by i2c_transfer().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47

f954731d2   Luca Ceresoli   docs: i2c: i2c-pr...
48
49
50
  They are just like the above transactions, but instead of a stop
  condition P a start condition S is sent and the transaction continues.
  An example of a byte read, followed by a byte write::
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
55
56
  
    S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
  
  
  Modified transactions
  =====================
9f02fba84   Wolfram Sang   Documentation: i2...
57
  The following modifications to the I2C protocol can also be generated by
2f07c05f1   Luca Ceresoli   docs: i2c: call i...
58
  setting these flags for I2C messages. With the exception of I2C_M_NOSTART, they
9f02fba84   Wolfram Sang   Documentation: i2...
59
  are usually only needed to work around device issues:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60

9f02fba84   Wolfram Sang   Documentation: i2...
61
62
63
64
65
66
67
68
69
70
  I2C_M_IGNORE_NAK:
      Normally message is interrupted immediately if there is [NA] from the
      client. Setting this flag treats any [NA] as [A], and all of
      message is sent.
      These messages may still fail to SCL lo->hi timeout.
  
  I2C_M_NO_RD_ACK:
      In a read message, master A/NA bit is skipped.
  
  I2C_M_NOSTART:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
      In a combined transaction, no 'S Addr Wr/Rd [A]' is generated at some
      point. For example, setting I2C_M_NOSTART on the second partial message
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
73
      generates something like::
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
        S Addr Rd [A] [Data] NA Data [A] P
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
75

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
      If you set the I2C_M_NOSTART variable for the first partial message,
f954731d2   Luca Ceresoli   docs: i2c: i2c-pr...
77
78
79
      we do not generate Addr, but we do generate the start condition S.
      This will probably confuse all other clients on your bus, so don't
      try this.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80

14674e701   Mark Brown   i2c: Split I2C_M_...
81
82
83
84
      This is often used to gather transmits from multiple data buffers in
      system memory into something that appears as a single transfer to the
      I2C device but may also be used between direction changes by some
      rare devices.
9f02fba84   Wolfram Sang   Documentation: i2...
85
  I2C_M_REV_DIR_ADDR:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
      This toggles the Rd/Wr flag. That is, if you want to do a write, but
      need to emit an Rd instead of a Wr, or vice versa, you set this
ccf988b66   Mauro Carvalho Chehab   docs: i2c: conver...
88
      flag. For example::
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
        S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
9f02fba84   Wolfram Sang   Documentation: i2...
90
91
92
93
  I2C_M_STOP:
      Force a stop condition (P) after the message. Some I2C related protocols
      like SCCB require that. Normally, you really don't want to get interrupted
      between the messages of one transfer.