1 /******************************************************************************
2  *  Filename:       i2c.c
3  *
4  *  Description:    Driver for I2C.
5  *
6  *  Copyright (c) 2022 Texas Instruments Incorporated
7  *
8  *  Redistribution and use in source and binary forms, with or without
9  *  modification, are permitted provided that the following conditions are met:
10  *
11  *  1) Redistributions of source code must retain the above copyright notice,
12  *     this list of conditions and the following disclaimer.
13  *
14  *  2) Redistributions in binary form must reproduce the above copyright notice,
15  *     this list of conditions and the following disclaimer in the documentation
16  *     and/or other materials provided with the distribution.
17  *
18  *  3) Neither the name of the copyright holder nor the names of its
19  *     contributors may be used to endorse or promote products derived from this
20  *     software without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  *  POSSIBILITY OF SUCH DAMAGE.
33  *
34  ******************************************************************************/
35 
36 #include "i2c.h"
37 
38 //*****************************************************************************
39 //
40 // Initializes the I2C Controller module
41 //
42 //*****************************************************************************
I2CControllerInitExpClk(uint32_t base,bool fast)43 void I2CControllerInitExpClk(uint32_t base, bool fast)
44 {
45     uint32_t sclFreq;
46     uint32_t tpr;
47 
48     // Check the arguments.
49     ASSERT(I2CBaseValid(base));
50 
51     // Must enable the device before doing anything else.
52     I2CControllerEnable(base);
53 
54     // Get the desired SCL speed.
55     if (fast == true)
56     {
57         sclFreq = 400000;
58     }
59     else
60     {
61         sclFreq = 100000;
62     }
63 
64     // Compute the clock divider that achieves the fastest speed less than or
65     // equal to the desired speed. The numerator is biased to favor a larger
66     // clock divider so that the resulting clock is always less than or equal
67     // to the desired clock, never greater.
68     tpr                      = ((I2C_CLK_FREQ + (2 * 10 * sclFreq) - 1) / (2 * 10 * sclFreq)) - 1;
69     HWREG(base + I2C_O_CTPR) = tpr;
70 }
71 
72 //*****************************************************************************
73 //
74 // Gets the error status of the I2C Controller module
75 //
76 //*****************************************************************************
I2CControllerError(uint32_t base)77 uint32_t I2CControllerError(uint32_t base)
78 {
79     uint32_t err;
80 
81     // Check the arguments.
82     ASSERT(I2CBaseValid(base));
83 
84     // Get the raw error state.
85     err = HWREG(base + I2C_O_CSTA);
86 
87     // If the I2C controller is busy, then all the other status bits are invalid,
88     // and there is no error to report.
89     if (err & I2C_CSTA_BUSY_M)
90     {
91         return (I2C_CONTROLLER_ERR_NONE);
92     }
93 
94     // Check for errors.
95     if (err & (I2C_CSTA_ERR_M | I2C_CSTA_ARBLST_M))
96     {
97         return (err & (I2C_CSTA_ARBLST_M | I2C_CSTA_DATACKN_M | I2C_CSTA_ADRACKN_M));
98     }
99     else
100     {
101         return (I2C_CONTROLLER_ERR_NONE);
102     }
103 }
104