]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blob - include/i2c.h
Rewritten for using one task and direct usage of interrupts
[pes-rpp/rpp-test-sw.git] / include / i2c.h
1 /** @file I2C.h\r
2 *   @brief I2C Driver Definition File\r
3 *   @date 15.Mar.2012\r
4 *   @version 03.01.00\r
5 *   \r
6 */\r
7 \r
8 /* (c) Texas Instruments 2009-2012, All rights reserved. */\r
9 \r
10 #ifndef __I2C_H__\r
11 #define __I2C_H__\r
12 \r
13 \r
14 #include "sys_common.h"\r
15 #include "gio.h"\r
16 \r
17 \r
18 /** @enum i2cMode\r
19 *   @brief Alias names for i2c modes\r
20 *   This enumeration is used to provide alias names for I2C modes:\r
21 */\r
22 \r
23 enum i2cMode\r
24 {\r
25     I2C_FD_FORMAT   = 0x0008,  /* Free Data Format    */\r
26     I2C_START_BYTE  = 0x0010,\r
27     I2C_RESET_OUT   = 0x0020,  I2C_RESET_IN   = 0x0000,\r
28     I2C_DLOOPBACK   = 0x0040,    \r
29     I2C_REPEATMODE  = 0x0080,  /* In Master Mode only */ \r
30     I2C_10BIT_AMODE = 0x0100,  I2C_7BIT_AMODE = 0x0000,\r
31     I2C_TRANSMITTER = 0x0200,  I2C_RECEIVER   = 0x0000,        \r
32     I2C_MASTER      = 0x0400,  I2C_SLAVE      = 0x0000,     \r
33     I2C_STOP_COND   = 0x0800,  /* In Master Mode only */\r
34     I2C_START_COND  = 0x2000,  /* In Master Mode only */    \r
35     I2C_FREE_RUN    = 0x4000,\r
36     I2C_NACK_MODE   = 0x8000\r
37 };\r
38 \r
39 \r
40 /** @enum i2cBitCount\r
41 *   @brief Alias names for i2c bit count\r
42 *   This enumeration is used to provide alias names for I2C bit count:\r
43 */\r
44 \r
45 enum i2cBitCount\r
46 {\r
47     I2C_2_BIT   = 0x2, \r
48     I2C_3_BIT   = 0x3, \r
49     I2C_4_BIT   = 0x4, \r
50     I2C_5_BIT   = 0x5, \r
51     I2C_6_BIT   = 0x6, \r
52     I2C_7_BIT   = 0x7,     \r
53     I2C_8_BIT   = 0x0  \r
54 };\r
55 \r
56 \r
57 \r
58 /** @enum i2cIntFlags\r
59 *   @brief Interrupt Flag Definitions\r
60 *\r
61 *   Used with I2CEnableNotification, I2CDisableNotification\r
62 */\r
63 enum i2cIntFlags\r
64 {\r
65     I2C_AL_INT     = 0x0001,  /* arbitration lost      */\r
66     I2C_NACK_INT   = 0x0002,  /* no acknowledgement    */\r
67     I2C_ARDY_INT   = 0x0004,  /* access ready          */\r
68     I2C_RX_INT     = 0x0008,  /* receive data ready    */\r
69     I2C_TX_INT     = 0x0010,  /* transmit data ready   */\r
70     I2C_SCD_INT    = 0x0020,  /* stop condition detect */\r
71     I2C_AAS_INT    = 0x0040   /* address as slave      */\r
72 };\r
73 \r
74 \r
75 /** @enum i2cStatFlags\r
76 *   @brief Interrupt Status Definitions\r
77 *\r
78 */\r
79 enum i2cStatFlags\r
80 {\r
81     I2C_BUSBUSY    = 0x1000,  /* bus busy     */\r
82     I2C_RXFULL     = 0x0800   /* receive full */\r
83 };\r
84 \r
85 \r
86 /** @enum i2cDMA\r
87 *   @brief I2C DMA definitions \r
88 *\r
89 *   Used before i2c transfer\r
90 */\r
91 enum i2cDMA\r
92 {\r
93     I2C_TXDMA   = 0x20, \r
94     I2C_RXDMA   = 0x10 \r
95 };\r
96 \r
97 /** @struct i2cBase\r
98 *   @brief I2C Base Register Definition\r
99 *\r
100 *   This structure is used to access the I2C module egisters.\r
101 */\r
102 /** @typedef i2cBASE_t\r
103 *   @brief I2C Register Frame Type Definition\r
104 *\r
105 *   This type is used to access the I2C Registers.\r
106 */\r
107 typedef volatile struct i2cBase\r
108 {\r
109 \r
110     uint32_t OAR;           /**<  0x0000 I2C Own Address register               */\r
111     uint32_t IMR;           /**<  0x0004 I2C Interrupt Mask/Status register     */\r
112     uint32_t STR;           /**<  0x0008 I2C Interrupt Status register          */\r
113     uint32_t CLKL;          /**<  0x000C I2C Clock Divider Low register         */\r
114     uint32_t CLKH;          /**<  0x0010 I2C Clock Divider High register        */\r
115     uint32_t CNT;           /**<  0x0014 I2C Data Count register                */\r
116     uint32_t DRR;           /**<  0x0018 I2C Data Receive register              */\r
117     uint32_t SAR;           /**<  0x001C I2C Slave Address register             */\r
118     uint32_t DXR;           /**<  0x0020 I2C Data Transmit register             */\r
119     uint32_t MDR;           /**<  0x0024 I2C Mode register                      */\r
120     uint32_t IVR;           /**<  0x0028 I2C Interrupt Vector register          */\r
121     uint32_t EMDR;          /**<  0x002C I2C Extended Mode register             */\r
122     uint32_t PSC;           /**<  0x0030 I2C Prescaler register                 */\r
123     uint32_t PID11;         /**<  0x0034 I2C Peripheral ID register 1           */\r
124     uint32_t PID12;         /**<  0x0038 I2C Peripheral ID register 2           */\r
125     uint32_t DMAC;          /**<  0x003C I2C DMA Control Register               */\r
126     uint32_t : 32U;         /**<  0x0040 Reserved                               */\r
127     uint32_t : 32U;         /**<  0x0044 Reserved                               */\r
128     uint32_t FUN;           /**<  0x0048 Pin Function Register                  */\r
129     uint32_t DIR;           /**<  0x004C Pin Direction Register                 */\r
130     uint32_t DIN;           /**<  0x0050 Pin Data In Register                   */\r
131     uint32_t DOUT;          /**<  0x0054 Pin Data Out Register                  */\r
132     uint32_t SET;           /**<  0x0058 Pin Data Set Register                  */\r
133     uint32_t CLR;           /**<  0x005C Pin Data Clr Register                  */\r
134     uint32_t ODR;           /**<  0x0060 Pin Open Drain Output Enable Register  */\r
135     uint32_t PD;            /**<  0x0064 Pin Pullup/Pulldown Disable Register   */\r
136     uint32_t PSL;           /**<  0x0068 Pin Pullup/Pulldown Selection Register */\r
137 } i2cBASE_t;\r
138 \r
139 \r
140 /** @def i2cREG1\r
141 *   @brief I2C Register Frame Pointer\r
142 *\r
143 *   This pointer is used by the I2C driver to access the I2C module registers.\r
144 */\r
145 #define i2cREG1 ((i2cBASE_t *)0xFFF7D400U)\r
146 \r
147 /* USER CODE BEGIN (0) */\r
148 /* USER CODE END */\r
149 \r
150 \r
151 /** @def i2cPORT1\r
152 *   @brief I2C GIO Port Register Pointer\r
153 *\r
154 *   Pointer used by the GIO driver to access I/O PORT of I2C\r
155 *   (use the GIO drivers to access the port pins).\r
156 */\r
157 #define i2cPORT1 ((gioPORT_t *)0xFFF7D44CU)\r
158 \r
159 /* I2C Interface Functions */\r
160 void i2cInit(void);\r
161 void i2cSetOwnAdd(i2cBASE_t *i2c, uint32_t oadd);\r
162 void i2cSetSlaveAdd(i2cBASE_t *i2c, uint32_t sadd);\r
163 void i2cSetBaudrate(i2cBASE_t *i2c, uint32_t baud);\r
164 uint32_t  i2cIsTxReady(i2cBASE_t *i2c);\r
165 void i2cSendByte(i2cBASE_t *i2c, uint8_t byte);\r
166 void i2cSend(i2cBASE_t *i2c, uint32_t length, uint8_t *data);\r
167 uint32_t  i2cIsRxReady(i2cBASE_t *i2c);\r
168 void i2cClearSCD(i2cBASE_t *i2c);\r
169 uint32_t  i2cRxError(i2cBASE_t *i2c);\r
170 uint32_t  i2cReceiveByte(i2cBASE_t *i2c);\r
171 void i2cReceive(i2cBASE_t *i2c, uint32_t length, uint8_t *data);\r
172 void i2cEnableNotification(i2cBASE_t *i2c, uint32_t flags);\r
173 void i2cDisableNotification(i2cBASE_t *i2c, uint32_t flags);\r
174 void i2cSetStart(i2cBASE_t *i2c);\r
175 void i2cSetStop(i2cBASE_t *i2c);\r
176 void i2cSetCount(i2cBASE_t *i2c ,uint32_t cnt);\r
177 void i2cEnableLoopback(i2cBASE_t *i2c);\r
178 void i2cDisableLoopback(i2cBASE_t *i2c);\r
179 \r
180 /** @fn void i2cNotification(i2cBASE_t *i2c, uint32_t flags)\r
181 *   @brief Interrupt callback\r
182 *   @param[in] i2c   - I2C module base address\r
183 *   @param[in] flags - copy of error interrupt flags\r
184 *\r
185 * This is a callback that is provided by the application and is called apon\r
186 * an interrupt.  The parameter passed to the callback is a copy of the \r
187 * interrupt flag register.\r
188 */\r
189 void i2cNotification(i2cBASE_t *i2c, uint32_t flags);\r
190 \r
191 #endif\r