b30f0713c51a5ddf1cc00123655034905347c935
[i3-mote/i3-mote.git] / Basic-Test-Package / MSP432 / Test_MSP432_I2C_M24xx256 / HAL_I2C.c
1 /* --COPYRIGHT--,BSD\r
2  * Copyright (c) 2015, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  * --/COPYRIGHT--*/\r
32 //****************************************************************************\r
33 //\r
34 // HAL_I2C.c - Hardware abstraction layer for I2C with MSP432P401R\r
35 //\r
36 //****************************************************************************\r
37 \r
38 #include <driverlib.h>\r
39 #include <HAL_I2C.h>\r
40 \r
41 \r
42 /* I2C Master Configuration Parameter */\r
43 const eUSCI_I2C_MasterConfig i2cConfig =\r
44 {\r
45         EUSCI_B_I2C_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source\r
46         12000000,                               // SMCLK = 48MHz\r
47         EUSCI_B_I2C_SET_DATA_RATE_100KBPS,      // Desired I2C Clock of 100khz\r
48         0,                                      // No byte counter threshold\r
49         EUSCI_B_I2C_NO_AUTO_STOP                // No Autostop\r
50 };\r
51 \r
52 void Init_I2C_GPIO()\r
53 {\r
54     /* Select I2C function for I2C_SCL(P6.5) */\r
55     GPIO_setAsPeripheralModuleFunctionOutputPin(\r
56                 GPIO_PORT_P3,\r
57                 GPIO_PIN7,\r
58             //GPIO_PORT_P6,\r
59             //GPIO_PIN5,\r
60                 //GPIO_PORT_P1,\r
61                 //GPIO_PIN7,\r
62             GPIO_PRIMARY_MODULE_FUNCTION);\r
63 \r
64     /* Select I2C function for I2C_SDA(P6.4) */\r
65     GPIO_setAsPeripheralModuleFunctionOutputPin(\r
66             GPIO_PORT_P3,\r
67             GPIO_PIN6,\r
68             //GPIO_PORT_P6,\r
69             //GPIO_PIN4,\r
70                 //GPIO_PORT_P1,\r
71                 //GPIO_PIN6,\r
72             GPIO_PRIMARY_MODULE_FUNCTION);\r
73 }\r
74 \r
75 \r
76 /***************************************************************************//**\r
77  * @brief  Configures I2C\r
78  * @param  none\r
79  * @return none\r
80  ******************************************************************************/\r
81 \r
82 void I2C_init(void)\r
83 {\r
84     /* Initialize USCI_B0 and I2C Master to communicate with slave devices*/\r
85     I2C_initMaster(EUSCI_B2_BASE, &i2cConfig);\r
86     //I2C_initMaster(EUSCI_B2_BASE, &i2cConfig);\r
87 \r
88     /* Disable I2C module to make changes */\r
89     I2C_disableModule(EUSCI_B2_BASE);\r
90     //I2C_disableModule(EUSCI_B2_BASE);\r
91 \r
92     /* Enable I2C Module to start operations */\r
93     I2C_enableModule(EUSCI_B2_BASE);\r
94     //I2C_enableModule(EUSCI_B2_BASE);\r
95 \r
96     return;\r
97 }\r
98 \r
99 \r
100 /***************************************************************************//**\r
101  * @brief  Reads data from the sensor\r
102  * @param  writeByte Address of register to read from\r
103  * @return Register contents\r
104  ******************************************************************************/\r
105 \r
106 unsigned char I2C_eeprom_read_byte(unsigned short addr)\r
107 {\r
108     volatile int val = 0;\r
109     volatile int valScratch = 0;\r
110 \r
111     /* Set master to transmit mode PL */\r
112     I2C_setMode(EUSCI_B2_BASE,\r
113         EUSCI_B_I2C_TRANSMIT_MODE);\r
114 \r
115     /* Clear any existing interrupt flag PL */\r
116     I2C_clearInterruptFlag(EUSCI_B2_BASE,\r
117         EUSCI_B_I2C_TRANSMIT_INTERRUPT0);\r
118 \r
119     /* Wait until ready to write PL */\r
120     while (I2C_isBusBusy(EUSCI_B2_BASE));\r
121 \r
122     /* Initiate start and send first character */\r
123     I2C_masterSendMultiByteStart(EUSCI_B2_BASE,(addr>>8)&0x00FF);\r
124     /* Wait for TX to finish */\r
125     while(!(I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));\r
126 \r
127     /* Send Next Character */\r
128     I2C_masterSendMultiByteNext(EUSCI_B2_BASE,(unsigned char)(addr&0x00FF));\r
129     /* Wait for TX to finish */\r
130     while(!(I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));\r
131 \r
132     /* Initiate stop only */\r
133     I2C_masterSendMultiByteStop(EUSCI_B2_BASE);\r
134     /* Wait for Stop to finish */\r
135     while(!I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_STOP_INTERRUPT));\r
136 \r
137     /*\r
138      * Generate Start condition and set it to receive mode.\r
139      * This sends out the slave address and continues to read until you issue a STOP\r
140      */\r
141 \r
142     I2C_setMode(EUSCI_B2_BASE,EUSCI_B_I2C_RECEIVE_MODE);\r
143     while (I2C_isBusBusy(EUSCI_B2_BASE));\r
144 \r
145     val=I2C_masterReceiveSingleByte(EUSCI_B2_BASE);\r
146 \r
147     /* Return temperature value */\r
148     return val;\r
149 }\r
150 \r
151 \r
152 /***************************************************************************//**\r
153  * @brief  Writes data to the sensor\r
154  * @param  pointer  Address of register you want to modify\r
155  * @param  writeByte Data to be written to the specified register\r
156  * @return none\r
157  ******************************************************************************/\r
158 \r
159 void I2C_eeprom_write_byte(unsigned short pointer, unsigned char writeByte)\r
160 {\r
161     /* Set master to transmit mode PL */\r
162     I2C_setMode(EUSCI_B2_BASE,\r
163         EUSCI_B_I2C_TRANSMIT_MODE);\r
164 \r
165     /* Clear any existing interrupt flag PL */\r
166     I2C_clearInterruptFlag(EUSCI_B2_BASE,\r
167         EUSCI_B_I2C_TRANSMIT_INTERRUPT0);\r
168 \r
169     /* Wait until ready to write PL */\r
170     while (I2C_isBusBusy(EUSCI_B2_BASE));\r
171 \r
172     /* Initiate start and send first character */\r
173     I2C_masterSendMultiByteStart(EUSCI_B2_BASE,(unsigned char)(pointer>>8));\r
174     while(!(I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));\r
175 \r
176 \r
177     I2C_masterSendMultiByteNext(EUSCI_B2_BASE,(unsigned char)(pointer&0x00FF));\r
178     while(!(I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));\r
179 \r
180 \r
181     I2C_masterSendMultiByteFinish(EUSCI_B2_BASE,\r
182         (unsigned char)(writeByte&0xFF));\r
183     while(!(I2C_getInterruptStatus(EUSCI_B2_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0)));\r
184 \r
185     while (I2C_isBusBusy(EUSCI_B2_BASE));\r
186 \r
187 }\r
188 \r
189 \r
190 void I2C_setslave(unsigned int slaveAdr)\r
191 {\r
192     /* Specify slave address for I2C */\r
193     //I2C_setSlaveAddress(EUSCI_B2_BASE,slaveAdr);\r
194         I2C_setSlaveAddress(EUSCI_B2_BASE,slaveAdr);\r
195 \r
196     /* Enable and clear the interrupt flag */\r
197         I2C_clearInterruptFlag(EUSCI_B2_BASE,\r
198                 EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_RECEIVE_INTERRUPT0);\r
199         //I2C_clearInterruptFlag(EUSCI_B2_BASE,\r
200     //    EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_RECEIVE_INTERRUPT0);\r
201     return;\r
202 }\r