Jakub Tomanek / Mbed 2 deprecated TPS92520_TEST_v2

Dependencies:   mbed

Committer:
pinnarelo
Date:
Mon Dec 10 09:19:37 2018 +0000
Revision:
7:a52c300451ed
TPS92520

Who changed what in which revision?

UserRevisionLine numberNew 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 }