Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TPS92520/TPS92520.cpp@7:a52c300451ed, 2018-12-10 (annotated)
- Committer:
- pinnarelo
- Date:
- Mon Dec 10 09:19:37 2018 +0000
- Revision:
- 7:a52c300451ed
TPS92520
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| pinnarelo | 7:a52c300451ed | 1 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 2 | * @file TPS92520.c |
| pinnarelo | 7:a52c300451ed | 3 | * @brief TPS92520 implementation file. |
| pinnarelo | 7:a52c300451ed | 4 | * @devices TPS92520-Q1 |
| pinnarelo | 7:a52c300451ed | 5 | * |
| pinnarelo | 7:a52c300451ed | 6 | ******************************************************************************** |
| pinnarelo | 7:a52c300451ed | 7 | * Copyright 2018(c) Automotive Lighting |
| pinnarelo | 7:a52c300451ed | 8 | * |
| pinnarelo | 7:a52c300451ed | 9 | * All rights reserved. |
| pinnarelo | 7:a52c300451ed | 10 | * |
| pinnarelo | 7:a52c300451ed | 11 | * Redistribution and use in source and binary forms, with or without modification, |
| pinnarelo | 7:a52c300451ed | 12 | * are permitted provided that the following conditions are met: |
| pinnarelo | 7:a52c300451ed | 13 | * - Redistributions of source code must retain the above copyright |
| pinnarelo | 7:a52c300451ed | 14 | * notice, this list of conditions and the following disclaimer. |
| pinnarelo | 7:a52c300451ed | 15 | * - Redistributions in binary form must reproduce the above copyright |
| pinnarelo | 7:a52c300451ed | 16 | * notice, this list of conditions and the following disclaimer in |
| pinnarelo | 7:a52c300451ed | 17 | * the documentation and/or other materials provided with the |
| pinnarelo | 7:a52c300451ed | 18 | * distribution. |
| pinnarelo | 7:a52c300451ed | 19 | * - Neither the name of Automotive Lighting nor the names of its |
| pinnarelo | 7:a52c300451ed | 20 | * contributors may be used to endorse or promote products derived |
| pinnarelo | 7:a52c300451ed | 21 | * from this software without specific prior written permission. |
| pinnarelo | 7:a52c300451ed | 22 | * - The use of this software may or may not infringe the patent rights |
| pinnarelo | 7:a52c300451ed | 23 | * of one or more patent holders. This license does not release you |
| pinnarelo | 7:a52c300451ed | 24 | * from the requirement that you obtain separate licenses from these |
| pinnarelo | 7:a52c300451ed | 25 | * patent holders to use this software. |
| pinnarelo | 7:a52c300451ed | 26 | * - Use of the software either in source or binary form, must be run |
| pinnarelo | 7:a52c300451ed | 27 | * on or directly connected to an Automotive Lighting component. |
| pinnarelo | 7:a52c300451ed | 28 | * |
| pinnarelo | 7:a52c300451ed | 29 | * THIS SOFTWARE IS PROVIDED BY AUTOMOTIVE LIGHTING "AS IS" AND ANY EXPRESS OR |
| pinnarelo | 7:a52c300451ed | 30 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, |
| pinnarelo | 7:a52c300451ed | 31 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| pinnarelo | 7:a52c300451ed | 32 | * IN NO EVENT SHALL AUTOMOTIVE LIGHTING BE LIABLE FOR ANY DIRECT, INDIRECT, |
| pinnarelo | 7:a52c300451ed | 33 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| pinnarelo | 7:a52c300451ed | 34 | * INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| pinnarelo | 7:a52c300451ed | 35 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| pinnarelo | 7:a52c300451ed | 36 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| pinnarelo | 7:a52c300451ed | 37 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| pinnarelo | 7:a52c300451ed | 38 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| pinnarelo | 7:a52c300451ed | 39 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 40 | |
| pinnarelo | 7:a52c300451ed | 41 | /******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 42 | /***************************** Include Files **********************************/ |
| pinnarelo | 7:a52c300451ed | 43 | /******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 44 | #include "mbed.h" |
| pinnarelo | 7:a52c300451ed | 45 | #include "TPS92520.h" |
| pinnarelo | 7:a52c300451ed | 46 | |
| pinnarelo | 7:a52c300451ed | 47 | |
| pinnarelo | 7:a52c300451ed | 48 | /* Error codes */ |
| pinnarelo | 7:a52c300451ed | 49 | #define INVALID_VAL -1 /* Invalid argument */ |
| pinnarelo | 7:a52c300451ed | 50 | #define COMM_ERR -2 /* Communication error on receive */ |
| pinnarelo | 7:a52c300451ed | 51 | #define TIMEOUT -3 /* A timeout has occured */ |
| pinnarelo | 7:a52c300451ed | 52 | |
| pinnarelo | 7:a52c300451ed | 53 | /* SPI CLK Frequency */ |
| pinnarelo | 7:a52c300451ed | 54 | #if not definated |
| pinnarelo | 7:a52c300451ed | 55 | #define SPI_CLK 100000 |
| pinnarelo | 7:a52c300451ed | 56 | #endif |
| pinnarelo | 7:a52c300451ed | 57 | |
| pinnarelo | 7:a52c300451ed | 58 | TPS92520::TPS92520(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName pwr_en) : my_spi(mosi, miso, sclk), my_pin( cs), pwr_en_pin(pwr_en) { } |
| pinnarelo | 7:a52c300451ed | 59 | |
| pinnarelo | 7:a52c300451ed | 60 | TPS92520::~TPS92520() { } |
| pinnarelo | 7:a52c300451ed | 61 | |
| pinnarelo | 7:a52c300451ed | 62 | |
| pinnarelo | 7:a52c300451ed | 63 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 64 | * @brief Reads the junction temperature |
| pinnarelo | 7:a52c300451ed | 65 | * |
| pinnarelo | 7:a52c300451ed | 66 | * @return pointer to string message. |
| pinnarelo | 7:a52c300451ed | 67 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 68 | char* TPS92520::temp(void) { |
| pinnarelo | 7:a52c300451ed | 69 | int ret; |
| pinnarelo | 7:a52c300451ed | 70 | int low,high = 0; |
| pinnarelo | 7:a52c300451ed | 71 | static char buffer[20]; |
| pinnarelo | 7:a52c300451ed | 72 | sprintf(buffer, "\0"); |
| pinnarelo | 7:a52c300451ed | 73 | |
| pinnarelo | 7:a52c300451ed | 74 | /* TEMPL Register */ |
| pinnarelo | 7:a52c300451ed | 75 | ret = readRegs(TEMPL,&low); |
| pinnarelo | 7:a52c300451ed | 76 | if(ret<0) { |
| pinnarelo | 7:a52c300451ed | 77 | sprintf(buffer, "COMM ERROR\n\r"); |
| pinnarelo | 7:a52c300451ed | 78 | return buffer; } |
| pinnarelo | 7:a52c300451ed | 79 | low = low & 0x0003; |
| pinnarelo | 7:a52c300451ed | 80 | |
| pinnarelo | 7:a52c300451ed | 81 | /* TEMPH Register */ |
| pinnarelo | 7:a52c300451ed | 82 | ret = readRegs(TEMPH,&high); |
| pinnarelo | 7:a52c300451ed | 83 | if(ret<0) { |
| pinnarelo | 7:a52c300451ed | 84 | sprintf(buffer, "COMM ERROR\n\r"); |
| pinnarelo | 7:a52c300451ed | 85 | return buffer; } |
| pinnarelo | 7:a52c300451ed | 86 | high = high & 0x00FF; |
| pinnarelo | 7:a52c300451ed | 87 | |
| pinnarelo | 7:a52c300451ed | 88 | high = high << 2; |
| pinnarelo | 7:a52c300451ed | 89 | high = high + low; |
| pinnarelo | 7:a52c300451ed | 90 | |
| pinnarelo | 7:a52c300451ed | 91 | float temp = 0.7168*high-274.51; |
| pinnarelo | 7:a52c300451ed | 92 | sprintf(buffer, "Temp Junction: %0.1f\r\n", temp); |
| pinnarelo | 7:a52c300451ed | 93 | |
| pinnarelo | 7:a52c300451ed | 94 | return buffer; |
| pinnarelo | 7:a52c300451ed | 95 | } |
| pinnarelo | 7:a52c300451ed | 96 | |
| pinnarelo | 7:a52c300451ed | 97 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 98 | * @brief Reads value from all status registers and create message with all |
| pinnarelo | 7:a52c300451ed | 99 | * errors |
| pinnarelo | 7:a52c300451ed | 100 | * |
| pinnarelo | 7:a52c300451ed | 101 | * @return pointer to string message. |
| pinnarelo | 7:a52c300451ed | 102 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 103 | char* TPS92520::status(void) { |
| pinnarelo | 7:a52c300451ed | 104 | int ret; |
| pinnarelo | 7:a52c300451ed | 105 | int raw_data,c = 0; |
| pinnarelo | 7:a52c300451ed | 106 | static char buffer[200]; |
| pinnarelo | 7:a52c300451ed | 107 | sprintf(buffer, "\0"); |
| pinnarelo | 7:a52c300451ed | 108 | |
| pinnarelo | 7:a52c300451ed | 109 | char *reports1[8] = {"CH2LSILIM", "CH2HSILIM", "CH2SHORT", "CH2COMPOV", |
| pinnarelo | 7:a52c300451ed | 110 | "CH1LSILIM", "CH1HSILIM", "CH1SHORT", "CH1COMPOV"}; |
| pinnarelo | 7:a52c300451ed | 111 | |
| pinnarelo | 7:a52c300451ed | 112 | char *reports2[6] = {"CH2TP", "CH2BSTUV", "CH2TOFFMIN", |
| pinnarelo | 7:a52c300451ed | 113 | "CH1TP", "CH1BSTUV", "CH1TOFFMIN"}; |
| pinnarelo | 7:a52c300451ed | 114 | |
| pinnarelo | 7:a52c300451ed | 115 | char *reports3[7] = {"V5AUV", "Watchdog Expired", "Watchdog Expired", |
| pinnarelo | 7:a52c300451ed | 116 | "TW", "PC", "CH2STATUS","CH1STATUS"}; |
| pinnarelo | 7:a52c300451ed | 117 | |
| pinnarelo | 7:a52c300451ed | 118 | readRegs(STATUS3,&raw_data); |
| pinnarelo | 7:a52c300451ed | 119 | |
| pinnarelo | 7:a52c300451ed | 120 | /* STATUS 1 Register */ |
| pinnarelo | 7:a52c300451ed | 121 | ret = readRegs(STATUS1,&raw_data); |
| pinnarelo | 7:a52c300451ed | 122 | if(ret<0) { |
| pinnarelo | 7:a52c300451ed | 123 | sprintf(buffer, "COMM ERROR\n\r"); |
| pinnarelo | 7:a52c300451ed | 124 | return buffer; } |
| pinnarelo | 7:a52c300451ed | 125 | raw_data = raw_data & 0x00FF; |
| pinnarelo | 7:a52c300451ed | 126 | for(int i = 0; i<8; i++) { |
| pinnarelo | 7:a52c300451ed | 127 | c = raw_data & 1 <<i; |
| pinnarelo | 7:a52c300451ed | 128 | if(c>0) { |
| pinnarelo | 7:a52c300451ed | 129 | strcat(buffer, reports1[7-i]); |
| pinnarelo | 7:a52c300451ed | 130 | strcat(buffer, "\r\n"); |
| pinnarelo | 7:a52c300451ed | 131 | } |
| pinnarelo | 7:a52c300451ed | 132 | } |
| pinnarelo | 7:a52c300451ed | 133 | |
| pinnarelo | 7:a52c300451ed | 134 | /* STATUS 2 Register */ |
| pinnarelo | 7:a52c300451ed | 135 | ret = readRegs(STATUS2,&raw_data); |
| pinnarelo | 7:a52c300451ed | 136 | if(ret<0) { |
| pinnarelo | 7:a52c300451ed | 137 | sprintf(buffer, "COMM ERROR\n\r"); |
| pinnarelo | 7:a52c300451ed | 138 | return buffer; } |
| pinnarelo | 7:a52c300451ed | 139 | raw_data = raw_data & 0x00FF; |
| pinnarelo | 7:a52c300451ed | 140 | for(int i = 0; i<6; i++) { |
| pinnarelo | 7:a52c300451ed | 141 | c = raw_data & 1 <<i; |
| pinnarelo | 7:a52c300451ed | 142 | if(c>0) { |
| pinnarelo | 7:a52c300451ed | 143 | strcat(buffer, reports2[5-i]); |
| pinnarelo | 7:a52c300451ed | 144 | strcat(buffer, "\r\n"); |
| pinnarelo | 7:a52c300451ed | 145 | } |
| pinnarelo | 7:a52c300451ed | 146 | } |
| pinnarelo | 7:a52c300451ed | 147 | |
| pinnarelo | 7:a52c300451ed | 148 | /* STATUS 3 Register */ |
| pinnarelo | 7:a52c300451ed | 149 | ret = readRegs(STATUS3,&raw_data); |
| pinnarelo | 7:a52c300451ed | 150 | if(ret<0) { |
| pinnarelo | 7:a52c300451ed | 151 | sprintf(buffer, "COMM ERROR\n\r"); |
| pinnarelo | 7:a52c300451ed | 152 | return buffer; } |
| pinnarelo | 7:a52c300451ed | 153 | raw_data = raw_data & 0x00FF; |
| pinnarelo | 7:a52c300451ed | 154 | for(int i = 0; i<7; i++) { |
| pinnarelo | 7:a52c300451ed | 155 | c = raw_data & 1 <<i; |
| pinnarelo | 7:a52c300451ed | 156 | if(c>0) { |
| pinnarelo | 7:a52c300451ed | 157 | strcat(buffer, reports3[6-i]); |
| pinnarelo | 7:a52c300451ed | 158 | strcat(buffer, "\r\n"); |
| pinnarelo | 7:a52c300451ed | 159 | } |
| pinnarelo | 7:a52c300451ed | 160 | } |
| pinnarelo | 7:a52c300451ed | 161 | |
| pinnarelo | 7:a52c300451ed | 162 | if(buffer[0] == '\0') sprintf(buffer, "OK\r\n"); |
| pinnarelo | 7:a52c300451ed | 163 | |
| pinnarelo | 7:a52c300451ed | 164 | return buffer; |
| pinnarelo | 7:a52c300451ed | 165 | } |
| pinnarelo | 7:a52c300451ed | 166 | |
| pinnarelo | 7:a52c300451ed | 167 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 168 | * @brief Init SPI periphery |
| pinnarelo | 7:a52c300451ed | 169 | * |
| pinnarelo | 7:a52c300451ed | 170 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 171 | void TPS92520::init(void) { |
| pinnarelo | 7:a52c300451ed | 172 | // Setup the spi for 16 bit data, Mode 0 CLK polarity 0, Phase 0 |
| pinnarelo | 7:a52c300451ed | 173 | my_spi.format(16,0); |
| pinnarelo | 7:a52c300451ed | 174 | my_spi.frequency(SPI_CLK); |
| pinnarelo | 7:a52c300451ed | 175 | // Enable 5VA PWR supply |
| pinnarelo | 7:a52c300451ed | 176 | pwr_en_pin = 1; |
| pinnarelo | 7:a52c300451ed | 177 | |
| pinnarelo | 7:a52c300451ed | 178 | int data; |
| pinnarelo | 7:a52c300451ed | 179 | /* Check STATUS3 Register */ |
| pinnarelo | 7:a52c300451ed | 180 | readRegs(STATUS3,&data); |
| pinnarelo | 7:a52c300451ed | 181 | |
| pinnarelo | 7:a52c300451ed | 182 | |
| pinnarelo | 7:a52c300451ed | 183 | } |
| pinnarelo | 7:a52c300451ed | 184 | |
| pinnarelo | 7:a52c300451ed | 185 | |
| pinnarelo | 7:a52c300451ed | 186 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 187 | * @brief Read register value. |
| pinnarelo | 7:a52c300451ed | 188 | * |
| pinnarelo | 7:a52c300451ed | 189 | * @param addr - The address of the register. |
| pinnarelo | 7:a52c300451ed | 190 | * @param pData - Pointer to the data which hold readed register data |
| pinnarelo | 7:a52c300451ed | 191 | * |
| pinnarelo | 7:a52c300451ed | 192 | * @return Returns 0 for success or negative error code. |
| pinnarelo | 7:a52c300451ed | 193 | * |
| pinnarelo | 7:a52c300451ed | 194 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 195 | int TPS92520::readRegs(int addr, int *pData) { |
| pinnarelo | 7:a52c300451ed | 196 | uint8_t CMD = 0; |
| pinnarelo | 7:a52c300451ed | 197 | uint16_t frame = 0; |
| pinnarelo | 7:a52c300451ed | 198 | |
| pinnarelo | 7:a52c300451ed | 199 | frame = CMD<<15 | addr<<9 | 0x00; |
| pinnarelo | 7:a52c300451ed | 200 | frame = frame | parity(frame)<<8; |
| pinnarelo | 7:a52c300451ed | 201 | |
| pinnarelo | 7:a52c300451ed | 202 | /* First Frame */ |
| pinnarelo | 7:a52c300451ed | 203 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 204 | my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 205 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 206 | wait_us(10); |
| pinnarelo | 7:a52c300451ed | 207 | |
| pinnarelo | 7:a52c300451ed | 208 | /* Second Frame */ |
| pinnarelo | 7:a52c300451ed | 209 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 210 | uint16_t rx_buffer = my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 211 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 212 | |
| pinnarelo | 7:a52c300451ed | 213 | /* Response is valid in the second frame @ Datasheet */ |
| pinnarelo | 7:a52c300451ed | 214 | *pData = rx_buffer; |
| pinnarelo | 7:a52c300451ed | 215 | |
| pinnarelo | 7:a52c300451ed | 216 | if(rx_buffer & SPI_ERROR == TRUE) return COMM_ERR; |
| pinnarelo | 7:a52c300451ed | 217 | |
| pinnarelo | 7:a52c300451ed | 218 | if((rx_buffer & 0x7C00)>>10 != 24) return COMM_ERR; |
| pinnarelo | 7:a52c300451ed | 219 | |
| pinnarelo | 7:a52c300451ed | 220 | return 0; |
| pinnarelo | 7:a52c300451ed | 221 | |
| pinnarelo | 7:a52c300451ed | 222 | } |
| pinnarelo | 7:a52c300451ed | 223 | |
| pinnarelo | 7:a52c300451ed | 224 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 225 | * @brief Write register value. |
| pinnarelo | 7:a52c300451ed | 226 | * |
| pinnarelo | 7:a52c300451ed | 227 | * @param addr - The address of the register. |
| pinnarelo | 7:a52c300451ed | 228 | * @param data - The data to be writen. |
| pinnarelo | 7:a52c300451ed | 229 | * @param response - Pointer to the data which hold writen register data |
| pinnarelo | 7:a52c300451ed | 230 | * |
| pinnarelo | 7:a52c300451ed | 231 | * @return Returns 0 for success or negative error code. |
| pinnarelo | 7:a52c300451ed | 232 | * |
| pinnarelo | 7:a52c300451ed | 233 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 234 | int TPS92520::writeRegs(int addr, int data, int *response) { |
| pinnarelo | 7:a52c300451ed | 235 | uint8_t CMD = 1; |
| pinnarelo | 7:a52c300451ed | 236 | uint16_t frame = 0; |
| pinnarelo | 7:a52c300451ed | 237 | |
| pinnarelo | 7:a52c300451ed | 238 | frame = CMD<<15 | addr<<9 | data; |
| pinnarelo | 7:a52c300451ed | 239 | frame = frame | parity(frame)<<8; |
| pinnarelo | 7:a52c300451ed | 240 | |
| pinnarelo | 7:a52c300451ed | 241 | /* First Frame */ |
| pinnarelo | 7:a52c300451ed | 242 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 243 | my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 244 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 245 | wait_us(10); |
| pinnarelo | 7:a52c300451ed | 246 | |
| pinnarelo | 7:a52c300451ed | 247 | /* Second Frame */ |
| pinnarelo | 7:a52c300451ed | 248 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 249 | uint16_t rx_buffer = my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 250 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 251 | |
| pinnarelo | 7:a52c300451ed | 252 | /* Response is valid in the second frame @ Datasheet */ |
| pinnarelo | 7:a52c300451ed | 253 | *response = rx_buffer; |
| pinnarelo | 7:a52c300451ed | 254 | |
| pinnarelo | 7:a52c300451ed | 255 | if(rx_buffer & SPI_ERROR == TRUE) return COMM_ERR; |
| pinnarelo | 7:a52c300451ed | 256 | |
| pinnarelo | 7:a52c300451ed | 257 | if((rx_buffer & 0x00FF) != data) return COMM_ERR; |
| pinnarelo | 7:a52c300451ed | 258 | |
| pinnarelo | 7:a52c300451ed | 259 | if((rx_buffer & 0x3F00)>>8 != addr) return COMM_ERR; |
| pinnarelo | 7:a52c300451ed | 260 | |
| pinnarelo | 7:a52c300451ed | 261 | return 0; |
| pinnarelo | 7:a52c300451ed | 262 | |
| pinnarelo | 7:a52c300451ed | 263 | } |
| pinnarelo | 7:a52c300451ed | 264 | |
| pinnarelo | 7:a52c300451ed | 265 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 266 | * @brief Reset device. This function clear all writeable register to their |
| pinnarelo | 7:a52c300451ed | 267 | * default value. |
| pinnarelo | 7:a52c300451ed | 268 | * |
| pinnarelo | 7:a52c300451ed | 269 | * @return Returns 0. |
| pinnarelo | 7:a52c300451ed | 270 | * |
| pinnarelo | 7:a52c300451ed | 271 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 272 | int TPS92520::reset() { |
| pinnarelo | 7:a52c300451ed | 273 | int data; |
| pinnarelo | 7:a52c300451ed | 274 | |
| pinnarelo | 7:a52c300451ed | 275 | // Disable 5VA PWR supply |
| pinnarelo | 7:a52c300451ed | 276 | pwr_en_pin = 0; |
| pinnarelo | 7:a52c300451ed | 277 | wait_ms(350); |
| pinnarelo | 7:a52c300451ed | 278 | |
| pinnarelo | 7:a52c300451ed | 279 | // Enable 5VA PWR supply |
| pinnarelo | 7:a52c300451ed | 280 | pwr_en_pin = 1; |
| pinnarelo | 7:a52c300451ed | 281 | |
| pinnarelo | 7:a52c300451ed | 282 | wait_ms(50); |
| pinnarelo | 7:a52c300451ed | 283 | /* Check STATUS3 Register */ |
| pinnarelo | 7:a52c300451ed | 284 | readRegs(STATUS3,&data); |
| pinnarelo | 7:a52c300451ed | 285 | |
| pinnarelo | 7:a52c300451ed | 286 | return 0; |
| pinnarelo | 7:a52c300451ed | 287 | } |
| pinnarelo | 7:a52c300451ed | 288 | |
| pinnarelo | 7:a52c300451ed | 289 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 290 | * @brief Calculate parity bit. |
| pinnarelo | 7:a52c300451ed | 291 | * |
| pinnarelo | 7:a52c300451ed | 292 | * @param frame - The frame for which we want to calculate parity bit. |
| pinnarelo | 7:a52c300451ed | 293 | * |
| pinnarelo | 7:a52c300451ed | 294 | * @return Returns parity bit value. |
| pinnarelo | 7:a52c300451ed | 295 | * |
| pinnarelo | 7:a52c300451ed | 296 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 297 | int TPS92520::parity(uint16_t frame) { |
| pinnarelo | 7:a52c300451ed | 298 | uint8_t XNOR = 0; |
| pinnarelo | 7:a52c300451ed | 299 | |
| pinnarelo | 7:a52c300451ed | 300 | for(int i = 15; i >= 0; i--){ |
| pinnarelo | 7:a52c300451ed | 301 | if((frame & (1 << i)) != 0){ |
| pinnarelo | 7:a52c300451ed | 302 | XNOR = !(XNOR^1); |
| pinnarelo | 7:a52c300451ed | 303 | if(i == 15){ |
| pinnarelo | 7:a52c300451ed | 304 | XNOR = 1; } |
| pinnarelo | 7:a52c300451ed | 305 | } |
| pinnarelo | 7:a52c300451ed | 306 | else{ |
| pinnarelo | 7:a52c300451ed | 307 | XNOR = !(XNOR^0); |
| pinnarelo | 7:a52c300451ed | 308 | if(i == 15){ |
| pinnarelo | 7:a52c300451ed | 309 | XNOR = 0; } |
| pinnarelo | 7:a52c300451ed | 310 | } |
| pinnarelo | 7:a52c300451ed | 311 | } |
| pinnarelo | 7:a52c300451ed | 312 | return XNOR; |
| pinnarelo | 7:a52c300451ed | 313 | } |
| pinnarelo | 7:a52c300451ed | 314 | |
| pinnarelo | 7:a52c300451ed | 315 | /***************************************************************************//** |
| pinnarelo | 7:a52c300451ed | 316 | * @brief Set the PWM duty. |
| pinnarelo | 7:a52c300451ed | 317 | * |
| pinnarelo | 7:a52c300451ed | 318 | * @param |
| pinnarelo | 7:a52c300451ed | 319 | * |
| pinnarelo | 7:a52c300451ed | 320 | * @return |
| pinnarelo | 7:a52c300451ed | 321 | * |
| pinnarelo | 7:a52c300451ed | 322 | *******************************************************************************/ |
| pinnarelo | 7:a52c300451ed | 323 | int TPS92520::setPWMduty(uint8_t channel,uint16_t duty) { |
| pinnarelo | 7:a52c300451ed | 324 | uint8_t CMD = 1; |
| pinnarelo | 7:a52c300451ed | 325 | |
| pinnarelo | 7:a52c300451ed | 326 | if(duty> 1023 == 1) return INVALID_VAL; |
| pinnarelo | 7:a52c300451ed | 327 | |
| pinnarelo | 7:a52c300451ed | 328 | uint16_t data = (uint16_t)duty/100*1023; |
| pinnarelo | 7:a52c300451ed | 329 | uint16_t frame = 0; |
| pinnarelo | 7:a52c300451ed | 330 | |
| pinnarelo | 7:a52c300451ed | 331 | // First SPI frame |
| pinnarelo | 7:a52c300451ed | 332 | uint8_t addr = CH1PWMH; |
| pinnarelo | 7:a52c300451ed | 333 | if (channel == 2) addr +=2; |
| pinnarelo | 7:a52c300451ed | 334 | |
| pinnarelo | 7:a52c300451ed | 335 | frame = CMD<<15 | addr<<9 | data&0x0300>>8; |
| pinnarelo | 7:a52c300451ed | 336 | frame = frame | parity(frame)<<8; |
| pinnarelo | 7:a52c300451ed | 337 | |
| pinnarelo | 7:a52c300451ed | 338 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 339 | uint16_t rx_buffer = my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 340 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 341 | |
| pinnarelo | 7:a52c300451ed | 342 | // Second SPI frame |
| pinnarelo | 7:a52c300451ed | 343 | addr = CH1PWML; |
| pinnarelo | 7:a52c300451ed | 344 | if (channel == 2) addr +=2; |
| pinnarelo | 7:a52c300451ed | 345 | |
| pinnarelo | 7:a52c300451ed | 346 | frame = CMD<<15 | addr<<9 | data&0x00FF; |
| pinnarelo | 7:a52c300451ed | 347 | frame = frame | parity(frame)<<8; |
| pinnarelo | 7:a52c300451ed | 348 | |
| pinnarelo | 7:a52c300451ed | 349 | my_pin = 0; |
| pinnarelo | 7:a52c300451ed | 350 | rx_buffer = my_spi.write(frame); |
| pinnarelo | 7:a52c300451ed | 351 | my_pin = 1; |
| pinnarelo | 7:a52c300451ed | 352 | |
| pinnarelo | 7:a52c300451ed | 353 | return 0; |
| pinnarelo | 7:a52c300451ed | 354 | |
| pinnarelo | 7:a52c300451ed | 355 | } |