uart

Dependencies:   MAX32620FTHR USBDevice

Committer:
rsjawale24
Date:
Sun Oct 16 15:35:01 2022 +0000
Revision:
0:c62425b2f286
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rsjawale24 0:c62425b2f286 1 /*******************************************************************************
rsjawale24 0:c62425b2f286 2 * Copyright (C) Maxim Integrated Products, Inc., All rights Reserved.
rsjawale24 0:c62425b2f286 3 *
rsjawale24 0:c62425b2f286 4 * This software is protected by copyright laws of the United States and
rsjawale24 0:c62425b2f286 5 * of foreign countries. This material may also be protected by patent laws
rsjawale24 0:c62425b2f286 6 * and technology transfer regulations of the United States and of foreign
rsjawale24 0:c62425b2f286 7 * countries. This software is furnished under a license agreement and/or a
rsjawale24 0:c62425b2f286 8 * nondisclosure agreement and may only be used or reproduced in accordance
rsjawale24 0:c62425b2f286 9 * with the terms of those agreements. Dissemination of this information to
rsjawale24 0:c62425b2f286 10 * any party or parties not specified in the license agreement and/or
rsjawale24 0:c62425b2f286 11 * nondisclosure agreement is expressly prohibited.
rsjawale24 0:c62425b2f286 12 *
rsjawale24 0:c62425b2f286 13 * The above copyright notice and this permission notice shall be included
rsjawale24 0:c62425b2f286 14 * in all copies or substantial portions of the Software.
rsjawale24 0:c62425b2f286 15 *
rsjawale24 0:c62425b2f286 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
rsjawale24 0:c62425b2f286 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
rsjawale24 0:c62425b2f286 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
rsjawale24 0:c62425b2f286 19 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
rsjawale24 0:c62425b2f286 20 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
rsjawale24 0:c62425b2f286 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
rsjawale24 0:c62425b2f286 22 * OTHER DEALINGS IN THE SOFTWARE.
rsjawale24 0:c62425b2f286 23 *
rsjawale24 0:c62425b2f286 24 * Except as contained in this notice, the name of Maxim Integrated
rsjawale24 0:c62425b2f286 25 * Products, Inc. shall not be used except as stated in the Maxim Integrated
rsjawale24 0:c62425b2f286 26 * Products, Inc. Branding Policy.
rsjawale24 0:c62425b2f286 27 *
rsjawale24 0:c62425b2f286 28 * The mere transfer of this software does not imply any licenses
rsjawale24 0:c62425b2f286 29 * of trade secrets, proprietary technology, copyrights, patents,
rsjawale24 0:c62425b2f286 30 * trademarks, maskwork rights, or any other form of intellectual
rsjawale24 0:c62425b2f286 31 * property whatsoever. Maxim Integrated Products, Inc. retains all
rsjawale24 0:c62425b2f286 32 * ownership rights.
rsjawale24 0:c62425b2f286 33 *******************************************************************************
rsjawale24 0:c62425b2f286 34 */
rsjawale24 0:c62425b2f286 35
rsjawale24 0:c62425b2f286 36 #include "mbed.h"
rsjawale24 0:c62425b2f286 37 #include "controller.h"
rsjawale24 0:c62425b2f286 38 #include "config.h"
rsjawale24 0:c62425b2f286 39
rsjawale24 0:c62425b2f286 40 static uint32_t i2c_device_addr = 0x9E; // LSB justified
rsjawale24 0:c62425b2f286 41
rsjawale24 0:c62425b2f286 42 #define I2C_ADDR_SELECT 0
rsjawale24 0:c62425b2f286 43
rsjawale24 0:c62425b2f286 44 void i2c_init()
rsjawale24 0:c62425b2f286 45 {
rsjawale24 0:c62425b2f286 46 if (I2C_ADDR_SELECT) {
rsjawale24 0:c62425b2f286 47 csb = 0; // set low for default i2c address
rsjawale24 0:c62425b2f286 48 i2c_device_addr = 0x9E;
rsjawale24 0:c62425b2f286 49 }
rsjawale24 0:c62425b2f286 50 else {
rsjawale24 0:c62425b2f286 51 csb = 1;
rsjawale24 0:c62425b2f286 52 i2c_device_addr = 0xA0;
rsjawale24 0:c62425b2f286 53 }
rsjawale24 0:c62425b2f286 54 sel = 1; // set high for i2c
rsjawale24 0:c62425b2f286 55 }
rsjawale24 0:c62425b2f286 56
rsjawale24 0:c62425b2f286 57 void spi_init()
rsjawale24 0:c62425b2f286 58 {
rsjawale24 0:c62425b2f286 59 sel = 0; // set low for SPI
rsjawale24 0:c62425b2f286 60 }
rsjawale24 0:c62425b2f286 61
rsjawale24 0:c62425b2f286 62 int reg_read(const uint8_t reg_addr, const uint8_t num_bytes, uint8_t reg_vals[])
rsjawale24 0:c62425b2f286 63 {
rsjawale24 0:c62425b2f286 64 if (serial_mode == SPI_MODE) {
rsjawale24 0:c62425b2f286 65 spi_read(reg_addr, num_bytes, reg_vals);
rsjawale24 0:c62425b2f286 66 }
rsjawale24 0:c62425b2f286 67 else {
rsjawale24 0:c62425b2f286 68 i2c_read(reg_addr, num_bytes, reg_vals);
rsjawale24 0:c62425b2f286 69 }
rsjawale24 0:c62425b2f286 70 return 0;
rsjawale24 0:c62425b2f286 71 }
rsjawale24 0:c62425b2f286 72
rsjawale24 0:c62425b2f286 73 int reg_write(const uint8_t reg_addr, const uint8_t reg_val)
rsjawale24 0:c62425b2f286 74 {
rsjawale24 0:c62425b2f286 75 int result = (serial_mode == SPI_MODE ? spi_write(reg_addr, reg_val) : i2c_write(reg_addr, reg_val));
rsjawale24 0:c62425b2f286 76 return result;
rsjawale24 0:c62425b2f286 77 }
rsjawale24 0:c62425b2f286 78
rsjawale24 0:c62425b2f286 79 int i2c_read(const uint8_t reg_addr, const uint8_t num_bytes, uint8_t reg_vals[])
rsjawale24 0:c62425b2f286 80 {
rsjawale24 0:c62425b2f286 81 #if !USE_SPI
rsjawale24 0:c62425b2f286 82 char read_addr = (char)reg_addr;
rsjawale24 0:c62425b2f286 83 i2c.write(i2c_device_addr, &read_addr, 1);
rsjawale24 0:c62425b2f286 84 i2c.read(i2c_device_addr, (char*)reg_vals, (int)num_bytes);
rsjawale24 0:c62425b2f286 85 #endif
rsjawale24 0:c62425b2f286 86 return 0;
rsjawale24 0:c62425b2f286 87 }
rsjawale24 0:c62425b2f286 88
rsjawale24 0:c62425b2f286 89 int i2c_write(const uint8_t reg_addr, const uint8_t reg_val)
rsjawale24 0:c62425b2f286 90 {
rsjawale24 0:c62425b2f286 91 #if !USE_SPI
rsjawale24 0:c62425b2f286 92 char data[2];
rsjawale24 0:c62425b2f286 93 data[0] = reg_addr;
rsjawale24 0:c62425b2f286 94 data[1] = reg_val;
rsjawale24 0:c62425b2f286 95 i2c.write(i2c_device_addr, data, 2);
rsjawale24 0:c62425b2f286 96 #endif
rsjawale24 0:c62425b2f286 97 return 0;
rsjawale24 0:c62425b2f286 98 }
rsjawale24 0:c62425b2f286 99
rsjawale24 0:c62425b2f286 100 int spi_read(const uint8_t reg_addr, const uint8_t num_bytes, uint8_t reg_vals[])
rsjawale24 0:c62425b2f286 101 {
rsjawale24 0:c62425b2f286 102 #if USE_SPI
rsjawale24 0:c62425b2f286 103 csb = 0;
rsjawale24 0:c62425b2f286 104 spi.write(reg_addr); // byte 1: register address
rsjawale24 0:c62425b2f286 105 spi.write(0x80); // byte 2: read command 0x80
rsjawale24 0:c62425b2f286 106 for(int i=0; i<num_bytes; i++) {
rsjawale24 0:c62425b2f286 107 reg_vals[i] = spi.write(0x00); // byte3: read byte
rsjawale24 0:c62425b2f286 108 }
rsjawale24 0:c62425b2f286 109 csb = 1;
rsjawale24 0:c62425b2f286 110 #endif
rsjawale24 0:c62425b2f286 111 return 0;
rsjawale24 0:c62425b2f286 112 }
rsjawale24 0:c62425b2f286 113
rsjawale24 0:c62425b2f286 114 int spi_write(const uint8_t reg_addr, const uint8_t reg_val)
rsjawale24 0:c62425b2f286 115 {
rsjawale24 0:c62425b2f286 116 #if USE_SPI
rsjawale24 0:c62425b2f286 117 csb = 0;
rsjawale24 0:c62425b2f286 118 spi.write(reg_addr); // byte1: register address
rsjawale24 0:c62425b2f286 119 spi.write(0x00); // byte2: write command 0x00
rsjawale24 0:c62425b2f286 120 spi.write(reg_val); // byte3: write byte
rsjawale24 0:c62425b2f286 121 csb = 1;
rsjawale24 0:c62425b2f286 122 #endif
rsjawale24 0:c62425b2f286 123 return 0;
rsjawale24 0:c62425b2f286 124 }
rsjawale24 0:c62425b2f286 125
rsjawale24 0:c62425b2f286 126 void getSensorPixels(int pixels[], const uint8_t flip_sensor_pixels)
rsjawale24 0:c62425b2f286 127 {
rsjawale24 0:c62425b2f286 128 unsigned char reg_vals[NUM_SENSOR_PIXELS*2];
rsjawale24 0:c62425b2f286 129 reg_read(0x10, NUM_SENSOR_PIXELS*2, reg_vals);
rsjawale24 0:c62425b2f286 130
rsjawale24 0:c62425b2f286 131 for (int i = 0; i < NUM_SENSOR_PIXELS; i++) {
rsjawale24 0:c62425b2f286 132 pixels[i] = convertTwoUnsignedBytesToInt(reg_vals[2 * i], reg_vals[2 * i + 1]);
rsjawale24 0:c62425b2f286 133 }
rsjawale24 0:c62425b2f286 134
rsjawale24 0:c62425b2f286 135 if (flip_sensor_pixels) {
rsjawale24 0:c62425b2f286 136 for (int i = 0; i < NUM_SENSOR_PIXELS/2; i++) {
rsjawale24 0:c62425b2f286 137 int temp = pixels[i];
rsjawale24 0:c62425b2f286 138 pixels[i] = pixels[NUM_SENSOR_PIXELS-1-i];
rsjawale24 0:c62425b2f286 139 pixels[NUM_SENSOR_PIXELS-1-i] = temp;
rsjawale24 0:c62425b2f286 140 }
rsjawale24 0:c62425b2f286 141 }
rsjawale24 0:c62425b2f286 142 }
rsjawale24 0:c62425b2f286 143
rsjawale24 0:c62425b2f286 144 int convertTwoUnsignedBytesToInt(uint8_t hi_byte, uint8_t lo_byte)
rsjawale24 0:c62425b2f286 145 {
rsjawale24 0:c62425b2f286 146 int intval = (int)(hi_byte << 8 | lo_byte);
rsjawale24 0:c62425b2f286 147 // Convert unsigned to 2's complement
rsjawale24 0:c62425b2f286 148 if ((1 << 15) < intval)
rsjawale24 0:c62425b2f286 149 intval -= (1 << 16);
rsjawale24 0:c62425b2f286 150 return intval;
rsjawale24 0:c62425b2f286 151 }