You are on page 1of 5

/*

* Copyright (C) 2015 Infineon Technologies AG. All rights reserved.


*
* Infineon Technologies AG (Infineon) is supplying this software for use with
* Infineon's microcontrollers.
* This file can be freely distributed within development tools that are
* supporting such microcontrollers.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
*/

#include <DAVE.h>
#include "xmc_gpio.h"
#include "xmc_scu.h"
#include "xmc_i2c.h"

#define TICKS_PER_SECOND 1000


#define TICKS_WAIT 500

#define LED1 P0_5


#define LED2 P0_6
#define LED3 P1_2
#define LED4 P1_3
#define LED5 P1_4
#define LED6 P1_5

#define SENSOR_ADDRESS 0x80

XMC_SCU_CLOCK_CONFIG_t clock_config =
{
.pclk_src = XMC_SCU_CLOCK_PCLKSRC_DOUBLE_MCLK, /*PCLK = 2*MCLK*/
.rtc_src = XMC_SCU_CLOCK_RTCCLKSRC_DCO2,
.fdiv = 0, /**< Fractional divider */
.idiv = 4, /**MCLK = 8MHz */
};

XMC_GPIO_CONFIG_t gpio_output_config =
{
.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL,
.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH,
};

XMC_GPIO_CONFIG_t gpio_scl_config =
{
.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT6,
.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH,
};

XMC_GPIO_CONFIG_t gpio_sda_config =
{
.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT7,
.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH,
};
void SysTick_Handler(void)
{
static uint32_t ticks = 0;

ticks++;
if (ticks == TICKS_WAIT)
{
//XMC_GPIO_ToggleOutput(LED1);
//XMC_GPIO_ToggleOutput(LED2);
//XMC_GPIO_ToggleOutput(LED3);
//XMC_GPIO_ToggleOutput(LED4);
//XMC_GPIO_ToggleOutput(LED5);
//XMC_GPIO_ToggleOutput(LED6);
ticks = 0;
}
}

///// configurare canal I2C

XMC_USIC_CH_t *i2c_channel = XMC_I2C0_CH0;

XMC_I2C_CH_CONFIG_t i2c_config = {
.baudrate = 100000//,
//.address = 0x40
};

int main(void)
{
/* Ensure clock frequency is set at 8MHz (MCLK) */
XMC_SCU_CLOCK_Init(&clock_config);

XMC_GPIO_Init(P0_7, &gpio_scl_config);
XMC_GPIO_Init(P1_0, &gpio_sda_config);

/*configure i2c channel*/


//start the Master of the I2C communication.
XMC_I2C_CH_Init(i2c_channel, &i2c_config);
//select the inputs from the multiplexer of USIC input stage for both pins
XMC_I2C_CH_SetInputSource(i2c_channel, XMC_I2C_CH_INPUT_SDA ,
USIC0_C0_DX0_P1_0);
XMC_I2C_CH_SetInputSource(i2c_channel, XMC_I2C_CH_INPUT_SCL ,
USIC0_C0_DX1_P0_7);
XMC_I2C_CH_Start(i2c_channel);

// start the Master of the I2C communication.


//XMC_I2C_CH_MasterStart(i2c_channel, SENSOR_ADDRESS, XMC_I2C_CH_CMD_WRITE);
XMC_I2C_CH_MasterStart(i2c_channel, SENSOR_ADDRESS, XMC_I2C_CH_CMD_WRITE);
while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED)== 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel, XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED);

XMC_I2C_CH_MasterTransmit(i2c_channel, 0xe5); // rh read hold mode


while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel, XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED);

XMC_I2C_CH_MasterRepeatedStart(i2c_channel, SENSOR_ADDRESS,
XMC_I2C_CH_CMD_READ);
while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED)== 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel, XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED);

// MSB
XMC_I2C_CH_MasterReceiveAck(i2c_channel);
while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
(XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION)) == 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel,
XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION);

volatile uint8_t received_data[3];


received_data[0] = XMC_I2C_CH_GetReceivedData(i2c_channel);

// LSB + status
XMC_I2C_CH_MasterReceiveAck(i2c_channel);
while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
(XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION)) == 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel,
XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION);

received_data[1] = XMC_I2C_CH_GetReceivedData(i2c_channel);

// Checksum
XMC_I2C_CH_MasterReceiveNack(i2c_channel);
while((XMC_I2C_CH_GetStatusFlag(i2c_channel) &
(XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION)) == 0U)
{}
XMC_I2C_CH_ClearStatusFlag(i2c_channel,
XMC_I2C_CH_STATUS_FLAG_RECEIVE_INDICATION |
XMC_I2C_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION);

received_data[2] = XMC_I2C_CH_GetReceivedData(i2c_channel);

XMC_I2C_CH_MasterStop(i2c_channel);

/*volatile uint16_t temp = received_data[0];


temp <<= 4;
temp |= (received_data[1] >> 4); */

volatile uint16_t temp = received_data[0];


temp <<= 8;
temp |= (received_data[1] & 0xfc);

//
/* Initialise P0.0 as an output pin */
XMC_GPIO_Init(LED1, &gpio_output_config);
XMC_GPIO_Init(LED2, &gpio_output_config);
XMC_GPIO_Init(LED3, &gpio_output_config);
XMC_GPIO_Init(LED4, &gpio_output_config);
XMC_GPIO_Init(LED5, &gpio_output_config);
XMC_GPIO_Init(LED6, &gpio_output_config);

/* System timer configuration */


SysTick_Config(SystemCoreClock / TICKS_PER_SECOND);
while(1U)
{

if (temp > 28000 )


{
int i;
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_0);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_1);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_2);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_3);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_4);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_5);

for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_0);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_0);
for(i=0;i<0x3FFFF;++i);

DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_1);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_1);
for(i=0;i<0x3FFFF;++i);

DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_2);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_2);
for(i=0;i<0x3FFFF;++i);

DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_3);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_3);
for(i=0;i<0x3FFFF;++i);

DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_4);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_4);
for(i=0;i<0x3FFFF;++i);

DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_5);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_5);
for(i=0;i<0x3FFFF;++i);

}
else
{
int i;
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_0);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_5);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputLow (&DIGITAL_IO_5);
for(i=0;i<0x3FFFF;++i);
DIGITAL_IO_SetOutputHigh (&DIGITAL_IO_0);
for(i=0;i<0x3FFFF;++i);
}
}
}

You might also like