Contiki 3.x
i2c.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013, IDentification Automation Laboratory
3  * IDALab (http://www.idalab.unisalento.it)
4  * Department of Innovation Engineering - University of Salento
5  *
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the Institute nor the names of its contributors
17  * may be used to endorse or promote products derived from this software
18  * without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  */
33 
34 /**
35  * \file platform/mbxxx/dev/i2c.c
36  * \brief I2C bus master driver for mbxxx platform.
37  * \author Maria Laura Stefanizzi <laura28582@gmail.com>
38  * \date 2013-11-20
39  */
40 
41 #include <stdio.h>
42 #include <contiki.h>
43 #include "dev/i2c.h"
44 #include PLATFORM_HEADER
45 
46 #define WAIT_FIN_SC2(FLAG) while(!SC2_STAT(FLAG)) {}
47 
48 /**
49  * Configure serial controller in I2C mode and set I2C speed.
50  */
51 void
53 {
54  /* Configure serial controller to I2C mode */
55  SC2_MODE = SC2_MODE_I2C;
56 
57  /*
58  * The SCL is produced by dividing down 12MHz according to
59  * this equation:
60  * Rate = 12 MHz / ( (LIN + 1) * (2^EXP) )
61  *
62  * Configure rate registers for Fast Mode operation (400 kbps)
63  */
64  SC2_RATELIN = 14;
65  SC2_RATEEXP = 1;
66 
67  /* Reset control registers */
68  SC2_TWICTRL1 = SC2_TWICTRL1_RESET;
69  SC2_TWICTRL2 = SC2_TWICTRL2_RESET;
70 }
71 
72 /**
73  * Configure serial controller in disabled mode
74  */
75 void
77 {
78  SC2_MODE = SC2_MODE_DISABLED;
79 }
80 
81 /**
82  * Generate I2C START condition
83  */
84 void
85 i2c_start(void)
86 {
87  SC2_TWICTRL1 |= SC_TWISTART;
88  WAIT_FIN_SC2(SC_TWICMDFIN);
89 }
90 
91 /**
92  * Generate I2C STOP condition
93  */
94 void
95 i2c_stop(void)
96 {
97  SC2_TWICTRL1 |= SC_TWISTOP;
98  WAIT_FIN_SC2(SC_TWICMDFIN);
99 }
100 
101 /**
102  * Send a byte to I2C bus
103  * @param data The data that must be sent
104  */
105 void
106 i2c_write(uint8_t data)
107 {
108  SC2_DATA = data;
109 
110  /* Configure control register 1 for byte transmission */
111  SC2_TWICTRL1 |= SC_TWISEND;
112  WAIT_FIN_SC2(SC_TWITXFIN);
113 }
114 
115 /**
116  * Read a byte from I2C bus
117  * @param ack If true enable ACK generation after byte reception
118  * @return The received byte
119  */
120 uint8_t
121 i2c_read(int ack)
122 {
123  if(ack) {
124  /* Enable ACK generation after current received byte */
125  SC2_TWICTRL2 |= SC_TWIACK;
126  } else {
127  /* Disable ACK generation */
128  SC2_TWICTRL2 &= ~SC_TWIACK;
129  }
130 
131  /* Configure control register 1 for byte reception */
132  SC2_TWICTRL1 |= SC_TWIRECV;
133  WAIT_FIN_SC2(SC_TWIRXFIN);
134 
135  return SC2_DATA;
136 }
void i2c_write(uint8_t data)
Send a byte to I2C bus.
Definition: i2c.c:106
void i2c_stop(void)
Generate I2C STOP condition.
Definition: i2c.c:95
uint8_t i2c_read(int ack)
Read a byte from I2C bus.
Definition: i2c.c:121
void i2c_start(void)
Generate I2C START condition.
Definition: i2c.c:85
void i2c_enable(void)
Configure serial controller in I2C mode and set I2C speed.
Definition: i2c.c:52
void i2c_disable(void)
Configure serial controller in disabled mode.
Definition: i2c.c:76