1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald * All rights reserved.
4*5fd0122aSMatthias Ringwald *
5*5fd0122aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald * are met:
8*5fd0122aSMatthias Ringwald *
9*5fd0122aSMatthias Ringwald * * Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald *
12*5fd0122aSMatthias Ringwald * * Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald * documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald *
16*5fd0122aSMatthias Ringwald * * Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald * its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald * from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald *
20*5fd0122aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/i2c.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald
I2C_initMaster(uint32_t moduleInstance,const eUSCI_I2C_MasterConfig * config)36*5fd0122aSMatthias Ringwald void I2C_initMaster(uint32_t moduleInstance,
37*5fd0122aSMatthias Ringwald const eUSCI_I2C_MasterConfig *config)
38*5fd0122aSMatthias Ringwald {
39*5fd0122aSMatthias Ringwald uint_fast16_t preScalarValue;
40*5fd0122aSMatthias Ringwald
41*5fd0122aSMatthias Ringwald ASSERT(
42*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_CLOCKSOURCE_ACLK == config->selectClockSource)
43*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_CLOCKSOURCE_SMCLK
44*5fd0122aSMatthias Ringwald == config->selectClockSource));
45*5fd0122aSMatthias Ringwald
46*5fd0122aSMatthias Ringwald ASSERT(
47*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_SET_DATA_RATE_400KBPS == config->dataRate)
48*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_SET_DATA_RATE_100KBPS == config->dataRate)
49*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_SET_DATA_RATE_1MBPS == config->dataRate));
50*5fd0122aSMatthias Ringwald
51*5fd0122aSMatthias Ringwald ASSERT(
52*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_NO_AUTO_STOP == config->autoSTOPGeneration)
53*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_SET_BYTECOUNT_THRESHOLD_FLAG
54*5fd0122aSMatthias Ringwald == config->autoSTOPGeneration)
55*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_SEND_STOP_AUTOMATICALLY_ON_BYTECOUNT_THRESHOLD
56*5fd0122aSMatthias Ringwald == config->autoSTOPGeneration));
57*5fd0122aSMatthias Ringwald
58*5fd0122aSMatthias Ringwald /* Disable the USCI module and clears the other bits of control register */
59*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
60*5fd0122aSMatthias Ringwald 1;
61*5fd0122aSMatthias Ringwald
62*5fd0122aSMatthias Ringwald /* Configure Automatic STOP condition generation */
63*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW1 = (EUSCI_B_CMSIS(moduleInstance)->CTLW1
64*5fd0122aSMatthias Ringwald & ~EUSCI_B_CTLW1_ASTP_MASK) | (config->autoSTOPGeneration);
65*5fd0122aSMatthias Ringwald
66*5fd0122aSMatthias Ringwald /* Byte Count Threshold */
67*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TBCNT = config->byteCounterThreshold;
68*5fd0122aSMatthias Ringwald
69*5fd0122aSMatthias Ringwald /*
70*5fd0122aSMatthias Ringwald * Configure as I2C master mode.
71*5fd0122aSMatthias Ringwald * UCMST = Master mode
72*5fd0122aSMatthias Ringwald * UCMODE_3 = I2C mode
73*5fd0122aSMatthias Ringwald * UCSYNC = Synchronous mode
74*5fd0122aSMatthias Ringwald */
75*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 = (EUSCI_B_CMSIS(moduleInstance)->CTLW0
76*5fd0122aSMatthias Ringwald & ~EUSCI_B_CTLW0_SSEL_MASK)
77*5fd0122aSMatthias Ringwald | (config->selectClockSource | EUSCI_B_CTLW0_MST
78*5fd0122aSMatthias Ringwald | EUSCI_B_CTLW0_MODE_3 | EUSCI_B_CTLW0_SYNC
79*5fd0122aSMatthias Ringwald | EUSCI_B_CTLW0_SWRST);
80*5fd0122aSMatthias Ringwald
81*5fd0122aSMatthias Ringwald /*
82*5fd0122aSMatthias Ringwald * Compute the clock divider that achieves the fastest speed less than or
83*5fd0122aSMatthias Ringwald * equal to the desired speed. The numerator is biased to favor a larger
84*5fd0122aSMatthias Ringwald * clock divider so that the resulting clock is always less than or equal
85*5fd0122aSMatthias Ringwald * to the desired clock, never greater.
86*5fd0122aSMatthias Ringwald */
87*5fd0122aSMatthias Ringwald preScalarValue = (uint16_t) (config->i2cClk / config->dataRate);
88*5fd0122aSMatthias Ringwald
89*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->BRW = preScalarValue;
90*5fd0122aSMatthias Ringwald }
91*5fd0122aSMatthias Ringwald
I2C_initSlave(uint32_t moduleInstance,uint_fast16_t slaveAddress,uint_fast8_t slaveAddressOffset,uint32_t slaveOwnAddressEnable)92*5fd0122aSMatthias Ringwald void I2C_initSlave(uint32_t moduleInstance, uint_fast16_t slaveAddress,
93*5fd0122aSMatthias Ringwald uint_fast8_t slaveAddressOffset, uint32_t slaveOwnAddressEnable)
94*5fd0122aSMatthias Ringwald {
95*5fd0122aSMatthias Ringwald ASSERT(
96*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_OWN_ADDRESS_OFFSET0 == slaveAddressOffset)
97*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_OWN_ADDRESS_OFFSET1 == slaveAddressOffset)
98*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_OWN_ADDRESS_OFFSET2 == slaveAddressOffset)
99*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_OWN_ADDRESS_OFFSET3 == slaveAddressOffset));
100*5fd0122aSMatthias Ringwald
101*5fd0122aSMatthias Ringwald /* Disable the USCI module */
102*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
103*5fd0122aSMatthias Ringwald 1;
104*5fd0122aSMatthias Ringwald
105*5fd0122aSMatthias Ringwald /* Clear USCI master mode */
106*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 = (EUSCI_B_CMSIS(moduleInstance)->CTLW0
107*5fd0122aSMatthias Ringwald & (~EUSCI_B_CTLW0_MST))
108*5fd0122aSMatthias Ringwald | (EUSCI_B_CTLW0_MODE_3 + EUSCI_B_CTLW0_SYNC);
109*5fd0122aSMatthias Ringwald
110*5fd0122aSMatthias Ringwald /* Set up the slave address. */
111*5fd0122aSMatthias Ringwald HWREG16(
112*5fd0122aSMatthias Ringwald (uint32_t) &EUSCI_B_CMSIS(moduleInstance)->I2COA0
113*5fd0122aSMatthias Ringwald + slaveAddressOffset) = slaveAddress
114*5fd0122aSMatthias Ringwald + slaveOwnAddressEnable;
115*5fd0122aSMatthias Ringwald }
116*5fd0122aSMatthias Ringwald
I2C_enableModule(uint32_t moduleInstance)117*5fd0122aSMatthias Ringwald void I2C_enableModule(uint32_t moduleInstance)
118*5fd0122aSMatthias Ringwald {
119*5fd0122aSMatthias Ringwald /* Reset the UCSWRST bit to enable the USCI Module */
120*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
121*5fd0122aSMatthias Ringwald 0;
122*5fd0122aSMatthias Ringwald }
123*5fd0122aSMatthias Ringwald
I2C_disableModule(uint32_t moduleInstance)124*5fd0122aSMatthias Ringwald void I2C_disableModule(uint32_t moduleInstance)
125*5fd0122aSMatthias Ringwald {
126*5fd0122aSMatthias Ringwald /* Set the UCSWRST bit to disable the USCI Module */
127*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
128*5fd0122aSMatthias Ringwald 1;
129*5fd0122aSMatthias Ringwald ;
130*5fd0122aSMatthias Ringwald }
131*5fd0122aSMatthias Ringwald
I2C_setSlaveAddress(uint32_t moduleInstance,uint_fast16_t slaveAddress)132*5fd0122aSMatthias Ringwald void I2C_setSlaveAddress(uint32_t moduleInstance, uint_fast16_t slaveAddress)
133*5fd0122aSMatthias Ringwald {
134*5fd0122aSMatthias Ringwald /* Set the address of the slave with which the master will communicate */
135*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->I2CSA = (slaveAddress);
136*5fd0122aSMatthias Ringwald }
137*5fd0122aSMatthias Ringwald
I2C_setMode(uint32_t moduleInstance,uint_fast8_t mode)138*5fd0122aSMatthias Ringwald void I2C_setMode(uint32_t moduleInstance, uint_fast8_t mode)
139*5fd0122aSMatthias Ringwald {
140*5fd0122aSMatthias Ringwald ASSERT(
141*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_TRANSMIT_MODE == mode)
142*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_RECEIVE_MODE == mode));
143*5fd0122aSMatthias Ringwald
144*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 = (EUSCI_B_CMSIS(moduleInstance)->CTLW0
145*5fd0122aSMatthias Ringwald & (~EUSCI_B_I2C_TRANSMIT_MODE)) | mode;
146*5fd0122aSMatthias Ringwald
147*5fd0122aSMatthias Ringwald }
148*5fd0122aSMatthias Ringwald
I2C_setTimeout(uint32_t moduleInstance,uint_fast16_t timeout)149*5fd0122aSMatthias Ringwald void I2C_setTimeout(uint32_t moduleInstance, uint_fast16_t timeout)
150*5fd0122aSMatthias Ringwald {
151*5fd0122aSMatthias Ringwald uint_fast16_t swrstValue;
152*5fd0122aSMatthias Ringwald
153*5fd0122aSMatthias Ringwald ASSERT(
154*5fd0122aSMatthias Ringwald (EUSCI_B_I2C_TIMEOUT_DISABLE == timeout)
155*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_TIMEOUT_28_MS == timeout)
156*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_TIMEOUT_31_MS == timeout)
157*5fd0122aSMatthias Ringwald || (EUSCI_B_I2C_TIMEOUT_34_MS == timeout));
158*5fd0122aSMatthias Ringwald
159*5fd0122aSMatthias Ringwald /* Save value of UCSWRST bit and disable USCI module */
160*5fd0122aSMatthias Ringwald swrstValue = BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS);
161*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
162*5fd0122aSMatthias Ringwald 1;
163*5fd0122aSMatthias Ringwald
164*5fd0122aSMatthias Ringwald /* Set timeout */
165*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW1 = (EUSCI_B_CMSIS(moduleInstance)->CTLW1
166*5fd0122aSMatthias Ringwald & (~EUSCI_B_CTLW1_CLTO_3)) | timeout;
167*5fd0122aSMatthias Ringwald
168*5fd0122aSMatthias Ringwald /* Restore value of UCSWRST bit */
169*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
170*5fd0122aSMatthias Ringwald swrstValue;
171*5fd0122aSMatthias Ringwald }
172*5fd0122aSMatthias Ringwald
I2C_masterReceiveSingleByte(uint32_t moduleInstance)173*5fd0122aSMatthias Ringwald uint8_t I2C_masterReceiveSingleByte(uint32_t moduleInstance)
174*5fd0122aSMatthias Ringwald {
175*5fd0122aSMatthias Ringwald
176*5fd0122aSMatthias Ringwald uint_fast16_t rxieStatus;
177*5fd0122aSMatthias Ringwald
178*5fd0122aSMatthias Ringwald //Store current RXIE status
179*5fd0122aSMatthias Ringwald rxieStatus = EUSCI_B_CMSIS(moduleInstance)->IE & EUSCI_B_IE_RXIE0;
180*5fd0122aSMatthias Ringwald
181*5fd0122aSMatthias Ringwald //Disable receive interrupt enable
182*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_RXIE0_OFS) = 0;
183*5fd0122aSMatthias Ringwald
184*5fd0122aSMatthias Ringwald //Set USCI in Receive mode
185*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TR_OFS) =
186*5fd0122aSMatthias Ringwald 0;
187*5fd0122aSMatthias Ringwald
188*5fd0122aSMatthias Ringwald //Send start
189*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= (EUSCI_B_CTLW0_TXSTT
190*5fd0122aSMatthias Ringwald + EUSCI_B_CTLW0_TXSTP);
191*5fd0122aSMatthias Ringwald
192*5fd0122aSMatthias Ringwald //Poll for receive interrupt flag.
193*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
194*5fd0122aSMatthias Ringwald EUSCI_B_IFG_RXIFG_OFS))
195*5fd0122aSMatthias Ringwald ;
196*5fd0122aSMatthias Ringwald
197*5fd0122aSMatthias Ringwald //Receive single byte data.
198*5fd0122aSMatthias Ringwald uint8_t receivedByte = (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
199*5fd0122aSMatthias Ringwald
200*5fd0122aSMatthias Ringwald //Clear receive interrupt flag before enabling interrupt again
201*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG, EUSCI_B_IFG_RXIFG0_OFS) =
202*5fd0122aSMatthias Ringwald 0;
203*5fd0122aSMatthias Ringwald
204*5fd0122aSMatthias Ringwald //Reinstate receive interrupt enable
205*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= rxieStatus;
206*5fd0122aSMatthias Ringwald
207*5fd0122aSMatthias Ringwald return receivedByte;
208*5fd0122aSMatthias Ringwald }
209*5fd0122aSMatthias Ringwald
I2C_slavePutData(uint32_t moduleInstance,uint8_t transmitData)210*5fd0122aSMatthias Ringwald void I2C_slavePutData(uint32_t moduleInstance, uint8_t transmitData)
211*5fd0122aSMatthias Ringwald {
212*5fd0122aSMatthias Ringwald //Send single byte data.
213*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = transmitData;
214*5fd0122aSMatthias Ringwald }
215*5fd0122aSMatthias Ringwald
I2C_slaveGetData(uint32_t moduleInstance)216*5fd0122aSMatthias Ringwald uint8_t I2C_slaveGetData(uint32_t moduleInstance)
217*5fd0122aSMatthias Ringwald {
218*5fd0122aSMatthias Ringwald //Read a byte.
219*5fd0122aSMatthias Ringwald return (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
220*5fd0122aSMatthias Ringwald }
221*5fd0122aSMatthias Ringwald
I2C_isBusBusy(uint32_t moduleInstance)222*5fd0122aSMatthias Ringwald uint8_t I2C_isBusBusy(uint32_t moduleInstance)
223*5fd0122aSMatthias Ringwald {
224*5fd0122aSMatthias Ringwald //Return the bus busy status.
225*5fd0122aSMatthias Ringwald return BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->STATW,
226*5fd0122aSMatthias Ringwald EUSCI_B_STATW_BBUSY_OFS);
227*5fd0122aSMatthias Ringwald }
228*5fd0122aSMatthias Ringwald
I2C_masterSendSingleByte(uint32_t moduleInstance,uint8_t txData)229*5fd0122aSMatthias Ringwald void I2C_masterSendSingleByte(uint32_t moduleInstance, uint8_t txData)
230*5fd0122aSMatthias Ringwald {
231*5fd0122aSMatthias Ringwald //Store current TXIE status
232*5fd0122aSMatthias Ringwald uint16_t txieStatus = EUSCI_B_CMSIS(moduleInstance)->IE & EUSCI_B_IE_TXIE0;
233*5fd0122aSMatthias Ringwald
234*5fd0122aSMatthias Ringwald //Disable transmit interrupt enable
235*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS) = 0;
236*5fd0122aSMatthias Ringwald
237*5fd0122aSMatthias Ringwald //Send start condition.
238*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= EUSCI_B_CTLW0_TR
239*5fd0122aSMatthias Ringwald + EUSCI_B_CTLW0_TXSTT;
240*5fd0122aSMatthias Ringwald
241*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag and start condition flag.
242*5fd0122aSMatthias Ringwald while ((BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
243*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTT_OFS)
244*5fd0122aSMatthias Ringwald || !BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
245*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)));
246*5fd0122aSMatthias Ringwald
247*5fd0122aSMatthias Ringwald //Send single byte data.
248*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
249*5fd0122aSMatthias Ringwald
250*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
251*5fd0122aSMatthias Ringwald while (!(EUSCI_B_CMSIS(moduleInstance)->IFG & EUSCI_B_IFG_TXIFG))
252*5fd0122aSMatthias Ringwald ;
253*5fd0122aSMatthias Ringwald
254*5fd0122aSMatthias Ringwald //Send stop condition.
255*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= EUSCI_B_CTLW0_TXSTP;
256*5fd0122aSMatthias Ringwald
257*5fd0122aSMatthias Ringwald //Clear transmit interrupt flag before enabling interrupt again
258*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IFG &= ~(EUSCI_B_IFG_TXIFG);
259*5fd0122aSMatthias Ringwald
260*5fd0122aSMatthias Ringwald //Reinstate transmit interrupt enable
261*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= txieStatus;
262*5fd0122aSMatthias Ringwald }
263*5fd0122aSMatthias Ringwald
I2C_masterSendSingleByteWithTimeout(uint32_t moduleInstance,uint8_t txData,uint32_t timeout)264*5fd0122aSMatthias Ringwald bool I2C_masterSendSingleByteWithTimeout(uint32_t moduleInstance,
265*5fd0122aSMatthias Ringwald uint8_t txData, uint32_t timeout)
266*5fd0122aSMatthias Ringwald {
267*5fd0122aSMatthias Ringwald uint_fast16_t txieStatus;
268*5fd0122aSMatthias Ringwald uint32_t timeout2 = timeout;
269*5fd0122aSMatthias Ringwald
270*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
271*5fd0122aSMatthias Ringwald
272*5fd0122aSMatthias Ringwald //Store current TXIE status
273*5fd0122aSMatthias Ringwald txieStatus = EUSCI_B_CMSIS(moduleInstance)->IE & EUSCI_B_IE_TXIE0;
274*5fd0122aSMatthias Ringwald
275*5fd0122aSMatthias Ringwald //Disable transmit interrupt enable
276*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS) = 0;
277*5fd0122aSMatthias Ringwald
278*5fd0122aSMatthias Ringwald //Send start condition.
279*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= EUSCI_B_CTLW0_TR
280*5fd0122aSMatthias Ringwald + EUSCI_B_CTLW0_TXSTT;
281*5fd0122aSMatthias Ringwald
282*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
283*5fd0122aSMatthias Ringwald while ((!(EUSCI_B_CMSIS(moduleInstance)->IFG & EUSCI_B_IFG_TXIFG))
284*5fd0122aSMatthias Ringwald && --timeout)
285*5fd0122aSMatthias Ringwald ;
286*5fd0122aSMatthias Ringwald
287*5fd0122aSMatthias Ringwald //Check if transfer timed out
288*5fd0122aSMatthias Ringwald if (timeout == 0)
289*5fd0122aSMatthias Ringwald return false;
290*5fd0122aSMatthias Ringwald
291*5fd0122aSMatthias Ringwald //Send single byte data.
292*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
293*5fd0122aSMatthias Ringwald
294*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
295*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
296*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout2)
297*5fd0122aSMatthias Ringwald ;
298*5fd0122aSMatthias Ringwald
299*5fd0122aSMatthias Ringwald //Check if transfer timed out
300*5fd0122aSMatthias Ringwald if (timeout2 == 0)
301*5fd0122aSMatthias Ringwald return false;
302*5fd0122aSMatthias Ringwald
303*5fd0122aSMatthias Ringwald //Send stop condition.
304*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
305*5fd0122aSMatthias Ringwald 1;
306*5fd0122aSMatthias Ringwald
307*5fd0122aSMatthias Ringwald //Clear transmit interrupt flag before enabling interrupt again
308*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG, EUSCI_B_IFG_TXIFG0_OFS) =
309*5fd0122aSMatthias Ringwald 0;
310*5fd0122aSMatthias Ringwald
311*5fd0122aSMatthias Ringwald //Reinstate transmit interrupt enable
312*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= txieStatus;
313*5fd0122aSMatthias Ringwald
314*5fd0122aSMatthias Ringwald return true;
315*5fd0122aSMatthias Ringwald }
316*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteStart(uint32_t moduleInstance,uint8_t txData)317*5fd0122aSMatthias Ringwald void I2C_masterSendMultiByteStart(uint32_t moduleInstance, uint8_t txData)
318*5fd0122aSMatthias Ringwald {
319*5fd0122aSMatthias Ringwald //Store current transmit interrupt enable
320*5fd0122aSMatthias Ringwald uint16_t txieStatus = EUSCI_B_CMSIS(moduleInstance)->IE & EUSCI_B_IE_TXIE0;
321*5fd0122aSMatthias Ringwald
322*5fd0122aSMatthias Ringwald //Disable transmit interrupt enable
323*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS) = 0;
324*5fd0122aSMatthias Ringwald
325*5fd0122aSMatthias Ringwald //Send start condition.
326*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= EUSCI_B_CTLW0_TR
327*5fd0122aSMatthias Ringwald + EUSCI_B_CTLW0_TXSTT;
328*5fd0122aSMatthias Ringwald
329*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag and start condition flag.
330*5fd0122aSMatthias Ringwald while (BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
331*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTT_OFS)
332*5fd0122aSMatthias Ringwald || !BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
333*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS));
334*5fd0122aSMatthias Ringwald
335*5fd0122aSMatthias Ringwald //Send single byte data.
336*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
337*5fd0122aSMatthias Ringwald
338*5fd0122aSMatthias Ringwald //Reinstate transmit interrupt enable
339*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= txieStatus;
340*5fd0122aSMatthias Ringwald }
341*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteStartWithTimeout(uint32_t moduleInstance,uint8_t txData,uint32_t timeout)342*5fd0122aSMatthias Ringwald bool I2C_masterSendMultiByteStartWithTimeout(uint32_t moduleInstance,
343*5fd0122aSMatthias Ringwald uint8_t txData, uint32_t timeout)
344*5fd0122aSMatthias Ringwald {
345*5fd0122aSMatthias Ringwald uint_fast16_t txieStatus;
346*5fd0122aSMatthias Ringwald
347*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
348*5fd0122aSMatthias Ringwald
349*5fd0122aSMatthias Ringwald //Store current transmit interrupt enable
350*5fd0122aSMatthias Ringwald txieStatus = EUSCI_B_CMSIS(moduleInstance)->IE & EUSCI_B_IE_TXIE0;
351*5fd0122aSMatthias Ringwald
352*5fd0122aSMatthias Ringwald //Disable transmit interrupt enable
353*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS) = 0;
354*5fd0122aSMatthias Ringwald
355*5fd0122aSMatthias Ringwald //Send start condition.
356*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 |= EUSCI_B_CTLW0_TR
357*5fd0122aSMatthias Ringwald + EUSCI_B_CTLW0_TXSTT;
358*5fd0122aSMatthias Ringwald
359*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag and start condition flag.
360*5fd0122aSMatthias Ringwald while ((BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
361*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTT_OFS)
362*5fd0122aSMatthias Ringwald || !BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
363*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout);
364*5fd0122aSMatthias Ringwald
365*5fd0122aSMatthias Ringwald
366*5fd0122aSMatthias Ringwald //Check if transfer timed out
367*5fd0122aSMatthias Ringwald if (timeout == 0)
368*5fd0122aSMatthias Ringwald return false;
369*5fd0122aSMatthias Ringwald
370*5fd0122aSMatthias Ringwald //Send single byte data.
371*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
372*5fd0122aSMatthias Ringwald
373*5fd0122aSMatthias Ringwald //Reinstate transmit interrupt enable
374*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= txieStatus;
375*5fd0122aSMatthias Ringwald
376*5fd0122aSMatthias Ringwald return true;
377*5fd0122aSMatthias Ringwald }
378*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteNext(uint32_t moduleInstance,uint8_t txData)379*5fd0122aSMatthias Ringwald void I2C_masterSendMultiByteNext(uint32_t moduleInstance, uint8_t txData)
380*5fd0122aSMatthias Ringwald {
381*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
382*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
383*5fd0122aSMatthias Ringwald {
384*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
385*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
386*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS))
387*5fd0122aSMatthias Ringwald ;
388*5fd0122aSMatthias Ringwald }
389*5fd0122aSMatthias Ringwald
390*5fd0122aSMatthias Ringwald //Send single byte data.
391*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
392*5fd0122aSMatthias Ringwald }
393*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteNextWithTimeout(uint32_t moduleInstance,uint8_t txData,uint32_t timeout)394*5fd0122aSMatthias Ringwald bool I2C_masterSendMultiByteNextWithTimeout(uint32_t moduleInstance,
395*5fd0122aSMatthias Ringwald uint8_t txData, uint32_t timeout)
396*5fd0122aSMatthias Ringwald {
397*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
398*5fd0122aSMatthias Ringwald
399*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
400*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
401*5fd0122aSMatthias Ringwald {
402*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
403*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
404*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout)
405*5fd0122aSMatthias Ringwald ;
406*5fd0122aSMatthias Ringwald
407*5fd0122aSMatthias Ringwald //Check if transfer timed out
408*5fd0122aSMatthias Ringwald if (timeout == 0)
409*5fd0122aSMatthias Ringwald return false;
410*5fd0122aSMatthias Ringwald }
411*5fd0122aSMatthias Ringwald
412*5fd0122aSMatthias Ringwald //Send single byte data.
413*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
414*5fd0122aSMatthias Ringwald
415*5fd0122aSMatthias Ringwald return true;
416*5fd0122aSMatthias Ringwald }
417*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteFinish(uint32_t moduleInstance,uint8_t txData)418*5fd0122aSMatthias Ringwald bool I2C_masterSendMultiByteFinish(uint32_t moduleInstance, uint8_t txData)
419*5fd0122aSMatthias Ringwald {
420*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
421*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
422*5fd0122aSMatthias Ringwald {
423*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
424*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
425*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS))
426*5fd0122aSMatthias Ringwald ;
427*5fd0122aSMatthias Ringwald }
428*5fd0122aSMatthias Ringwald
429*5fd0122aSMatthias Ringwald //Send single byte data.
430*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
431*5fd0122aSMatthias Ringwald
432*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
433*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
434*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)
435*5fd0122aSMatthias Ringwald && !BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
436*5fd0122aSMatthias Ringwald EUSCI_B_IFG_NACKIFG_OFS))
437*5fd0122aSMatthias Ringwald ;
438*5fd0122aSMatthias Ringwald if(BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG, EUSCI_B_IFG_NACKIFG_OFS))
439*5fd0122aSMatthias Ringwald return false;
440*5fd0122aSMatthias Ringwald
441*5fd0122aSMatthias Ringwald //Send stop condition.
442*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
443*5fd0122aSMatthias Ringwald 1;
444*5fd0122aSMatthias Ringwald
445*5fd0122aSMatthias Ringwald return true;
446*5fd0122aSMatthias Ringwald }
447*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteFinishWithTimeout(uint32_t moduleInstance,uint8_t txData,uint32_t timeout)448*5fd0122aSMatthias Ringwald bool I2C_masterSendMultiByteFinishWithTimeout(uint32_t moduleInstance,
449*5fd0122aSMatthias Ringwald uint8_t txData, uint32_t timeout)
450*5fd0122aSMatthias Ringwald {
451*5fd0122aSMatthias Ringwald uint32_t timeout2 = timeout;
452*5fd0122aSMatthias Ringwald
453*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
454*5fd0122aSMatthias Ringwald
455*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
456*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
457*5fd0122aSMatthias Ringwald {
458*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
459*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
460*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout)
461*5fd0122aSMatthias Ringwald ;
462*5fd0122aSMatthias Ringwald
463*5fd0122aSMatthias Ringwald //Check if transfer timed out
464*5fd0122aSMatthias Ringwald if (timeout == 0)
465*5fd0122aSMatthias Ringwald return false;
466*5fd0122aSMatthias Ringwald }
467*5fd0122aSMatthias Ringwald
468*5fd0122aSMatthias Ringwald //Send single byte data.
469*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->TXBUF = txData;
470*5fd0122aSMatthias Ringwald
471*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
472*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
473*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout2
474*5fd0122aSMatthias Ringwald && !BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
475*5fd0122aSMatthias Ringwald EUSCI_B_IFG_NACKIFG_OFS))
476*5fd0122aSMatthias Ringwald ;
477*5fd0122aSMatthias Ringwald
478*5fd0122aSMatthias Ringwald //Check if transfer timed out
479*5fd0122aSMatthias Ringwald if (timeout2 == 0)
480*5fd0122aSMatthias Ringwald return false;
481*5fd0122aSMatthias Ringwald
482*5fd0122aSMatthias Ringwald //Send stop condition.
483*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
484*5fd0122aSMatthias Ringwald 1;
485*5fd0122aSMatthias Ringwald
486*5fd0122aSMatthias Ringwald return true;
487*5fd0122aSMatthias Ringwald }
488*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteStop(uint32_t moduleInstance)489*5fd0122aSMatthias Ringwald void I2C_masterSendMultiByteStop(uint32_t moduleInstance)
490*5fd0122aSMatthias Ringwald {
491*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
492*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
493*5fd0122aSMatthias Ringwald {
494*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
495*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
496*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS))
497*5fd0122aSMatthias Ringwald ;
498*5fd0122aSMatthias Ringwald }
499*5fd0122aSMatthias Ringwald
500*5fd0122aSMatthias Ringwald //Send stop condition.
501*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
502*5fd0122aSMatthias Ringwald 1;
503*5fd0122aSMatthias Ringwald }
504*5fd0122aSMatthias Ringwald
I2C_masterSendMultiByteStopWithTimeout(uint32_t moduleInstance,uint32_t timeout)505*5fd0122aSMatthias Ringwald bool I2C_masterSendMultiByteStopWithTimeout(uint32_t moduleInstance,
506*5fd0122aSMatthias Ringwald uint32_t timeout)
507*5fd0122aSMatthias Ringwald {
508*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
509*5fd0122aSMatthias Ringwald
510*5fd0122aSMatthias Ringwald //If interrupts are not used, poll for flags
511*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_TXIE0_OFS))
512*5fd0122aSMatthias Ringwald {
513*5fd0122aSMatthias Ringwald //Poll for transmit interrupt flag.
514*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
515*5fd0122aSMatthias Ringwald EUSCI_B_IFG_TXIFG0_OFS)) && --timeout)
516*5fd0122aSMatthias Ringwald ;
517*5fd0122aSMatthias Ringwald
518*5fd0122aSMatthias Ringwald //Check if transfer timed out
519*5fd0122aSMatthias Ringwald if (timeout == 0)
520*5fd0122aSMatthias Ringwald return false;
521*5fd0122aSMatthias Ringwald }
522*5fd0122aSMatthias Ringwald
523*5fd0122aSMatthias Ringwald //Send stop condition.
524*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
525*5fd0122aSMatthias Ringwald 1;
526*5fd0122aSMatthias Ringwald
527*5fd0122aSMatthias Ringwald return 0x01;
528*5fd0122aSMatthias Ringwald }
529*5fd0122aSMatthias Ringwald
I2C_masterReceiveStart(uint32_t moduleInstance)530*5fd0122aSMatthias Ringwald void I2C_masterReceiveStart(uint32_t moduleInstance)
531*5fd0122aSMatthias Ringwald {
532*5fd0122aSMatthias Ringwald //Set USCI in Receive mode
533*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->CTLW0 = (EUSCI_B_CMSIS(moduleInstance)->CTLW0
534*5fd0122aSMatthias Ringwald & (~EUSCI_B_CTLW0_TR)) | EUSCI_B_CTLW0_TXSTT;
535*5fd0122aSMatthias Ringwald }
536*5fd0122aSMatthias Ringwald
I2C_masterReceiveMultiByteNext(uint32_t moduleInstance)537*5fd0122aSMatthias Ringwald uint8_t I2C_masterReceiveMultiByteNext(uint32_t moduleInstance)
538*5fd0122aSMatthias Ringwald {
539*5fd0122aSMatthias Ringwald return (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
540*5fd0122aSMatthias Ringwald }
541*5fd0122aSMatthias Ringwald
I2C_masterReceiveMultiByteFinish(uint32_t moduleInstance)542*5fd0122aSMatthias Ringwald uint8_t I2C_masterReceiveMultiByteFinish(uint32_t moduleInstance)
543*5fd0122aSMatthias Ringwald {
544*5fd0122aSMatthias Ringwald //Send stop condition.
545*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
546*5fd0122aSMatthias Ringwald 1;
547*5fd0122aSMatthias Ringwald
548*5fd0122aSMatthias Ringwald //Wait for Stop to finish
549*5fd0122aSMatthias Ringwald while (BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
550*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTP_OFS))
551*5fd0122aSMatthias Ringwald {
552*5fd0122aSMatthias Ringwald // Wait for RX buffer
553*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
554*5fd0122aSMatthias Ringwald EUSCI_B_IFG_RXIFG_OFS))
555*5fd0122aSMatthias Ringwald ;
556*5fd0122aSMatthias Ringwald }
557*5fd0122aSMatthias Ringwald
558*5fd0122aSMatthias Ringwald /* Capture data from receive buffer after setting stop bit due to
559*5fd0122aSMatthias Ringwald MSP430 I2C critical timing. */
560*5fd0122aSMatthias Ringwald return (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
561*5fd0122aSMatthias Ringwald }
562*5fd0122aSMatthias Ringwald
I2C_masterReceiveMultiByteFinishWithTimeout(uint32_t moduleInstance,uint8_t * txData,uint32_t timeout)563*5fd0122aSMatthias Ringwald bool I2C_masterReceiveMultiByteFinishWithTimeout(uint32_t moduleInstance,
564*5fd0122aSMatthias Ringwald uint8_t *txData, uint32_t timeout)
565*5fd0122aSMatthias Ringwald {
566*5fd0122aSMatthias Ringwald uint32_t timeout2 = timeout;
567*5fd0122aSMatthias Ringwald
568*5fd0122aSMatthias Ringwald ASSERT(timeout > 0);
569*5fd0122aSMatthias Ringwald
570*5fd0122aSMatthias Ringwald //Send stop condition.
571*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
572*5fd0122aSMatthias Ringwald 1;
573*5fd0122aSMatthias Ringwald
574*5fd0122aSMatthias Ringwald //Wait for Stop to finish
575*5fd0122aSMatthias Ringwald while (BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
576*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTP_OFS) && --timeout)
577*5fd0122aSMatthias Ringwald ;
578*5fd0122aSMatthias Ringwald
579*5fd0122aSMatthias Ringwald //Check if transfer timed out
580*5fd0122aSMatthias Ringwald if (timeout == 0)
581*5fd0122aSMatthias Ringwald return false;
582*5fd0122aSMatthias Ringwald
583*5fd0122aSMatthias Ringwald // Wait for RX buffer
584*5fd0122aSMatthias Ringwald while ((!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
585*5fd0122aSMatthias Ringwald EUSCI_B_IFG_RXIFG_OFS)) && --timeout2)
586*5fd0122aSMatthias Ringwald ;
587*5fd0122aSMatthias Ringwald
588*5fd0122aSMatthias Ringwald //Check if transfer timed out
589*5fd0122aSMatthias Ringwald if (timeout2 == 0)
590*5fd0122aSMatthias Ringwald return false;
591*5fd0122aSMatthias Ringwald
592*5fd0122aSMatthias Ringwald //Capture data from receive buffer after setting stop bit due to
593*5fd0122aSMatthias Ringwald //MSP430 I2C critical timing.
594*5fd0122aSMatthias Ringwald *txData = (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
595*5fd0122aSMatthias Ringwald
596*5fd0122aSMatthias Ringwald return true;
597*5fd0122aSMatthias Ringwald }
598*5fd0122aSMatthias Ringwald
I2C_masterReceiveMultiByteStop(uint32_t moduleInstance)599*5fd0122aSMatthias Ringwald void I2C_masterReceiveMultiByteStop(uint32_t moduleInstance)
600*5fd0122aSMatthias Ringwald {
601*5fd0122aSMatthias Ringwald //Send stop condition.
602*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTP_OFS) =
603*5fd0122aSMatthias Ringwald 1;
604*5fd0122aSMatthias Ringwald }
605*5fd0122aSMatthias Ringwald
I2C_masterReceiveSingle(uint32_t moduleInstance)606*5fd0122aSMatthias Ringwald uint8_t I2C_masterReceiveSingle(uint32_t moduleInstance)
607*5fd0122aSMatthias Ringwald {
608*5fd0122aSMatthias Ringwald //Polling RXIFG0 if RXIE is not enabled
609*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IE, EUSCI_B_IE_RXIE0_OFS))
610*5fd0122aSMatthias Ringwald {
611*5fd0122aSMatthias Ringwald while (!BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->IFG,
612*5fd0122aSMatthias Ringwald EUSCI_B_IFG_RXIFG0_OFS))
613*5fd0122aSMatthias Ringwald ;
614*5fd0122aSMatthias Ringwald }
615*5fd0122aSMatthias Ringwald
616*5fd0122aSMatthias Ringwald //Read a byte.
617*5fd0122aSMatthias Ringwald return (EUSCI_B_CMSIS(moduleInstance)->RXBUF & EUSCI_B_RXBUF_RXBUF_MASK);
618*5fd0122aSMatthias Ringwald }
619*5fd0122aSMatthias Ringwald
I2C_getReceiveBufferAddressForDMA(uint32_t moduleInstance)620*5fd0122aSMatthias Ringwald uint32_t I2C_getReceiveBufferAddressForDMA(uint32_t moduleInstance)
621*5fd0122aSMatthias Ringwald {
622*5fd0122aSMatthias Ringwald return (uint32_t) &EUSCI_B_CMSIS(moduleInstance)->RXBUF;
623*5fd0122aSMatthias Ringwald }
624*5fd0122aSMatthias Ringwald
I2C_getTransmitBufferAddressForDMA(uint32_t moduleInstance)625*5fd0122aSMatthias Ringwald uint32_t I2C_getTransmitBufferAddressForDMA(uint32_t moduleInstance)
626*5fd0122aSMatthias Ringwald {
627*5fd0122aSMatthias Ringwald return (uint32_t) &EUSCI_B_CMSIS(moduleInstance)->TXBUF;
628*5fd0122aSMatthias Ringwald }
629*5fd0122aSMatthias Ringwald
I2C_masterIsStopSent(uint32_t moduleInstance)630*5fd0122aSMatthias Ringwald uint8_t I2C_masterIsStopSent(uint32_t moduleInstance)
631*5fd0122aSMatthias Ringwald {
632*5fd0122aSMatthias Ringwald return BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
633*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTP_OFS);
634*5fd0122aSMatthias Ringwald }
635*5fd0122aSMatthias Ringwald
I2C_masterIsStartSent(uint32_t moduleInstance)636*5fd0122aSMatthias Ringwald bool I2C_masterIsStartSent(uint32_t moduleInstance)
637*5fd0122aSMatthias Ringwald {
638*5fd0122aSMatthias Ringwald return BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0,
639*5fd0122aSMatthias Ringwald EUSCI_B_CTLW0_TXSTT_OFS);
640*5fd0122aSMatthias Ringwald }
641*5fd0122aSMatthias Ringwald
I2C_masterSendStart(uint32_t moduleInstance)642*5fd0122aSMatthias Ringwald void I2C_masterSendStart(uint32_t moduleInstance)
643*5fd0122aSMatthias Ringwald {
644*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXSTT_OFS) =
645*5fd0122aSMatthias Ringwald 1;
646*5fd0122aSMatthias Ringwald }
647*5fd0122aSMatthias Ringwald
I2C_enableMultiMasterMode(uint32_t moduleInstance)648*5fd0122aSMatthias Ringwald void I2C_enableMultiMasterMode(uint32_t moduleInstance)
649*5fd0122aSMatthias Ringwald {
650*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
651*5fd0122aSMatthias Ringwald 1;
652*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_MM_OFS) =
653*5fd0122aSMatthias Ringwald 1;
654*5fd0122aSMatthias Ringwald }
655*5fd0122aSMatthias Ringwald
I2C_disableMultiMasterMode(uint32_t moduleInstance)656*5fd0122aSMatthias Ringwald void I2C_disableMultiMasterMode(uint32_t moduleInstance)
657*5fd0122aSMatthias Ringwald {
658*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_SWRST_OFS) =
659*5fd0122aSMatthias Ringwald 1;
660*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_MM_OFS) =
661*5fd0122aSMatthias Ringwald 0;
662*5fd0122aSMatthias Ringwald }
663*5fd0122aSMatthias Ringwald
I2C_enableInterrupt(uint32_t moduleInstance,uint_fast16_t mask)664*5fd0122aSMatthias Ringwald void I2C_enableInterrupt(uint32_t moduleInstance, uint_fast16_t mask)
665*5fd0122aSMatthias Ringwald {
666*5fd0122aSMatthias Ringwald ASSERT(
667*5fd0122aSMatthias Ringwald 0x00
668*5fd0122aSMatthias Ringwald == (mask
669*5fd0122aSMatthias Ringwald & ~(EUSCI_B_I2C_STOP_INTERRUPT
670*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_START_INTERRUPT
671*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_NAK_INTERRUPT
672*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_ARBITRATIONLOST_INTERRUPT
673*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BIT9_POSITION_INTERRUPT
674*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT
675*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT
676*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT0
677*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT1
678*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT2
679*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT3
680*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT0
681*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT1
682*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT2
683*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT3)));
684*5fd0122aSMatthias Ringwald
685*5fd0122aSMatthias Ringwald //Enable the interrupt masked bit
686*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE |= mask;
687*5fd0122aSMatthias Ringwald }
688*5fd0122aSMatthias Ringwald
I2C_disableInterrupt(uint32_t moduleInstance,uint_fast16_t mask)689*5fd0122aSMatthias Ringwald void I2C_disableInterrupt(uint32_t moduleInstance, uint_fast16_t mask)
690*5fd0122aSMatthias Ringwald {
691*5fd0122aSMatthias Ringwald ASSERT(
692*5fd0122aSMatthias Ringwald 0x00
693*5fd0122aSMatthias Ringwald == (mask
694*5fd0122aSMatthias Ringwald & ~(EUSCI_B_I2C_STOP_INTERRUPT
695*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_START_INTERRUPT
696*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_NAK_INTERRUPT
697*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_ARBITRATIONLOST_INTERRUPT
698*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BIT9_POSITION_INTERRUPT
699*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT
700*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT
701*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT0
702*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT1
703*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT2
704*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT3
705*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT0
706*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT1
707*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT2
708*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT3)));
709*5fd0122aSMatthias Ringwald
710*5fd0122aSMatthias Ringwald //Disable the interrupt masked bit
711*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE &= ~(mask);
712*5fd0122aSMatthias Ringwald }
713*5fd0122aSMatthias Ringwald
I2C_clearInterruptFlag(uint32_t moduleInstance,uint_fast16_t mask)714*5fd0122aSMatthias Ringwald void I2C_clearInterruptFlag(uint32_t moduleInstance, uint_fast16_t mask)
715*5fd0122aSMatthias Ringwald {
716*5fd0122aSMatthias Ringwald ASSERT(
717*5fd0122aSMatthias Ringwald 0x00
718*5fd0122aSMatthias Ringwald == (mask
719*5fd0122aSMatthias Ringwald & ~(EUSCI_B_I2C_STOP_INTERRUPT
720*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_START_INTERRUPT
721*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_NAK_INTERRUPT
722*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_ARBITRATIONLOST_INTERRUPT
723*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BIT9_POSITION_INTERRUPT
724*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT
725*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT
726*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT0
727*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT1
728*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT2
729*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT3
730*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT0
731*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT1
732*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT2
733*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT3)));
734*5fd0122aSMatthias Ringwald //Clear the I2C interrupt source.
735*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IFG &= ~(mask);
736*5fd0122aSMatthias Ringwald }
737*5fd0122aSMatthias Ringwald
I2C_getInterruptStatus(uint32_t moduleInstance,uint16_t mask)738*5fd0122aSMatthias Ringwald uint_fast16_t I2C_getInterruptStatus(uint32_t moduleInstance, uint16_t mask)
739*5fd0122aSMatthias Ringwald {
740*5fd0122aSMatthias Ringwald ASSERT(
741*5fd0122aSMatthias Ringwald 0x00
742*5fd0122aSMatthias Ringwald == (mask
743*5fd0122aSMatthias Ringwald & ~(EUSCI_B_I2C_STOP_INTERRUPT
744*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_START_INTERRUPT
745*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_NAK_INTERRUPT
746*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_ARBITRATIONLOST_INTERRUPT
747*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BIT9_POSITION_INTERRUPT
748*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT
749*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT
750*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT0
751*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT1
752*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT2
753*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_TRANSMIT_INTERRUPT3
754*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT0
755*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT1
756*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT2
757*5fd0122aSMatthias Ringwald + EUSCI_B_I2C_RECEIVE_INTERRUPT3)));
758*5fd0122aSMatthias Ringwald //Return the interrupt status of the request masked bit.
759*5fd0122aSMatthias Ringwald return EUSCI_B_CMSIS(moduleInstance)->IFG & mask;
760*5fd0122aSMatthias Ringwald }
761*5fd0122aSMatthias Ringwald
I2C_getEnabledInterruptStatus(uint32_t moduleInstance)762*5fd0122aSMatthias Ringwald uint_fast16_t I2C_getEnabledInterruptStatus(uint32_t moduleInstance)
763*5fd0122aSMatthias Ringwald {
764*5fd0122aSMatthias Ringwald return I2C_getInterruptStatus(moduleInstance,
765*5fd0122aSMatthias Ringwald EUSCI_B_CMSIS(moduleInstance)->IE);
766*5fd0122aSMatthias Ringwald }
767*5fd0122aSMatthias Ringwald
I2C_getMode(uint32_t moduleInstance)768*5fd0122aSMatthias Ringwald uint_fast16_t I2C_getMode(uint32_t moduleInstance)
769*5fd0122aSMatthias Ringwald {
770*5fd0122aSMatthias Ringwald //Read the I2C mode.
771*5fd0122aSMatthias Ringwald return (EUSCI_B_CMSIS(moduleInstance)->CTLW0 & EUSCI_B_CTLW0_TR);
772*5fd0122aSMatthias Ringwald }
773*5fd0122aSMatthias Ringwald
I2C_registerInterrupt(uint32_t moduleInstance,void (* intHandler)(void))774*5fd0122aSMatthias Ringwald void I2C_registerInterrupt(uint32_t moduleInstance, void (*intHandler)(void))
775*5fd0122aSMatthias Ringwald {
776*5fd0122aSMatthias Ringwald switch (moduleInstance)
777*5fd0122aSMatthias Ringwald {
778*5fd0122aSMatthias Ringwald case EUSCI_B0_BASE:
779*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIB0, intHandler);
780*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIB0);
781*5fd0122aSMatthias Ringwald break;
782*5fd0122aSMatthias Ringwald case EUSCI_B1_BASE:
783*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIB1, intHandler);
784*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIB1);
785*5fd0122aSMatthias Ringwald break;
786*5fd0122aSMatthias Ringwald #ifdef EUSCI_B2_BASE
787*5fd0122aSMatthias Ringwald case EUSCI_B2_BASE:
788*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIB2, intHandler);
789*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIB2);
790*5fd0122aSMatthias Ringwald break;
791*5fd0122aSMatthias Ringwald #endif
792*5fd0122aSMatthias Ringwald #ifdef EUSCI_B3_BASE
793*5fd0122aSMatthias Ringwald case EUSCI_B3_BASE:
794*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_EUSCIB3, intHandler);
795*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_EUSCIB3);
796*5fd0122aSMatthias Ringwald break;
797*5fd0122aSMatthias Ringwald #endif
798*5fd0122aSMatthias Ringwald default:
799*5fd0122aSMatthias Ringwald ASSERT(false);
800*5fd0122aSMatthias Ringwald }
801*5fd0122aSMatthias Ringwald }
802*5fd0122aSMatthias Ringwald
I2C_unregisterInterrupt(uint32_t moduleInstance)803*5fd0122aSMatthias Ringwald void I2C_unregisterInterrupt(uint32_t moduleInstance)
804*5fd0122aSMatthias Ringwald {
805*5fd0122aSMatthias Ringwald switch (moduleInstance)
806*5fd0122aSMatthias Ringwald {
807*5fd0122aSMatthias Ringwald case EUSCI_B0_BASE:
808*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIB0);
809*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIB0);
810*5fd0122aSMatthias Ringwald break;
811*5fd0122aSMatthias Ringwald case EUSCI_B1_BASE:
812*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIB1);
813*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIB1);
814*5fd0122aSMatthias Ringwald break;
815*5fd0122aSMatthias Ringwald #ifdef EUSCI_B2_BASE
816*5fd0122aSMatthias Ringwald case EUSCI_B2_BASE:
817*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIB2);
818*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIB2);
819*5fd0122aSMatthias Ringwald break;
820*5fd0122aSMatthias Ringwald #endif
821*5fd0122aSMatthias Ringwald #ifdef EUSCI_B3_BASE
822*5fd0122aSMatthias Ringwald case EUSCI_B3_BASE:
823*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_EUSCIB3);
824*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_EUSCIB3);
825*5fd0122aSMatthias Ringwald break;
826*5fd0122aSMatthias Ringwald #endif
827*5fd0122aSMatthias Ringwald default:
828*5fd0122aSMatthias Ringwald ASSERT(false);
829*5fd0122aSMatthias Ringwald }
830*5fd0122aSMatthias Ringwald }
831*5fd0122aSMatthias Ringwald
I2C_slaveSendNAK(uint32_t moduleInstance)832*5fd0122aSMatthias Ringwald void I2C_slaveSendNAK(uint32_t moduleInstance)
833*5fd0122aSMatthias Ringwald {
834*5fd0122aSMatthias Ringwald BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_B_CTLW0_TXNACK_OFS) =
835*5fd0122aSMatthias Ringwald 1;
836*5fd0122aSMatthias Ringwald }
837