Merge pull request #253 from JelmerT/feature-z1-tlc59116

TLC59116 I2C led driver for Zolertia Z1
This commit is contained in:
Nicolas Tsiftes 2013-07-23 11:09:02 -07:00
commit 8f5941a4c9
5 changed files with 419 additions and 2 deletions

View file

@ -2,7 +2,7 @@ ifndef TARGET
TARGET=z1
endif
CONTIKI_PROJECT = test-phidgets blink test-adxl345 test-tmp102 test-light-ziglet test-battery test-sht11 test-relay-phidget #test-potent
CONTIKI_PROJECT = test-phidgets blink test-adxl345 test-tmp102 test-light-ziglet test-battery test-sht11 test-relay-phidget test-tlc59116 #test-potent
CONTIKI_SOURCEFILES += sht11.c# potentiometer-sensor.c
APPS=serial-shell

View file

@ -0,0 +1,84 @@
/*
* Copyright (c) 2013, Jelmer Tiete.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* A simple program for testing the TLC59116 I2C led driver.
* All 16 outputs will sequencially light up.
* \author
* Jelmer Tiete, VUB <jelmer@tiete.be>
*/
#include <stdio.h>
#include "contiki.h"
#include "dev/tlc59116.h"
#define BLINK_INTERVAL CLOCK_SECOND/25
/*---------------------------------------------------------------------------*/
PROCESS(tlc59116_process, "Test tlc59116 process");
AUTOSTART_PROCESSES(&tlc59116_process);
/*---------------------------------------------------------------------------*/
/* Main process, setups */
static struct etimer et;
static uint8_t count = 0;
PROCESS_THREAD(tlc59116_process, ev, data)
{
PROCESS_BEGIN();
{
/* Start and setup the led driver with default values, eg outputs on and pwm enabled and 0. */
tlc59116_init();
while(1) {
tlc59116_led(count, 0x00);
tlc59116_led((count + 1) % 16, 0x20);
tlc59116_led((count + 2) % 16, 0x40);
tlc59116_led((count + 3) % 16, 0xFF);
count++;
if(count > 15) {
count = 0;
}
etimer_set(&et, BLINK_INTERVAL);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -17,7 +17,7 @@ ARCH=msp430.c leds.c watchdog.c xmem.c \
checkpoint-arch.c slip.c slip_uart0.c \
z1-phidgets.c sht11.c sht11-sensor.c light-sensor.c \
battery-sensor.c sky-sensors.c tmp102.c temperature-sensor.c light-ziglet.c \
relay-phidget.c
relay-phidget.c tlc59116.c
CONTIKI_TARGET_DIRS = . dev apps net
ifndef CONTIKI_TARGET_MAIN

191
platform/z1/dev/tlc59116.c Normal file
View file

@ -0,0 +1,191 @@
/*
* Copyright (c) 2013, Jelmer Tiete.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* Device drivers for tlc59116 i2c led driver on Zolertia Z1.
* See http://www.ti.com/product/tlc59116 for datasheet.
* \author
* Jelmer Tiete, VUB <jelmer@tiete.be>
*/
#include <stdio.h>
#include "contiki.h"
#include "tlc59116.h"
#include "i2cmaster.h"
/*---------------------------------------------------------------------------*/
/* Write to a register.
* args:
* reg register to write to
* val value to write
*/
void
tlc59116_write_reg(uint8_t reg, uint8_t val)
{
uint8_t tx_buf[] = { reg, val };
i2c_transmitinit(TLC59116_ADDR);
while(i2c_busy());
PRINTFDEBUG("I2C Ready to TX\n");
i2c_transmit_n(2, tx_buf);
while(i2c_busy());
PRINTFDEBUG("WRITE_REG 0x%02X @ reg 0x%02X\n", val, reg);
}
/*---------------------------------------------------------------------------*/
/* Write several registers from a stream.
* args:
* len number of bytes to write
* data pointer to where the data is written from
*
* First byte in stream must be the register address to begin writing to.
* The data is then written from second byte and increasing.
*/
void
tlc59116_write_stream(uint8_t len, uint8_t * data)
{
i2c_transmitinit(TLC59116_ADDR);
while(i2c_busy());
PRINTFDEBUG("I2C Ready to TX(stream)\n");
i2c_transmit_n(len, data); // start tx and send conf reg
while(i2c_busy());
PRINTFDEBUG("WRITE_STR %u B to 0x%02X\n", len, data[0]);
}
/*---------------------------------------------------------------------------*/
/* Read one register.
* args:
* reg what register to read
* returns the value of the read register
*/
uint8_t
tlc59116_read_reg(uint8_t reg)
{
uint8_t retVal = 0;
uint8_t rtx = reg;
PRINTFDEBUG("READ_REG 0x%02X\n", reg);
/* transmit the register to read */
i2c_transmitinit(TLC59116_ADDR);
while(i2c_busy());
i2c_transmit_n(1, &rtx);
while(i2c_busy());
/* receive the data */
i2c_receiveinit(TLC59116_ADDR);
while(i2c_busy());
i2c_receive_n(1, &retVal);
while(i2c_busy());
return retVal;
}
/*---------------------------------------------------------------------------*/
/* Read several registers in a stream.
* args:
* reg what register to start reading from
* len number of bytes to read
* whereto pointer to where the data is saved
*/
void
tlc59116_read_stream(uint8_t reg, uint8_t len, uint8_t * whereto)
{
uint8_t rtx = reg;
PRINTFDEBUG("READ_STR %u B from 0x%02X\n", len, reg);
/* transmit the register to start reading from */
i2c_transmitinit(TLC59116_ADDR);
while(i2c_busy());
i2c_transmit_n(1, &rtx);
while(i2c_busy());
/* receive the data */
i2c_receiveinit(TLC59116_ADDR);
while(i2c_busy());
i2c_receive_n(len, whereto);
while(i2c_busy());
}
/*---------------------------------------------------------------------------*/
/* Set pwm value for individual led. Make sure PWM mode is enabled.
* args:
* led led output -> 0 till 15
* pwm led pwm value
*/
void
tlc59116_led(uint8_t led, uint8_t pwm)
{
if(led < 0 | led > 15) {
PRINTFDEBUG("TLC59116: wrong led value.");
} else {
tlc59116_write_reg(led + TLC59116_PWM0, pwm);
}
}
/*---------------------------------------------------------------------------*/
/* Init the led driver: ports, pins, registers, interrupts (none enabled), I2C,
* default threshold values etc.
*/
void
tlc59116_init(void)
{
/* Set up ports and pins for I2C communication */
i2c_enable();
/* set default register values. */
tlc59116_write_reg(TLC59116_MODE1, TLC59116_MODE1_DEFAULT);
tlc59116_write_reg(TLC59116_MODE2, TLC59116_MODE2_DEFAULT);
/*Set all PWM values to 0x00 (off) */
/*This would maybe be better with a SWRST */
uint8_t tx_buf[] =
{ TLC59116_PWM0_AUTOINCR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
tlc59116_write_stream(17, &tx_buf);
/* set all leds to PWM control */
tlc59116_write_reg(TLC59116_LEDOUT0, TLC59116_LEDOUT_PWM);
tlc59116_write_reg(TLC59116_LEDOUT1, TLC59116_LEDOUT_PWM);
tlc59116_write_reg(TLC59116_LEDOUT2, TLC59116_LEDOUT_PWM);
tlc59116_write_reg(TLC59116_LEDOUT3, TLC59116_LEDOUT_PWM);
}

142
platform/z1/dev/tlc59116.h Normal file
View file

@ -0,0 +1,142 @@
/*
* Copyright (c) 2013, Jelmer Tiete.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* Device drivers header file for TLC59116 i2c led driver on Zolertia Z1.
* See http://www.ti.com/product/tlc59116 for datasheet.
* \author
* Jelmer Tiete, VUB <jelmer@tiete.be>
*/
#ifndef __TLC59116_H__
#define __TLC59116_H__
#include <stdio.h>
#include "dev/i2cmaster.h"
#if 0
#include <stdio.h>
#define PRINTFDEBUG(...) printf(__VA_ARGS__)
#else
#define PRINTFDEBUG(...)
#endif
/* -------------------------------------------------------------------------- */
/* Init the led driver: ports, pins, registers, I2C*/
void tlc59116_init(void);
/* Write to a register.
* args:
* reg register to write to
* val value to write
*/
void tlc59116_write_reg(uint8_t reg, uint8_t val);
/* Write several registers from a stream.
* args:
* len number of bytes to read
* data pointer to where the data is read from
* First byte in stream must be the register address to begin writing to.
* The data is then written from the second byte and increasing. The address byte
* is not included in length len.
*/
void tlc59116_write_stream(uint8_t len, uint8_t * data);
/* Read one register.
* args:
* reg what register to read
* returns the value of the read register
*/
uint8_t tlc59116_read_reg(uint8_t reg);
/* Read several registers in a stream.
* args:
* reg what register to start reading from
* len number of bytes to read
* whereto pointer to where the data is saved
*/
void tlc59116_read_stream(uint8_t reg, uint8_t len, uint8_t * whereto);
/* Set pwm value for individual led
* args:
* led led output -> 0 till 15
* pwm led pwm value
*/
void tlc59116_led(uint8_t led, uint8_t pwm);
/* -------------------------------------------------------------------------- */
/* Application definitions, change if required by application. */
/* Suggested defaults according to the data sheet etc */
#define TLC59116_MODE1_DEFAULT 0x00 // Default (no sub or all call) + OSC on
#define TLC59116_MODE2_DEFAULT 0x00 // Default (output change on stop)
#define TLC59116_LEDOUT_PWM 0xAA // LDRx = 01 -> PWM; 4 leds per reg: 01010101b -> 0xAA
/* -------------------------------------------------------------------------- */
/* Reference definitions, should not be changed */
/* TLC59116 slave address */
#define TLC59116_ADDR 0x60 //7bit adress, 8bit write adress: 0xC0
//address with all address pins pulled to ground
/* TLC59116 registers */
#define TLC59116_MODE1 0x00
#define TLC59116_MODE2 0x01
#define TLC59116_PWM0_AUTOINCR 0xA2 //auto increment address for first pwm register
#define TLC59116_PWM0 0x02
#define TLC59116_PWM1 0x03
#define TLC59116_PWM2 0x04
#define TLC59116_PWM3 0x05
#define TLC59116_PWM4 0x06
#define TLC59116_PWM5 0x07
#define TLC59116_PWM6 0x08
#define TLC59116_PWM7 0x09
#define TLC59116_PWM8 0x0A
#define TLC59116_PWM9 0x0B
#define TLC59116_PWM10 0x0C
#define TLC59116_PWM11 0x0D
#define TLC59116_PWM12 0x0E
#define TLC59116_PWM13 0x0F
#define TLC59116_PWM14 0x10
#define TLC59116_PWM15 0x11
#define TLC59116_GRPPWM 0x12
#define TLC59116_GRPFREQ 0x13
#define TLC59116_LEDOUT0 0x14
#define TLC59116_LEDOUT1 0x15
#define TLC59116_LEDOUT2 0x16
#define TLC59116_LEDOUT3 0x17
/* More registers follow, but not used in this implementation */
/* -------------------------------------------------------------------------- */
#endif /* ifndef __TLC59116_H__ */