0% found this document useful (0 votes)
142 views5 pages

Dsadsasssd

dsadsd
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
142 views5 pages

Dsadsasssd

dsadsd
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 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