Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /**
sahilmgandhi 18:6a4db94011d3 2 *******************************************************************************
sahilmgandhi 18:6a4db94011d3 3 * @file i2c.c
sahilmgandhi 18:6a4db94011d3 4 * @brief Implementation of an i2c api
sahilmgandhi 18:6a4db94011d3 5 * @internal
sahilmgandhi 18:6a4db94011d3 6 * @author ON Semiconductor
sahilmgandhi 18:6a4db94011d3 7 * $Rev: 3525 $
sahilmgandhi 18:6a4db94011d3 8 * $Date: 2015-07-20 15:24:25 +0530 (Mon, 20 Jul 2015) $
sahilmgandhi 18:6a4db94011d3 9 ******************************************************************************
sahilmgandhi 18:6a4db94011d3 10 * Copyright 2016 Semiconductor Components Industries LLC (d/b/a “ON Semiconductor”).
sahilmgandhi 18:6a4db94011d3 11 * All rights reserved. This software and/or documentation is licensed by ON Semiconductor
sahilmgandhi 18:6a4db94011d3 12 * under limited terms and conditions. The terms and conditions pertaining to the software
sahilmgandhi 18:6a4db94011d3 13 * and/or documentation are available at http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf
sahilmgandhi 18:6a4db94011d3 14 * (“ON Semiconductor Standard Terms and Conditions of Sale, Section 8 Software”) and
sahilmgandhi 18:6a4db94011d3 15 * if applicable the software license agreement. Do not use this software and/or
sahilmgandhi 18:6a4db94011d3 16 * documentation unless you have carefully read and you agree to the limited terms and
sahilmgandhi 18:6a4db94011d3 17 * conditions. By using this software and/or documentation, you agree to the limited
sahilmgandhi 18:6a4db94011d3 18 * terms and conditions.
sahilmgandhi 18:6a4db94011d3 19 *
sahilmgandhi 18:6a4db94011d3 20 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
sahilmgandhi 18:6a4db94011d3 21 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
sahilmgandhi 18:6a4db94011d3 22 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
sahilmgandhi 18:6a4db94011d3 23 * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
sahilmgandhi 18:6a4db94011d3 24 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
sahilmgandhi 18:6a4db94011d3 25 * @endinternal
sahilmgandhi 18:6a4db94011d3 26 *
sahilmgandhi 18:6a4db94011d3 27 * @ingroup i2c
sahilmgandhi 18:6a4db94011d3 28 *
sahilmgandhi 18:6a4db94011d3 29 */
sahilmgandhi 18:6a4db94011d3 30 #if DEVICE_I2C
sahilmgandhi 18:6a4db94011d3 31
sahilmgandhi 18:6a4db94011d3 32 #include "i2c.h"
sahilmgandhi 18:6a4db94011d3 33 #include "i2c_api.h"
sahilmgandhi 18:6a4db94011d3 34 #include "mbed_wait_api.h"
sahilmgandhi 18:6a4db94011d3 35
sahilmgandhi 18:6a4db94011d3 36 #define I2C_READ_WRITE_BIT_MASK 0xFE
sahilmgandhi 18:6a4db94011d3 37
sahilmgandhi 18:6a4db94011d3 38 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 39 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
sahilmgandhi 18:6a4db94011d3 40 {
sahilmgandhi 18:6a4db94011d3 41 fI2cInit(obj, sda, scl);
sahilmgandhi 18:6a4db94011d3 42 }
sahilmgandhi 18:6a4db94011d3 43
sahilmgandhi 18:6a4db94011d3 44 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 45 void i2c_frequency(i2c_t *obj, int hz)
sahilmgandhi 18:6a4db94011d3 46 {
sahilmgandhi 18:6a4db94011d3 47 fI2cFrequency(obj, hz);
sahilmgandhi 18:6a4db94011d3 48 }
sahilmgandhi 18:6a4db94011d3 49
sahilmgandhi 18:6a4db94011d3 50 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 51 int i2c_start(i2c_t *obj)
sahilmgandhi 18:6a4db94011d3 52 {
sahilmgandhi 18:6a4db94011d3 53 return(fI2cStart(obj));
sahilmgandhi 18:6a4db94011d3 54 }
sahilmgandhi 18:6a4db94011d3 55
sahilmgandhi 18:6a4db94011d3 56 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 57 int i2c_stop(i2c_t *obj)
sahilmgandhi 18:6a4db94011d3 58 {
sahilmgandhi 18:6a4db94011d3 59 return(fI2cStop(obj));
sahilmgandhi 18:6a4db94011d3 60 }
sahilmgandhi 18:6a4db94011d3 61
sahilmgandhi 18:6a4db94011d3 62 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 63 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
sahilmgandhi 18:6a4db94011d3 64 {
sahilmgandhi 18:6a4db94011d3 65 /* TODO address parameter not usable */
sahilmgandhi 18:6a4db94011d3 66 int Count, status;
sahilmgandhi 18:6a4db94011d3 67 const char WriteData = (address | (~I2C_READ_WRITE_BIT_MASK)) & 0xFF;
sahilmgandhi 18:6a4db94011d3 68
sahilmgandhi 18:6a4db94011d3 69 /* Send start bit */
sahilmgandhi 18:6a4db94011d3 70 status = fI2cStart(obj);
sahilmgandhi 18:6a4db94011d3 71 if(status) {
sahilmgandhi 18:6a4db94011d3 72 /* Error sending start bit */
sahilmgandhi 18:6a4db94011d3 73 return status;
sahilmgandhi 18:6a4db94011d3 74 }
sahilmgandhi 18:6a4db94011d3 75
sahilmgandhi 18:6a4db94011d3 76 /* Send address | read */
sahilmgandhi 18:6a4db94011d3 77 Count = fI2cWriteB(obj, &WriteData, 1);
sahilmgandhi 18:6a4db94011d3 78 if(Count != 1) {
sahilmgandhi 18:6a4db94011d3 79 /* Error sending address */
sahilmgandhi 18:6a4db94011d3 80 return Count;
sahilmgandhi 18:6a4db94011d3 81 }
sahilmgandhi 18:6a4db94011d3 82
sahilmgandhi 18:6a4db94011d3 83 /* Send command/s */
sahilmgandhi 18:6a4db94011d3 84 Count = fI2cReadB(obj, data, length);
sahilmgandhi 18:6a4db94011d3 85 if(Count != length) {
sahilmgandhi 18:6a4db94011d3 86 /* Error sending coomand/s */
sahilmgandhi 18:6a4db94011d3 87 return Count;
sahilmgandhi 18:6a4db94011d3 88 }
sahilmgandhi 18:6a4db94011d3 89 if(stop) { /* Send stop bit if requested */
sahilmgandhi 18:6a4db94011d3 90 status = fI2cStop(obj);
sahilmgandhi 18:6a4db94011d3 91 if(status) {
sahilmgandhi 18:6a4db94011d3 92 /* Error sending stop bit */
sahilmgandhi 18:6a4db94011d3 93 return status;
sahilmgandhi 18:6a4db94011d3 94 }
sahilmgandhi 18:6a4db94011d3 95 }
sahilmgandhi 18:6a4db94011d3 96 return Count;
sahilmgandhi 18:6a4db94011d3 97 }
sahilmgandhi 18:6a4db94011d3 98
sahilmgandhi 18:6a4db94011d3 99 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 100 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
sahilmgandhi 18:6a4db94011d3 101 {
sahilmgandhi 18:6a4db94011d3 102 int Count, status;
sahilmgandhi 18:6a4db94011d3 103 const char WriteData = (address & I2C_READ_WRITE_BIT_MASK) & 0xFF;
sahilmgandhi 18:6a4db94011d3 104
sahilmgandhi 18:6a4db94011d3 105 /* Send start bit */
sahilmgandhi 18:6a4db94011d3 106 status = fI2cStart(obj);
sahilmgandhi 18:6a4db94011d3 107 if(status) {
sahilmgandhi 18:6a4db94011d3 108 /* Error sending start bit */
sahilmgandhi 18:6a4db94011d3 109 return status;
sahilmgandhi 18:6a4db94011d3 110 }
sahilmgandhi 18:6a4db94011d3 111
sahilmgandhi 18:6a4db94011d3 112 /* Send address | write */
sahilmgandhi 18:6a4db94011d3 113 Count = fI2cWriteB(obj, &WriteData, 1);
sahilmgandhi 18:6a4db94011d3 114 if(Count != 1) {
sahilmgandhi 18:6a4db94011d3 115 /* Error sending address */
sahilmgandhi 18:6a4db94011d3 116 return Count;
sahilmgandhi 18:6a4db94011d3 117 }
sahilmgandhi 18:6a4db94011d3 118
sahilmgandhi 18:6a4db94011d3 119 /* Sens command, [data] */
sahilmgandhi 18:6a4db94011d3 120 Count = fI2cWriteB(obj, data, length);
sahilmgandhi 18:6a4db94011d3 121 if(Count != length) {
sahilmgandhi 18:6a4db94011d3 122 /* Error sending address */
sahilmgandhi 18:6a4db94011d3 123 return Count;
sahilmgandhi 18:6a4db94011d3 124 }
sahilmgandhi 18:6a4db94011d3 125
sahilmgandhi 18:6a4db94011d3 126 if(stop) { /* If stop requested */
sahilmgandhi 18:6a4db94011d3 127 /* Send stop bit */
sahilmgandhi 18:6a4db94011d3 128 status = fI2cStop(obj);
sahilmgandhi 18:6a4db94011d3 129 if(status) {
sahilmgandhi 18:6a4db94011d3 130 /* Error sending stop bit */
sahilmgandhi 18:6a4db94011d3 131 return status;
sahilmgandhi 18:6a4db94011d3 132 }
sahilmgandhi 18:6a4db94011d3 133 }
sahilmgandhi 18:6a4db94011d3 134 return Count;
sahilmgandhi 18:6a4db94011d3 135 }
sahilmgandhi 18:6a4db94011d3 136
sahilmgandhi 18:6a4db94011d3 137 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 138 void i2c_reset(i2c_t *obj)
sahilmgandhi 18:6a4db94011d3 139 {
sahilmgandhi 18:6a4db94011d3 140 (void)fI2cStop(obj);
sahilmgandhi 18:6a4db94011d3 141 }
sahilmgandhi 18:6a4db94011d3 142
sahilmgandhi 18:6a4db94011d3 143 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 144 int i2c_byte_read(i2c_t *obj, int last) /* TODO return size can be uint8_t */
sahilmgandhi 18:6a4db94011d3 145 {
sahilmgandhi 18:6a4db94011d3 146 int Count;
sahilmgandhi 18:6a4db94011d3 147 char data;
sahilmgandhi 18:6a4db94011d3 148 Count = fI2cReadB(obj, &data, 1);
sahilmgandhi 18:6a4db94011d3 149 if(Count != 1) {
sahilmgandhi 18:6a4db94011d3 150 /* Error */
sahilmgandhi 18:6a4db94011d3 151 return Count;
sahilmgandhi 18:6a4db94011d3 152 }
sahilmgandhi 18:6a4db94011d3 153 if(last) {
sahilmgandhi 18:6a4db94011d3 154 /* ACK */
sahilmgandhi 18:6a4db94011d3 155 SEND_COMMAND(I2C_CMD_WDAT0);
sahilmgandhi 18:6a4db94011d3 156 } else {
sahilmgandhi 18:6a4db94011d3 157 /* No ACK */
sahilmgandhi 18:6a4db94011d3 158 SEND_COMMAND(I2C_CMD_WDAT1);
sahilmgandhi 18:6a4db94011d3 159 }
sahilmgandhi 18:6a4db94011d3 160 return data;
sahilmgandhi 18:6a4db94011d3 161 }
sahilmgandhi 18:6a4db94011d3 162
sahilmgandhi 18:6a4db94011d3 163 /* See i2c_api.h for details */
sahilmgandhi 18:6a4db94011d3 164 int i2c_byte_write(i2c_t *obj, int data)
sahilmgandhi 18:6a4db94011d3 165 {
sahilmgandhi 18:6a4db94011d3 166 int Count;
sahilmgandhi 18:6a4db94011d3 167 Count = fI2cWriteB(obj, (const char *)&data, 1);
sahilmgandhi 18:6a4db94011d3 168 if(Count != 1) {
sahilmgandhi 18:6a4db94011d3 169 return Count;
sahilmgandhi 18:6a4db94011d3 170 }
sahilmgandhi 18:6a4db94011d3 171
sahilmgandhi 18:6a4db94011d3 172 while(obj->membase->STATUS.WORD & I2C_STATUS_CMD_FIFO_OFL_BIT); /* Wait till command overflow ends */
sahilmgandhi 18:6a4db94011d3 173
sahilmgandhi 18:6a4db94011d3 174 if(obj->membase->STATUS.WORD & I2C_STATUS_BUS_ERR_BIT) {
sahilmgandhi 18:6a4db94011d3 175 /* Bus error means NAK received */
sahilmgandhi 18:6a4db94011d3 176 return 0;
sahilmgandhi 18:6a4db94011d3 177 } else {
sahilmgandhi 18:6a4db94011d3 178 /* ACK received */
sahilmgandhi 18:6a4db94011d3 179 return 1;
sahilmgandhi 18:6a4db94011d3 180 }
sahilmgandhi 18:6a4db94011d3 181 }
sahilmgandhi 18:6a4db94011d3 182
sahilmgandhi 18:6a4db94011d3 183 #endif /* DEVICE_I2C */